如何配置NLog提取独立日志参数并写入CSV文件?
配置NLog提取独立日志参数并写入CSV文件
需求说明
- 需提取的日志参数:日期时间、项目名称(命名空间)、类名称、方法名称、日志调用行号、日志消息
- 最终输出到CSV文件,每个参数对应独立字段
当前配置与代码
初始NLog.config
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <!-- 输出到控制台 --> <target name="console" xsi:type="Console" layout="${longdate}|${callsite}|${callsite-linenumber}|${message}"/> </targets> <rules> <!-- 所有Debug及以上级别日志输出到控制台 --> <logger name="*" minlevel="Debug" writeTo="console" /> </rules> </nlog>
日志调用代码
namespace LoggingWriteJsonWinFrmQ1 { internal class Logger1 { public void CreateLogger() { Logger log = LogManager.GetCurrentClassLogger(); log.Info("info message. Step-1"); log.Info("info message. Step-2"); } } }
当前控制台输出
2024-02-28 22:21:36.6406|LoggingWriteJsonWinFrmQ1.Logger1.CreateLogger|17|info message. Step-1 2024-02-28 22:21:36.7066|LoggingWriteJsonWinFrmQ1.Logger1.CreateLogger|18|info message. Step-2
期望控制台输出
2024-02-28 22:21:36.6406|LoggingWriteJsonWinFrmQ1|Logger1|CreateLogger|17|info message. Step-1 2024-02-28 22:21:36.7066|LoggingWriteJsonWinFrmQ1|Logger1|CreateLogger|18|info message. Step-2
更新后的CSV输出尝试
修改后的NLog.config
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets async="true"> <target name="run_log" xsi:type="File" fileName="${basedir}/Application.csv" keepFileOpen="true"> <layout xsi:type="CSVLayout"> <column name="DateTime" layout="${longdate}" /> <column name="Project" layout="${callsite:className=true:includeSourcePath=false}" /> <column name="Class" layout="${callsite:className=false:includeSourcePath=true}" /> <column name="Method" layout="${callsite-linenumber}" /> <column name="Message" layout="${message}" /> </layout> </target> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="run_log" /> </rules> </nlog>
当前CSV输出(不符合预期)
DateTime,Project,Class,Method,Message 2024-02-29 21:17:39.8456,LogggingMainProjectTetst.Logger1.CreateLogger,CreateLogger,18,info message. Step-1 2024-02-29 21:17:41.4306,LogggingMainProjectTetst.Logger1.CreateLogger,CreateLogger,22,info message. Step-2
期望CSV输出
DateTime,Project,Class,Method,LineNumber,Message 2024-02-29 21:17:39.8456,LogggingMainProjectTetst,Logger1,CreateLogger,18,info message. Step-1 2024-02-29 21:17:41.4306,LogggingMainProjectTetst,Logger1,CreateLogger,22,info message. Step-2
解决方案:正确的NLog配置
利用NLog${callsite}的格式化参数,可直接拆分命名空间、类名、方法名,配置如下:
<?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets async="true"> <target name="run_log" xsi:type="File" fileName="${basedir}/Application.csv" keepFileOpen="true"> <layout xsi:type="CSVLayout"> <column name="DateTime" layout="${longdate}" /> <!-- 提取命名空间(对应项目名称) --> <column name="Project" layout="${callsite:format=Namespace}" /> <!-- 提取类名(不含命名空间) --> <column name="Class" layout="${callsite:format=Class}" /> <!-- 提取方法名 --> <column name="Method" layout="${callsite:format=Method}" /> <!-- 提取日志调用行号 --> <column name="LineNumber" layout="${callsite-linenumber}" /> <!-- 日志消息 --> <column name="Message" layout="${message}" /> </layout> </target> </targets> <rules> <logger name="*" minlevel="Debug" writeTo="run_log" /> </rules> </nlog>
关键说明
${callsite:format=Namespace}:直接获取调用方的命名空间,对应项目名称${callsite:format=Class}:仅提取类名,不包含前缀命名空间${callsite:format=Method}:单独提取调用日志的方法名${callsite-linenumber}:获取日志语句所在的代码行号CSVLayout会自动处理字段中的逗号转义,保证CSV格式的正确性
验证输出
配置完成后,生成的CSV内容将与期望完全一致:
DateTime,Project,Class,Method,LineNumber,Message 2024-02-29 21:17:39.8456,LogggingMainProjectTetst,Logger1,CreateLogger,18,info message. Step-1 2024-02-29 21:17:41.4306,LogggingMainProjectTetst,Logger1,CreateLogger,22,info message. Step-2
内容的提问来源于stack exchange,提问作者eusataf
相关产品推荐
相关产品推荐

