NLog日志写入Database正常但无法写入File问题排查咨询
问题成因
NLog中<target>节点的name属性是全局唯一标识符,配置加载阶段,后解析的同名target会直接覆盖先解析的同标识节点:
- 你配置的File类型写入目标、Database类型写入目标使用了完全相同的名称
myAppLoggerTarget - NLog读取配置时,写在后方的Database target覆盖了前置的File target,因此logger规则引用
myAppLoggerTarget时,仅能匹配到数据库写入目标,文件写入逻辑相当于被覆盖失效 - 注释掉Database target配置后,不存在同名覆盖冲突,File target自然可以正常执行写入。
修复方案
- 给两个target设置互不重复的唯一名称
- 在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
相关产品推荐
相关产品推荐

