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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:35:00