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

NLog日志写入Database正常但无法写入File问题排查咨询

问题成因

NLog中<target>节点的name属性是全局唯一标识符,配置加载阶段,后解析的同名target会直接覆盖先解析的同标识节点:

  • 你配置的File类型写入目标、Database类型写入目标使用了完全相同的名称myAppLoggerTarget
  • NLog读取配置时,写在后方的Database target覆盖了前置的File target,因此logger规则引用myAppLoggerTarget时,仅能匹配到数据库写入目标,文件写入逻辑相当于被覆盖失效
  • 注释掉Database target配置后,不存在同名覆盖冲突,File target自然可以正常执行写入。
修复方案
  1. 给两个target设置互不重复的唯一名称
  2. 在logger规则的writeTo属性中同时引用两个target的名称,多个target名称用英文逗号分隔,即可实现日志同时写入两个目标。

修正后的配置参考

target节点配置:

<target xsi:type="File" name="fileAppLoggerTarget" fileName="${basedir}/logs/${shortdate}.log"
        layout="${longdate} ${uppercase:${level}} ${message}" />
<target xsi:type="Database"
    name="dbAppLoggerTarget"
    connectionString="Data Source=R5-4500U\SQLEXPRESS;Initial Catalog=BlogDb;Integrated Security=True;"
    commandText="INSERT INTO Logs(CreatedOn,Message,Level,Exception,StackTrace,Logger,Url) VALUES (@datetime,@msg,@level,@exception,@trace,@logger,@url)">
        <parameter name="@datetime" layout="${date}" />
        <parameter name="@msg" layout="${message}" />
        <parameter name="@level" layout="${level}" />
        <parameter name="@exception" layout="${exception}" />
        <parameter name="@trace" layout="${stacktrace}" />
        <parameter name="@logger" layout="${logger}" />
        <parameter name="@url" layout="${aspnet-request-url}" />
</target>

对应的logger规则配置:

<logger name="myAppLoggerRules" minlevel="Debug" writeTo="fileAppLoggerTarget,dbAppLoggerTarget" />

补充:如果需要给不同target配置独立的级别过滤、路由规则,也可以编写多条logger节点分别指向对应target,最终效果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:48:09