65.9K
CodeProject 正在变化。 阅读更多。
Home

日志向导 - 让您的日志看起来更漂亮!

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (49投票s)

2016年2月15日

GPL3

17分钟阅读

viewsIcon

60656

downloadIcon

2492

你可以轻松地为日志应用美观格式。让对你重要的信息脱颖而出!

目录

Log Wizard 系列的其他文章

简介, 过滤器, 注释, Windows 事件日志

引言

我创建了 Log Wizard,以使查看日志文件(以及日志)尽可能地轻松。事实上,我的重点是让查看日志变得 愉快

当然,你才是评判者 - 让我知道你的想法,也请告诉我如何进一步改进。

请注意,我在 github 上托管了该项目,并且我努力做到每 3-4 周发布一个新版本。

从 1.8 版本开始,我为其添加了美观格式,以帮助你轻松专注于与你相关的内容。或者换句话说,让相关信息脱颖而出。

以下是如何让相关信息脱颖而出

  • 隐藏与你手头任务无关的行。或者换句话说,过滤器。我在这里 讨论过它们
  • 为你关心的信息着色,使其脱颖而出。
  • 隐藏部分信息,以便一次查看更多信息(换句话说,缩写通常不重要的内容。你随时可以撤销缩写)。
  • 将几个相关项在视觉上分组到类别中。例如,让来自某个线程的所有行都以某种(背景)颜色显示。

对于后三种情况,我添加了列格式化。或者,美观格式 听起来更好;)

一图胜千言

  • 当前选择在第 8813 行
  • 书签在 8727 和 8784
  • 行显示得相当不错,类似于 IntelliJ
  • 注意行的背景是如何交替的,但只是稍微改变,以免伤眼
  • 注意选择区域是如何稍微暗一些,足以让你知道它的位置
  • 时间:我留给你自己去发现;)
  • 级别:第 8697、8854 和 8978 行是警告
  • 数字以红色显示

良好兼容!

使用我将在下面解释的格式化器后,你会注意到一些事情

只要你正确指定它们,它们只会覆盖它们需要覆盖的部分,而其余部分保持不变。例如,一个 过滤器 可以指定一行是蓝色的。在该行中,“数字”格式化器将所有数字显示为红色,而该行的其余部分保持蓝色(如最初所示)。

美观格式

那么,让我们开始吧!列格式化 的目的是让重要内容脱颖而出。脱颖而出,并且看起来很美观!

来决定什么内容是重要的!Log Wizard 提供了一些默认设置,但你可以对其进行配置,直到满足你的需求为止。

要编辑格式,请右键单击任何列标题。你会注意到最后一个选项

选择它,你就可以编辑格式化器了。

我让它变得简单

  • 左上角是格式化器。我将在下面解释语法
  • 右上角有一些帮助
  • 在下方的窗格中,你将看到正在编辑内容的即时预览。你进行的任何更改:添加/删除/修改格式行,你都会立即看到效果。如果任何格式行有错误,你会在下方看到错误以红色显示。
  • 应用于当前视图 - 如果你有多个视图,可以选择仅将此格式应用于当前视图。

格式化语法

我的重点是让你用尽可能少的行来实现格式化目标。这是语法

[column_name1]
formatter_name1
property11=value11
property12=value12
...
[column_name2]
formatter_name2
property21=value21
propertyp22=value22
...

column_name 就是它的名字——列的名称

  • all - 应用于所有列。一种轻松地将格式应用于所有地方的方法。
  • msg - 指的是 Message 列。
  • thread- 指的是 Thread 列,依此类推。请记住用小写书写。

你将大量使用 all - 以轻松地将格式应用于所有列。

formatter_name 指定要应用的格式化器。它的设置以 property=value 的方式轻松设置。我将在下面解释每个重要的格式化器。

为了尽量减少,我提供了以下格式化器

  • cell - 包含要应用于整个单元格的格式。
  • format - 包含常规格式,例如 - 正则表达式、缩写、数字等。根据其设置,它可以应用于文本的某些部分(而不是整个文本)。
  • picture - 允许用图片替换文本。

一切都是可选的

在本文的其余部分,你将看到大量的设置。所有这些都是可选的。如果某项未设置,则处理该设置的部分将不会执行。其余部分将照常进行。

如果你指定了一个依赖于设置 A 的设置 B,但忘记设置设置 A,Log Wizard 的行为将如同设置 AB 都未设置一样。

单元格格式化器

这是最简单的格式化器。它将格式应用于整个单元格。我主要将其用于 line 列,但你可以在任何地方使用它。设置如下

  • format=<format> - 将此格式应用于整个单元格
  • selection=<image> - 显示包含选中项的行的图像
  • bookmark=<image> - 显示包含书签的行的图像
  • align=<alignment> - 对齐文本(+图像)。可能的值:left(默认)、centerright

format 是要应用于单元格的字体和/或颜色。你会在许多格式化器中遇到 format 设置。它的语法始终如下

format 属性

format 属性具有灵活的语法:a/b/c... 它指定了要应用于某些文本的格式。

abc 可以是以下任意一项

  • bolditalicunderline - 使字体加粗、斜体或下划线
  • darkerlighter - 使前景色稍微变暗或变亮
  • darker-bglighter-bg - 使背景色稍微变暗或变亮
  • #color - 设置颜色。如果是第一次出现,则是前景色。第二次出现是背景色。要强制将颜色设为背景色,只需添加额外的 #,例如 ##color
  • font name - 指定字体名称,例如 tahomaarial
  • font size - 指定字体大小

示例

  • darker/12/italic - 将文本格式化为斜体、12pt,并且比原始颜色稍暗(相对于正常颜色而言)
  • tahoma/9/red - 使文本为红色、9pt、Tahoma 字体
  • arial/11/darker/italic - 使文本为 Arial、11pt、斜体,并且比原始颜色稍暗

单元格格式化器 - 第二部分

回到 cell 格式化器。我已经向你展示了 format 属性。selectionbookmark 是图像文件名。它们可以是相对于 Log Wizard 主目录(用户 Home\Documents\LogWizard 目录)的,也可以是绝对文件名。

所以,以下内容

[line]
cell
format=courier new/#800000/#F0F0F0
align=right
selection=icons\arrow4.png
bookmark=icons\bookmark8.png

将生成此结果

请注意,还有一些其他图标可供选择,以便轻松地根据自己的喜好进行自定义。只需转到 Home\Documents\LogWizard 即可查看。

format 格式化器

这是一个万能的格式化器。只设置你需要的部分。 我将其分成了子部分。你可以指定任意数量或任意数量的格式化选项

正则表达式格式化

允许你将格式应用于文本中找到的正则表达式。

  • regex.expr=<regex_expr> - 要匹配的正则表达式
  • regex.format=<format> - 应用于正则表达式的格式。请注意,目前(1.8 版)- 我只允许指定颜色。我将在后续版本中修复此问题,以允许任何格式。
  • regex2.expr=<regex_expr> - 同上
  • regex2.format=<format> - 同上
  • ...
  • regexN.expr=<regex_expr> - 同上
  • regexN.format=<format> - 同上

示例

[msg]
format
regex.expr=(?<=\[).*(?=\])|(?<=\().*(?=\))|(?<=\{).*(?=\})
regex.format=lighter
regex2.expr=(?<=")(?:\\.|[^"\\])*(?=")|(?<=')(?:\\.|[^'\\])*(?=')
regex2.format=darkviolet

以上将在任何括号(普通括号、方括号或花括号)内的文本显示为较浅的颜色,而引号中的文本(单引号或双引号)则显示为紫色。

如果你不熟悉 正则表达式,我强烈建议你 熟悉它们 - 你可以做得很棒,而且我已经优化了 Log Wizard 以快速显示结果。

缩写

允许你使文本变短,以便你看到更多重要的文本。

我怎么强调都不为过,这有多棒。

当某个列的文本过长时,通常其中有一部分的重要性只有 1% 的时间。你可能会无法全部读完,不得不痛苦地查看每个消息的详细信息以了解其内容。或者,

你可以使用缩写,如下所示

  • 在 Message 列中,缩写一些你转储的属性。你可能会将它们转储为“prop1=value1,prop2=value2, ...”,但你对这些名称太熟悉了,以至于你对 prop1prop2 等名称了如指掌。查看日志时,你只想看到值。
  • 简单地隐藏你通常不需要的信息。你可以完全隐藏它,或者用像 ... 这样的东西替换它,并用一种颜色来暗示那里有什么东西。
  • 在某些 functionclass 类列中,隐藏冗长的命名空间或前缀信息,这些信息通常是相同的,而你根本不关心。

语法非常简单

  • abb.find=<regex_to_find> - 要查找的正则表达式。你可以使用 命名正则表达式
  • abb.replace=<regex_to_replace_with>
  • abb2.find=<regex_to_find> - 同上
  • abb2.replace=<regex_to_replace_with> - 同上
  • ... - 你可以拥有任意多的缩写
  • abbN.find=<regex_to_find> - 同上
  • abbN.replace=<regex_to_replace_with> - 同上

如果你不指定 .replace 部分,我们将从文本中删除找到的正则表达式。

你还可以将格式应用于替换后的文本。[""] 之间的任何内容都是要应用于中间文本的格式(我将在下面展示一个示例)。

你可以为替换文本使用 命名正则表达式

一旦你掌握了 正则表达式,下一个层次就是使用 命名正则表达式。长话短说,你可以识别查找中的文本片段,并在替换表达式中使用它们。例如,假设你想查找类似 {x=<value>,y=<value>,width=<value>,height=<value} 的表达式,并将其替换为 [x,y,width/height]。请仔细思考一下。你将如何做到?

令人惊讶的是,这实际上是可能的

[msg]
format
abb.find=\{x=(?<x>\d*),y=(?<y>\d*),width=(?<w>\d*),height=(?<h>\d*)\}
abb.replace=["green"][["red/bold"]${x},["blue/italic"]${y},["violet/bold"]${w}/${h}["green"]]

结果在这里。很不错,是吧?

在第二个示例中,我将向你展示如何摆脱长列文本

[ctx2]
format
abb.find=^.*:(?<name>.*)\.xaml
abb.replace=["tahoma/red"]...["blue"]${name}

以上将查找任何以 .xaml 结尾的名称,并且只记住结尾部分 - 这基本上就是你想要的。

最后,缩写非常智能

  • 缩写仅适用于“视图”窗格。它们不适用于“详细信息”窗格。因此,如果你确实想查看完整文本,你总可以在“详细信息”中查看(而 99.99% 的时间都不是)。 再次查看上面的两张图片 - 看到“详细信息”窗格了吗?
  • 它们可以随时切换开启/关闭。默认情况下,缩写是开启的。你可以通过按 Ctrl-Shift-A 来关闭它们。在这种情况下,将显示原始文本。再次按 Ctrl-Shift-A - 缩写将重新开启。

数字

这允许你格式化文本中的数字

  • number.base=2 或 8 或 10 或 16(默认=10)。以什么基数显示数字。
  • number.pad=<padding> - 如何填充数字(仅当基数为 10 时)。填充是你会在 c# 中打印数字时使用的,例如“0,000”、“00.0”等。
  • number.color=<color> - 显示数字的颜色
  • number.look_for_hex=1 或 0(默认=1)- 如果为 1,我们还会查找十六进制数字(以便以你上面设置的颜色打印它们)。

示例

number.color=darkred

这将以深红色显示所有数字。

需要注意的一点是,你很少需要指定数字基数(保留默认值)。但是,你可以通过 Ctrl-Shift-B 热键在基数之间切换。按一次,你得到基数 16

再按一次,你得到基数 8

再按一次,你得到基数 2,然后回到基数 10。

此外,还有一个额外的奖励:只需将鼠标悬停在数字上:它将以所有基数显示

 

日期/时间

此子格式化器仅适用于日期/时间列(对于其他列将被忽略)。

  • time.show_diff=0 或 1(默认=1)。如果为 1,它将始终显示与上一行的差异,这样你就可以非常轻松地看到发生了什么变化。这是查找逐行变化的一种绝佳方式。
  • time.format=<format> - 应用于时间的格式。
  • time.light=<color> - 仅当 show_diff=1 时有用。用于显示与前一个时间相同的行的颜色。
  • time.format_time=<format_time> - 如何显示时间,类似于 C# 的 自定义日期/时间格式

示例

[all]
format
time.format=courier new/blue/bold
time.format_time=MMM/dd HH:mm:ss,fff
time.light=#adc7e8

这将显示时间列如下

完整的单元格格式化

这基本上作用于上面描述的 cell formatter 。除了以下设置外,该想法是你可以设置任何其他 format 设置(正如你所见,这些设置相当多)。

  • all.format=<format> - 将格式应用于所有单元格
  • all.selection=<image> - 显示包含选中项的行的图像
  • all.bookmark=<image> - 显示包含书签的行的图像

交替背景

这允许你为行指定交替背景,让你轻松区分它们。

  • alternate.row_count=<rows> - 用某种颜色绘制连续多少行。如果为 1,则用一种颜色绘制一行,用另一种颜色绘制另一行,依此类推。如果为 5,则用一种颜色绘制 5 行,然后用另一种颜色绘制下一组 5 行,依此类推。
  • alternate.color=<color> - 交替颜色

示例

[msg]
format
alternate.row_count=5
alternate.color=#d7e5ff

多行格式化

这是一个很棒的工具,如果你的一个或多个列可以包含多行。它可以帮助你做什么 - 就是将多行显示为单行,以便你尽可能多地查看内容。

  • multiline.multi=0 或 1(默认为 0)。如果为 1(开启),则如果文本包含多行,它们将在单行上显示,以便你尽可能多地查看信息。
  • multiline.separator=<separator-char> - 在显示多行时,如何分隔每一行。
  • multiline.separator_format=<format> - 如何格式化分隔符,以便轻松看到每一行的位置。
  • multiline.alternate_format=<format> - 如何显示每一行交替,以便轻松区分它们。

示例

[msg]
format
multiline.multi=1
multiline.alternate_format=lighter
multiline.separator=|
multiline.separator_format=blue

你会爱上这个的,例如,对于 Windows 事件日志。

数字比较

它允许你将一个数字与一个或多个值进行比较,并根据结果选择其格式。

当数字变得危险地高或危险地低时,它非常有用 - 你想轻松地看到这一点。

  • compare-n.where=before*after - 如何识别数字(beforeafter 都是字符串)。
  • compare-n.value=int 或 double(默认=int)。数字是什么 - 整数还是双精度数。
  • compare-n.compare=value,format-less,format-equal,format-greater - 将数字与值进行比较。如果小于,应用第一个格式。如果等于,应用中间格式。如果大于,应用最后一个格式。
  • compare-n.compare2=value,format-less,format-equal,format-greater - 同上,你可以将原始数字与多个值进行比较。
  • ... - 你可以与任意多的值进行比较。
  • compare-n.compareN=value,format-less,format-equal,format-greater - 同上,你可以将原始数字与多个值进行比较。

示例

compare-n.where=time*ms
compare-n.compare=100,green,yellow,orange
compare-n.compare2=200,,,red
compare-n.compare3=400,,,bold

这将查找类似“time 93 ms”、“time 352 ms”的数字。数字

  • 小于 100 的显示为绿色
  • 100 显示为黄色
  • 100-200 之间的显示为橙色
  • 200-400 之间的显示为红色
  • 大于 400 的显示为红色/粗体

图片

这是一个独立的格式化器。它用图片替换以给定文本开头的任何单元格。

  • pic=text->image - 如果单元格的文本以 text(不区分大小写)开头,它将显示给定的图像。
  • pic2=text2->image2 - 同上
  • ... - 你可以拥有任意多的图片。
  • picN=textN->imageN - 同上
  • align=<alignment>。如何对齐图片(leftrightcenter)。

示例

[level]
picture
pic=info->icons\level\info.png
pic2=error->icons\level\error.png
pic3=fatal->icons\level\fatal.png
pic4=debug->icons\level\debug.png
pic5=warn->icons\level\warn.png
align=center

这基本上是你默认的级别格式化器。

默认格式

现在我已经向你展示了可用的格式化器,我已经为你设置了一些默认格式化器。假设你没有指定任何内容,你将继承大致如下的内容。

[line]
cell
format=courier new/#800000/#F0F0F0
align=right
selection=icons\arrow4.png
bookmark=icons\bookmark8.png

[all]
format
time.format=courier new/blue/bold
time.format_time=MM/dd HH:mm:ss,fff
time.light=#adc7e8

[msg]
format
number.color=darkred
regex.expr=(?<=\[).*(?=\])|(?<=\().*(?=\))|(?<=\{).*(?=\})
regex.format=lighter
regex2.expr=(?<=")(?:\\.|[^"\\])*(?=")|(?<=')(?:\\.|[^'\\])*(?=')
regex2.format=darkviolet
alternate.row_count=1
alternate.color=#fbfdf9
multiline.multi=0
multiline.alternate_format=lighter
multiline.separator=|
multiline.separator_format=blue

[level]
picture
pic=info->icons\level\info.png
pic2=error->icons\level\error.png
pic3=fatal->icons\level\fatal.png
pic4=debug->icons\level\debug.png
pic5=warn->icons\level\warn.png
align=center

如果你仔细看,你会发现一些我已经解释过的东西。你可以在 Preferences >> Colors >> Column Formatting : Default Format 中更改此设置。如果你想更改它,我强烈建议在将其应用于现有日志进行测试后再进行更改。

最后的亮点:分类

Categories 允许你

  • 选择一列
  • LogWizard 将找出该列中的所有唯一值。
  • 你可以根据该列的值分配背景色
  • 与所选内容相同类型的行的显示会稍微暗一些。

这是一个巨大的功能。

为了最好地理解这一点,最好举一个例子:Threads。假设你有一个 Thread 列。

  • Alt-C 显示分类。
  • Categories 下拉列表中,选择 Thread(如果尚未选择)。
  • 等待片刻,直到 Log Wizard 找出所有唯一的线程名称。
  • 默认情况下,Log Wizard 会为每个唯一的线程生成一些背景色。你可以保持原样,也可以覆盖它们。
  • 需要注意的一点是,Log Wizard 会记住你的选择并下次重复使用。

以下是需要记住的

  • 你可以选择任何你想要的 Category(= 列)。
    • Log Wizard 将计算该列的唯一值并显示给你。
    • 如果一个 Category(= 列)有太多值,它将显示一个错误。此时,我们最多接受 25 个唯一值(超过 25 个,着色可能帮助不大)。
  • 你将看到 4 列:
    • Value - 列中的一个唯一值。
    • Color - 用于计算此唯一值的背景色的源颜色。你可以单击它来更改。默认情况下,SameThis (Sel) 颜色是从此计算得出的 - 这两者都是用于显示包含该特定值的行的背景色。
    • Same - 这是用于值与 Value 相同的行的背景色。
    • This (Sel) - 这是用于值匹配所选行 Value 的行的背景色。其思想是使匹配所选行的行稍微暗一些。一旦你使用它,你就会明白我的意思。
    • 默认情况下,SameThis (Sel) 都是从 Color 计算得出的。Color 存在的唯一原因是计算 SameThis (Sel)
    • 如果你对默认计算出的 SameThis (Sel) 不满意,你可以覆盖它们。

一旦你对选择满意,只需按 Start 按钮(右下角)。

结果是即时的 - 行按颜色分组,给定你选择的 Category 值。对于 Threads,这立即变得很有意义 - 你可以轻松地看到哪个日志行来自哪个线程。

它将极大地帮助你理解复杂的场景 - 当消息可以也确实来自多个 Threads 时。

你选择的 Category 可能不同,但能够轻松看到哪一行来自哪里可以大有帮助 - 特别是对于更大、更复杂的日志。

分类 vs 图片

你可能会问 - 为什么我要使用分类,而图片可以实现几乎相同的预期效果?

确实如此,当你的可用值集很小且固定时。在这种情况下,图片确实值千金,本文中贯穿始终的 Level 列就是活生生的证明。

可用值的数量不那么固定(通常在运行时才能确定)时,情况会变得更加模糊。例如,根据你的配置,你的应用程序可能有 5 个线程,或者可能有 15 个线程。线程的名称也可能不是固定的 - 运行某个特定模块可能会启动几个线程,而如果不运行它,这些线程将永远不会启动。

另一个需要考虑的问题(至少在开始时)是,如果你有多个列可以被视为 Category 列。在这种情况下,只需按 Alt-C,选择一个 Category,然后点击 Start 就可以快速概览发生了什么。

最终,当然,如果你的列有一组唯一的值,并且你可以轻松地为每个值分配一个图片,那就去做吧。否则,你一定会喜欢分类。我当然喜欢。

祝你日志美观!

历史

  • 2016 年 2 月 15 日,初始版本(v1.8)

 

 

© . All rights reserved.