如何在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 属性

解决方案
没问题,两种方法都能实现:
方法一:直接修改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:
- 先写代码获取产品版本(包含Git提交ID):
using System.Reflection; // 获取当前程序集的产品版本 var currentAssembly = Assembly.GetExecutingAssembly(); var gitCommitId = currentAssembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion?.Trim();
- 在NLog初始化前设置全局变量:
using NLog; // 把Git提交ID设为NLog全局变量 LogManager.Configuration.Variables["gitCommitId"] = gitCommitId; // 加载NLog配置 LogManager.LoadConfiguration("NLog.config");
- 最后在NLog.config里用这个变量:
<variable name="baseLogFilename" value="${machinename}_${processname}_${assembly-version}_${gitCommitId}" />
补充说明
你的MyProject.csproj里已经通过SetSourceRevisionId任务把Git提交ID写入到SourceRevisionId属性了,.NET会自动把这个值合并到程序集的信息版本中——也就是dll属性里的产品版本,所以上面两种方法都能直接读取到这个ID。
内容的提问来源于stack exchange,提问作者theateist
相关产品推荐
相关产品推荐

