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

Fluentd转换Serilog TCP日志为Grafana Loki格式方案咨询

解决方案

两种实现方案都可行,优先推荐在Fluentd侧完成格式转换,无需修改现有应用代码,完全符合你当前边车模式的设计思路。


方案1:Fluentd侧处理(推荐)

你当前使用的fluent-plugin-grafana-loki是官方维护的插件,本身就支持自定义标签提取、日志行格式化能力,不需要替换插件,仅修改Fluentd配置即可完成适配,不用调整C#应用的任何代码。

修改后的完整配置示例:

<source>
  @type tcp
  <parse>
    @type json
  </parse>
  port 9880
  bind 0.0.0.0
  tag xxxx
</source>

<!-- 可选过滤器段:用于字段映射、冗余字段清理 -->
<filter xxxx>
  @type record_transformer
  <record>
    # 适配Serilog默认JsonFormatter的带@前缀的字段名,可根据你实际输出调整
    level ${record["@l"]}
    log_msg ${record["@m"]}
  </record>
  # 可删除不需要的冗余字段降低日志体积
  remove_keys ["@l", "@mt", "@r"]
</filter>

<match xxxx>
  @type loki
  url                 https://logs-prod-us-central1.grafana.net
  username            **username**
  password            **password**
  extra_labels        {"env":"dev","farm":"a"} 
  # 配置要提取为Loki流标签的字段,注意不要加入高基数字段(如请求ID、用户ID等)
  label_keys          ["level", "applicationName", "environment", "env", "farm"]
  # 日志行格式:设为json会把剩余所有字段序列化为JSON作为日志内容,也支持自定义模板
  line_format         json
  # 自定义日志行格式示例:
  # line_format       "${record['@t']} [${record['level']}] ${record['log_msg']} ${record.to_json()}"
  flush_interval      5s
  flush_at_shutdown   true
  buffer_chunk_limit  1m
</match>

方案优势:

  • 完全保留边车模式的优势,后续更换日志存储仅需调整Fluentd配置,不需要重新发布应用
  • 标签、日志格式的调整灵活度更高,不需要重启业务服务即可生效

方案2:自定义Serilog Formatter(可选)

如果不想在Fluentd侧做过多配置,也可以参考Serilog Loki Sink的格式逻辑,开发一个轻量的自定义Formatter,直接把日志格式化为Loki兼容的结构后通过现有TCPSink发送,不需要替换TCPSink组件。
但该方案需要修改应用代码,违背了你之前设计的「无需修改应用即可更换日志目的地」的架构原则,除非有特殊的格式定制需求,否则不推荐使用。


内容的提问来源于stack exchange,提问作者programmerj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:36:10