2个日志高亮显示开源工具(C# & Rust)
00、背景
最近有个需求,实现个具有过滤和突出显示功能的日志查看器。
满足3个前置条件:
1、支持Log4Net,
2、对现有代码无侵入性,
3、C#实现。
在github网上找到这个。
01、sentinel项目结构
项目比较简单,单体的WPF实现。
02、如何使用
日志来源
Sentinel 是一个日志文件查看器,特别是我将其设计为充当 nLog 和 log4net 等网络端点,此外它还非常适合从多个来源捕获日志条目。
日志来源 | 备注 |
Log4Net UdpAppender | Supported |
nLog's nLogViewer | Supported |
Trace Listener | Planned |
Log-File Watcher | Experimental |
Custom, via plug-in | Planned |
MSBuild | Plug-in in source-repo |
命令行使用
有一些命令行选项允许在启动时控制 Sentinel,可用选项包括以下内容:
- 加载已保存的会话文件
- log4net 网络监听器
命令行选项
如果未指定命令行选项,标准的新建会话向导将在启动时启动。
如果未指定,则默认为端口 9999 和 Udp。
启用 Log4Net 侦听器的情况下启动
sentinel log4net [--port <port-number>]
如果未指定,则默认为端口 9998。
使用上次保存的会话文件启动
sentinel filename.SNTL
Log4Net UdpAppender 配置
要允许 log4net 应用程序将其日志消息传输到 Sentinel,请使用如下所示的配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net"
type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="udp"
type="log4net.Appender.UdpAppender">
<RemoteAddress value="127.0.0.2"/>
<RemotePort value="9999"/>
<layout type="log4net.Layout.XmlLayout"/>
<encoding value="utf-8" />
</appender>
<root>
<appender-ref ref="udp"/>
</root>
</log4net>
</configuration>
显示 log4net 调试信息
如果调整上述配置以启用 {{locationInfo}},则可以看到与消息发出位置相对应的文件、类、方法和行号。仅当源程序在 DEBUG 模式下编译时才会报告其中一些信息(例如 RELEASE 模式会删除此信息)
<layout type="log4net.Layout.XmlLayout">
<locationInfo value="true" />
</layout>
日志Entries
日志文件条目映射以下接口。这是日志文件条目的核心记录,用于填充实时日志视图中的列。请注意,通过使用分类器,可以在接收到新的日志条目时重新排列和/或更改这些字段的内容。
public interface ILogEntry
{
string Classification { get; set; }
DateTime DateTime { get; set; }
string Description { get; set; }
string Source { get; set; }
string System { get; set; }
string Thread { get; set; }
string Type { get; set; }
}
日志条目可以根据特殊服务进行分类、突出显示和过滤:
- 分类器可以更改日志条目的属性
- 高亮可以改变其外观。
- 过滤器可用于抑制匹配条目的显示。
Classifiers 分类器
收到新的日志条目后,将通过注册的分类器对其进行处理。分类器能够在将日志条目传递到 Sentinel 的可视化方面之前重写日志条目。
作为示例,假设以短语“Sleeping for another”开头的传入消息旨在从其提供的类型(例如 DEBUG 或 INFO)切换为其自己的 Timing 类型。ClassifierViewModel 在构造时注册它。请注意,下面的正则表达式还将描述重写为命名捕获描述,有效地去除了前缀“Sleeping for another”——由于重新分类而不再需要的信息。
items.Add(
new DescriptionTypeClassifier("Timing", "Timing")
{
Enabled = true,
Name = "Timing messages",
RegexString = @"^Sleeping for another (?<description>[^$](^$)+)#34;
});
除了对消息进行重新分类之外,分类器机制目前还用于对消息外观进行其他更改。继续上面的示例,使用 {{TypeImageClassifier}} 可以指定用于计时类型条目的图像。
items.Add(
new TypeImageClassifier("Timing", "/Resources/Clock.png")
{
Enabled = true,
Name = "Timing Image",
});
可以在“首选项”对话框中看到分类器。
Highlighters 高亮
可定制和可扩展的高亮,可以在实时预览期间打开和关闭。当前的实现将模式匹配限制为类型和系统字段,尽管这将扩展到所有字段。举个例子说明为什么这很有用,在上面的分类器部分中,添加了一种新类型“Timing”,该类型可以获得自己的突出显示样式。
高亮可以匹配类型和系统字段的内容
- 精确字符串
- Substrings 子串
- 正则表达式
如果匹配字段设置为键入指定为“计时”的匹配字符串,则可以添加新的计时高亮。用户定义的突出显示会自动添加到工具栏,以便于启用和禁用突出显示。
高亮遵循先到先得的原则。因此,“首选项”对话框的高亮部分中的条目顺序非常重要。如果高亮位于 FATAL 之前并获得匹配,则可以隐藏 FATAL 消息的突出显示。
Filters 过滤器
过滤器非常类似于高亮,只不过它们的目的是从显示的值中删除日志条目。过滤器可以在会话期间打开和关闭。过滤器按指定的顺序进行评估,但由于过滤器按照任意匹配=隐藏原则工作,因此评估在第一个匹配处停止,导致条目被隐藏。
Extractors 提取器
提取器是过滤器的反面,日志条目必须与提取器匹配才能可见。
例如,如果您为特定日志记录条件定义提取器并希望快速查看它是否发生以及发生的频率,这可能非常有用。
03、其他类似的开源
Tailspin是用Rust实现的另一个日志文件高亮显示器。
原理类似,都是通过逐行读取日志文件,它能够突出显示数字、特殊字符和关键字等内容,使得日志内容更易于理解和定位。