如何配置NLog将日志保存为UTF8+BOM编码的文件?
问题描述
我使用以下代码配置NLog日志:
private static void SetupLogging(string logFile) { var Config = new NLog.Config.LoggingConfiguration(); var logfile = new NLog.Targets.FileTarget("logfile") { FileName = logFile, Layout = "${longdate}|${level:uppercase=true}|${logger}|${message:withException=true:exceptionSeparator=|}" }; var logconsole = new NLog.Targets.ConsoleTarget("logconsole"); Config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole); Config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile); LogManager.Configuration = Config; }
但生成的日志文件为UTF-8无BOM编码,而我依赖的CTextFileDocument库要求日志必须是UTF-8+BOM编码,请问该如何调整配置?
解决方案
要让NLog生成带BOM的UTF-8日志文件,只需为FileTarget指定对应的编码即可,以下是两种实现方式:
代码配置方式
在初始化FileTarget时,添加Encoding属性并设置为带BOM的UTF-8编码:
private static void SetupLogging(string logFile) { var Config = new NLog.Config.LoggingConfiguration(); var logfile = new NLog.Targets.FileTarget("logfile") { FileName = logFile, Layout = "${longdate}|${level:uppercase=true}|${logger}|${message:withException=true:exceptionSeparator=|}", // 指定带BOM的UTF-8编码 Encoding = new System.Text.UTF8Encoding(true) }; var logconsole = new NLog.Targets.ConsoleTarget("logconsole"); Config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole); Config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile); LogManager.Configuration = Config; }
注:
UTF8Encoding(true)中的true参数表示生成UTF-8 BOM,也可以直接使用System.Text.Encoding.UTF8(它默认会生成BOM),显式指定true会让代码意图更清晰。
配置文件方式(若使用NLog.config)
如果是通过配置文件管理NLog,可在file目标节点中添加encoding="utf-8-bom"属性:
<targets> <target name="logfile" xsi:type="File" fileName="${basedir}/logs/logfile.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message:withException=true:exceptionSeparator=|}" encoding="utf-8-bom" /> </targets>
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

