-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathLogViewerForm.cs
More file actions
128 lines (106 loc) · 3.83 KB
/
LogViewerForm.cs
File metadata and controls
128 lines (106 loc) · 3.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using NLog.Config;
using NLog;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LogViewer
{
public partial class LogViewerForm : Form
{
public LogViewerForm()
{
InitializeComponent();
ListBoxTarget.ListBoxControl = listBoxLogs; // 绑定 ListBox
listBoxLogs.MouseWheel += ListBoxLogs_MouseWheel;
}
private void LogViewerForm_Load(object sender, EventArgs e)
{
var config = new LoggingConfiguration();
var listBoxTarget = new ListBoxTarget()
{
Name = "listbox",
Layout = "${longdate} | ${level:uppercase=true} | ${message}"
};
config.AddTarget(listBoxTarget);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, listBoxTarget);
LogManager.Configuration = config;
var contextMenu = new ContextMenuStrip();
var copyItem = new ToolStripMenuItem("复制");
copyItem.Click += (s, ev) =>
{
if (listBoxLogs.SelectedItem != null)
Clipboard.SetText(listBoxLogs.SelectedItem.ToString());
};
contextMenu.Items.Add(copyItem);
listBoxLogs.ContextMenuStrip = contextMenu;
}
private void btnApplyFilter_Click(object sender, EventArgs e)
{
string keyword = textFilter.Text.ToLower();
string level = comboLevel.SelectedItem.ToString();
listBoxLogs.Items.Clear();
foreach (var log in ListBoxTarget.AllLogs)
{
bool levelMatch = (level == "All") || (log.Level.Name.Equals(level, StringComparison.OrdinalIgnoreCase));
bool keywordMatch = string.IsNullOrEmpty(keyword) || log.FormattedMessage.ToLower().Contains(keyword);
if (levelMatch && keywordMatch)
{
string msg = $"{log.TimeStamp:yyyy-MM-dd HH:mm:ss.fff} {log.Level} {log.FormattedMessage}";
listBoxLogs.Items.Add(msg);
}
}
}
private void btnApplyFilter_Click_1(object sender, EventArgs e)
{
}
private void listBoxLogs_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void LogWinForm_FormClosed(object sender, FormClosedEventArgs e)
{
ListBoxTarget.ListBoxControl = null;
}
private void listBoxLogs_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.C && listBoxLogs.SelectedItem != null)
{
Clipboard.SetText(listBoxLogs.SelectedItem.ToString());
}
}
void CheckAutoScrollStatus()
{
// 检查是否在最底部
int visibleItems = listBoxLogs.ClientSize.Height / listBoxLogs.ItemHeight;
if (listBoxLogs.TopIndex + visibleItems >= listBoxLogs.Items.Count)
{
ListBoxTarget.autoScroll = true; // 滚动条在最底部
}
else
{
ListBoxTarget.autoScroll = false; // 用户往上滚了
}
}
private void ListBoxLogs_MouseWheel(object sender, MouseEventArgs e)
{
CheckAutoScrollStatus();
}
protected override void WndProc(ref Message m)
{
const int WM_VSCROLL = 0x115;
if (m.Msg == WM_VSCROLL && m.HWnd == listBoxLogs.Handle)
{
CheckAutoScrollStatus();
}
base.WndProc(ref m);
}
private void textFilter_TextChanged(object sender, EventArgs e)
{
}
}
}