如何配置NLog向InfluxDB输出日志?是否需自定义Target?
配置NLog向InfluxDB输出日志的解决方案
不需要自行从头实现NLog.Targets.Target,已有几种现成方案可选:
1. 使用第三方NLog InfluxDB目标包
直接安装NuGet包NLog.Targets.InfluxDB,之后在NLog.config中配置对应的Target即可,用法和Seq目标类似:
<nlog> <extensions> <add assembly="NLog.Targets.InfluxDB"/> </extensions> <targets> <target name="influxdb" xsi:type="InfluxDB" Url="http://localhost:8086" Database="logs" Measurement="app_logs"> <field name="level" layout="${level}"/> <field name="message" layout="${message}"/> <field name="logger" layout="${logger}"/> <field name="timestamp" layout="${longdate:format=yyyy-MM-ddTHH:mm:ss.fffZ}"/> </target> </targets> <rules> <logger name="*" minlevel="Info" writeTo="influxdb"/> </rules> </nlog>
2. 用NLog自带HTTP目标构造请求
如果不想依赖第三方包,可利用NLog内置的HTTP目标,手动构造InfluxDB的Line Protocol格式请求,直接发送到InfluxDB的写入接口:
<nlog> <targets> <target name="influxdb_http" xsi:type="HTTP" Url="http://localhost:8086/write?db=logs" Method="POST" ContentType="text/plain"> <layout type="SimpleLayout"> app_logs,level=${level:lowercase=true} logger=${logger:replace=,:\\,} message=${message:replace=,:\\,:replace=\\n,:\\n} ${longdate:format=yyyy-MM-ddTHH:mm:ss.fffZ} </layout> </target> </targets> <rules> <logger name="*" minlevel="Info" writeTo="influxdb_http"/> </rules> </nlog>
注意要对Line Protocol中的特殊字符(比如逗号、空格、换行)做转义,避免写入失败。
3. 自定义Target(仅当以上方案不满足需求时)
如果需要高度定制的逻辑,再考虑自定义Target:
- 继承
NLog.Targets.Target类 - 重写
Write(LogEventInfo logEvent)方法 - 使用官方的
InfluxDB.ClientNuGet包实现数据写入逻辑
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

