You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 19:47:20