用于解析ESC键的Grok模式

时间:2015-10-30 16:11:16

标签: regex grok logstash-grok ansi-escape fluentd

我写了grok pattern来解析fluentd cinder-api中的日志,其中一行是:

2015-09-17 17:44:49.663 ^[[00;32mDEBUG oslo_concurrency.lockutils [^[[00;36m-^[[00;32m] ^[[01;35m^[[00;32mAcquired semaphore "singleton_lock"^[[00m ^[[00;33mfrom (pid=30534) lock /usr/local/lib/python2.7/dist-packages/oslo_concurrency/lockutils.py:198^[[00m

^[[00;32m和其他此类事件是ASCII colour codes,在终端打印时会按如下方式打印:

我需要解析该行,并且在没有使用(tested)模式的颜色代码时能够执行此操作 %{TIMESTAMP_ISO8601:timestamp}%{SPACE}%{LOGLEVEL:loglevel}%{SPACE}{NOTSPACE:api}%{SPACE}\[(?:%{DATA:request})\]%{SPACE}%{GREEDYDATA:message}

如何修改grok模式以便能够解析彩色日志行?

如果有人帮助解决方案,我发现了以下内容:

  • ^[实际上是ESC键,其八进制代码为 \ 033 ,十六进制代码为 \ x1B ,十进制ASCII代码为 27 ,由 ^ [>表示。
  • 有一个名为fluentd plugincolor-stripper执行相同但不适用于我,也不适合我的用例。

2 个答案:

答案 0 :(得分:3)

比文字转义字符更好的解决方案是遵循提供的链接中的提示:

此外,颜色代码可以与不使用两位数字的其他视频属性混合使用。引自XTerm Control Sequences

CSI Pm m Character Attributes (SGR). Ps = 0 -> Normal (default). Ps = 1 -> Bold. Ps = 2 -> Faint, decreased intensity (ISO 6429). Ps = 3 -> Italicized (ISO 6429). Ps = 4 -> Underlined. Ps = 5 -> Blink (appears as Bold). Ps = 7 -> Inverse. Ps = 8 -> Invisible, i.e., hidden (VT300). Ps = 9 -> Crossed-out characters (ISO 6429). Ps = 2 1 -> Doubly-underlined (ISO 6429). Ps = 2 2 -> Normal (neither bold nor faint). Ps = 2 3 -> Not italicized (ISO 6429). Ps = 2 4 -> Not underlined. Ps = 2 5 -> Steady (not blinking). Ps = 2 7 -> Positive (not inverse).

您可能还会看到正常粗体下划线反向的那些。最后,参数的数量不限于两个,参数可选。结果可能是

\e\[(\d*;)*(\d*)m

答案 1 :(得分:0)

解决了这个问题。

诀窍是使用ESC字符本身,而不是其表示^[

我使用emacs,所以我调用函数(insert-char)并输入字符1b的十六进制代码,并在grok模式中使用该字符。

我写的ANSI颜色代码的grok模式是:

Grok pattern for ANSI colour codes

而不是

Not the Grok pattern for ANSI colour codes

请注意,^[是一个字符。