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

如何在NLog生成的日志文件名中包含Git提交ID?

问题

当前NLog生成的日志文件名叫MyMachine_MyExe_1.0.0.0.log,里面包含程序集版本,但没带上Git提交ID(这个ID能在dll的产品版本属性里查到)。

能不能通过NLog.config或者编程的方式,把Git提交ID加到日志文件名里?

现有配置与代码

NLog.config

<variable name="callsite" value="${callsite:includeNamespace=false:className=true:methodName=true}"/>
<variable name="baseLogDir" value="logs" />
<variable name="baseLogFilename" value="${machinename}_${processname}_${assembly-version}" />
<variable name="debugTraceLayout" value="${longdate}|${level:uppercase=true}|${callsite}|${message}" />
<targets>
    <target
        xsi:type="Console"
        name="console"
        layout="${longdate}|${level:uppercase=true}|${message}" />
    <target xsi:type="File"
        name="fileInfo"
        fileName="${baseLogDir}/${baseLogFilename}.log"
        layout="${longdate}|${level:uppercase=true}|${message}"
        archiveFileName="${baseLogDir}/archive/${baseLogFilename}_{#}.log"
        archiveNumbering="Date"
        archiveOldFileOnStartup="true"
        archiveDateFormat="yyyyMMdd_HHmmss" />

MyProject.csproj

<Project Sdk="Microsoft.NET.Sdk">
    <Target Name="SetSourceRevisionId" BeforeTargets="InitializeSourceControlInformation">
        <Exec Command="git describe --long --always --dirty --exclude=* --abbrev=8" ConsoleToMSBuild="True" IgnoreExitCode="False">
            <Output PropertyName="SourceRevisionId" TaskParameter="ConsoleOutput" />
        </Exec>
    </Target>       
</Project>

MyLibrary.dll 属性

dll产品版本属性截图

解决方案

没问题,两种方法都能实现:

方法一:直接修改NLog.config

NLog自带${assembly-informational-version}布局渲染器,刚好对应dll属性里的产品版本(你的Git提交ID已经写入到这里了)。

只需要修改baseLogFilename变量,把Git提交ID加进去就行:

<variable name="baseLogFilename" value="${machinename}_${processname}_${assembly-version}_${assembly-informational-version:trim=true}" />

提示:如果产品版本里有多余的空格或换行,加上:trim=true参数能自动去掉。

修改后日志文件名会变成类似MyMachine_MyExe_1.0.0.0_v1.0.0-12-gabcdef12.log的格式,具体取决于你的Git提交ID样式。

方法二:编程方式控制

如果需要更灵活的处理,比如对Git提交ID做额外处理,可以在程序启动时手动获取ID,再传给NLog:

  1. 先写代码获取产品版本(包含Git提交ID):
using System.Reflection;

// 获取当前程序集的产品版本
var currentAssembly = Assembly.GetExecutingAssembly();
var gitCommitId = currentAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion?.Trim();
  1. 在NLog初始化前设置全局变量:
using NLog;

// 把Git提交ID设为NLog全局变量
LogManager.Configuration.Variables["gitCommitId"] = gitCommitId;

// 加载NLog配置
LogManager.LoadConfiguration("NLog.config");
  1. 最后在NLog.config里用这个变量:
<variable name="baseLogFilename" value="${machinename}_${processname}_${assembly-version}_${gitCommitId}" />

补充说明

你的MyProject.csproj里已经通过SetSourceRevisionId任务把Git提交ID写入到SourceRevisionId属性了,.NET会自动把这个值合并到程序集的信息版本中——也就是dll属性里的产品版本,所以上面两种方法都能直接读取到这个ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:15:41