【问题标题】:external command fails td-agent外部命令失败 td-agent
【发布时间】:2023-12-22 02:19:01
【问题描述】:

此 bash 命令“etcdctl get system config/log/timestamp”返回 UTC 或系统时间类型。现在我想用它来将时间转换为相同的格式。我怎样才能做到这一点?

我试过了,但是 td-agent 运行失败。

<source>
  @type exec
  command etcdctl get system config/log/timestamp
  <parse>
    keys timeType
  </parse>
</source>

现在我想使用那个 timeType 将我的时间从给定日志转换为那个 timeType

{"host":"sp-1","level":"INFO","log":{"classname":"common.server.hacluster.CSFHATopologyChangeHandlerMBean:93","message":"Finished processing CSF HA 'become standby' message.","stacktrace":"","threadname":"RMI TCP Connection(1784)-192.168.20.11"},"process":"becomeStandby","service":"SP","time":"2020-03-19T10:15:36.514Z","timezone":"America/Toronto","type":"log","system":"SP_IG_20_3_R1_I2002","systemid":"SP_IG_20_3_R1_I2002"}

这是我想使用 $timeType 的地方

<filter com.logging.tmplog>
  @type record_modifier
  <record>
  type log
  time ${record["time"]}.$timeType   ## It's not working
  arun ${tag}
  </record>
</filter>

【问题讨论】:

  • 为什么这会被标记为ruby问题?
  • 我这样做是因为 fluentd 在 ruby​​ 中有插件。所以可能是红宝石的解决方案

标签: fluentd td-agent


【解决方案1】:

使用记录修饰符的prepare_value解决了这个问题

<filter com.logging.tmplog> @type record_modifier prepare_value @timeType =`etcdctl 获取系统配置/日志/时间戳`.strip

<record> timeType ${@timeType} time ${if @timeType == 'UTC' then Time.at(time).utc.strftime('%FT%T') else Time.at(time).to_s; end} </record> </filter>

【讨论】: