15人参与 • 2026-08-05 • Asp.net
做运维的朋友有没有过这样的经历:
有没有一个轻量、简单、开箱即用的方案?
这就是我做 lanmonitor 的初衷——一个只有几 mb 的小工具,就能让你实时掌握内网所有机器的登录动态。
windows 自带的安全日志其实非常强大,4624(登录成功)、4625(登录失败)这些事件 id 记录了所有登录行为。
但问题是:怎么把这些日志实时收集起来?
我对比了几种方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 自己写服务读 eventlog | 简单可控 | 性能差、断点续传麻烦、兼容性差 |
| wmi 远程查询 | 不用装客户端 | 延迟高、不安全、容易断 |
| winlogbeat | 官方出品、性能好、断点续传、稳定可靠 | 需要装客户端 |
最终选择了 winlogbeat——elastic 官方出品的 windows 日志采集器,经过无数生产环境验证,稳定性有保障。
既然用了 winlogbeat,它的输出目标一般是 elasticsearch。但我们只是要个告警,没必要搭一套 elk 吧?
思路一转:能不能直接模拟 elasticsearch 的 bulk api,接收 winlogbeat 的数据?
完全可以!
winlogbeat 发的就是标准的 http post 请求,body 是 ndjson 格式。我们只要用 httplistener 监听端口,解析请求,弹窗告警就行了。
为什么用 c# winforms?
┌─────────────────┐ http /_bulk ┌─────────────────┐
│ 被监控服务器 │ ──────────────────> │ 监控端电脑 │
│ winlogbeat │ ndjson 格式 │ lanmonitor │
│ (采集安全日志) │ │ (弹窗告警) │
└─────────────────┘ └─────────────────┘
原理非常简单:
核心代码其实只有几十行:
private async task listenloop(cancellationtoken token)
{
while (!token.iscancellationrequested && _listener.islistening)
{
var context = await _listener.getcontextasync();
if (path.endswith("/_bulk"))
{
// 解析 ndjson 格式的批量数据
using var reader = new streamreader(context.request.inputstream);
var content = await reader.readtoendasync();
var lines = content.split('\n');
// 第 1 行是 index 元数据,第 2 行是事件数据
for (int i = 0; i < lines.length - 1; i += 2)
{
var eventjson = lines[i + 1];
var evt = jsonserializer.deserialize<winlogbeatevent>(eventjson);
onloginevent?.invoke(evt); // 触发事件,弹窗告警
}
}
// 返回 es 标准响应格式
context.response.statuscode = 200;
var response = "{\"took\":1,\"errors\":false,\"items\":[]}";
await context.response.outputstream.writeasync(encoding.utf8.getbytes(response));
context.response.close();
}
}
就这么简单!winlogbeat 以为数据写入了 elasticsearch,实际上被我们截胡了。
有人登录时,右下角立刻弹出告警窗口:
弹窗支持置顶、闪烁、声音提醒,想忽略都难。
积累了一定数据后,可以按各种维度筛选:
| 筛选维度 | 选项 |
|---|---|
| 关键词 | 主机名 / 用户名 / 来源 ip 模糊搜索 |
| 时间 | 今天 / 昨天 / 近 7 天 / 近 30 天 |
| 事件类型 | 全部 / 登录成功 / 登录失败 |
| 登录类型 | 全部 / rdp / 网络登录 / 其他 |
| 严重程度 | 全部 / 普通 / 警告 / 严重 |
| 读取状态 | 全部 / 未读 / 已读 / 已处理 / 已忽略 |
再也不用去事件查看器里一条条翻了。
企业内网用,安全肯定要考虑:
token 鉴权:支持 x-auth-token 和 authorization bearer 两种格式,没有 token 的请求直接 401 拒绝。
ip 白名单:支持精确 ip、cidr 网段、通配符三种格式,只允许信任的机器推送数据。
两层防护,足够应对一般的内网场景。
下载 winlogbeat(官方免费)
编辑 winlogbeat.yml:
winlogbeat.event_logs:
- name: security
event_id: 4624, 4625 # 只采集登录成功/失败事件
ignore_older: 24h # 忽略 24 小时前的历史
output.elasticsearch:
hosts: ["http://监控端ip:9200"]
headers:
x-auth-token: "你的token"安装服务,启动

现在只做了登录事件监控,但 winlogbeat 能采集的远不止这些:
安全相关:
系统相关:
进阶玩法:
想象空间很大,这只是一个开始。
做这个项目最大的感受是:很多时候,解决问题不需要复杂的方案,简单的工具反而最实用。
技术不在于多复杂,而在于能不能解决问题。
如果你也有类似的需求,不妨试试这个工具。也欢迎提 issue、pr,一起完善它。
以上就是基于c# winforms编写一个日志监控工具的详细内容,更多关于c#日志监控的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论