Grafana Promtail解析前去除ANSI颜色及rsyslog配置咨询
日志ANSI颜色清理与Promtail解析问题解答
问题1:如何在Promtail解析前清理日志消息?
你当前的管道里虽已将decolorize放在regex之前,但仍需在正则中匹配ANSI序列,核心原因是日志里的ANSI转义符为#033而非标准的\033,导致decolorize无法识别清理。提供两种解决方法:
方法一:自定义
decolorize的转义前缀
给decolorize添加prefix参数,匹配日志中的转义符前缀,调整后管道如下:- match: selector: '{application="couchdb"}' stages: - decolorize: prefix: "#033" # 指定日志中ANSI转义的前缀 - regex: expression: '(?P<timestamp>[\w:-]*?)\s+?\|\s+?(?P<level>[A-Z]+)\s+?\|\s+?(?P<message>.*)' # 无需再匹配ANSI序列 - labels: level: facility: - timestamp: format: RFC3339 source: timestamp - output: source: message方法二:先用
replace转换转义符,再执行decolorize
先把#033替换为标准的\033,再用默认decolorize处理:- match: selector: '{application="couchdb"}' stages: - replace: expression: '#033' replace: '\033' - decolorize: - regex: expression: '(?P<timestamp>[\w:-]*?)\s+?\|\s+?(?P<level>[A-Z]+)\s+?\|\s+?(?P<message>.*)' - labels: level: facility: - timestamp: format: RFC3339 source: timestamp - output: source: message
两种方法都能让decolorize在解析前完成清理,正则无需再处理ANSI干扰内容。
问题2:使用rsyslog在发送给Promtail前清理日志消息
完全可以,以下是两种常用配置方式:
方法一:使用omsed模块替换ANSI序列
确保rsyslog加载omsed模块(一般默认已加载),添加如下规则:
# 若未加载模块则添加此行 module(load="omsed") # 针对couchdb日志清理ANSI颜色 if $programname == 'couchdb' then { action(type="omsed" regex="#033\[[0-9;]*m" replacement="") # 发送清理后的日志到Promtail action(type="omfwd" target="你的Promtail主机地址" port="1514" protocol="tcp" template="RSYSLOG_SyslogProtocol23Format") stop }
方法二:用模板内置替换函数清理
无需额外加载模块,通过模板直接替换:
# 定义清理ANSI颜色的模板 template(name="CleanedCouchDBLog" type="string" string="%timegenerated:::date-rfc3339% %hostname% %programname%: %msg:replace-regex:expr=#033\\[[0-9;]*m:replace=::%") # 发送清理后的日志到Promtail if $programname == 'couchdb' then { action(type="omfwd" target="你的Promtail主机地址" port="1514" protocol="tcp" template="CleanedCouchDBLog") stop }
内容的提问来源于stack exchange,提问作者k_o_
相关产品推荐
相关产品推荐

