我写了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 ,由 ^ [>表示。答案 0 :(得分:3)
比文字转义字符更好的解决方案是遵循提供的链接中的提示:
Grok位于正则表达式之上,因此任何正则表达式也都在grok中有效。正则表达式库是Oniguruma,您可以看到完整支持的regexp语法on the Onigiruma site。
\t horizontal tab (0x09)
\v vertical tab (0x0B)
\n newline (0x0A)
\r return (0x0D)
\b back space (0x08)
\f form feed (0x0C)
\a bell (0x07)
\e escape (0x1B)
此外,颜色代码可以与不使用两位数字的其他视频属性混合使用。引自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模式是:
而不是
请注意,^[
是一个字符。