要让NLog输出日志到文件,需在NLog.config中配置file类型target并用rules路由日志;fileName推荐用${basedir}避免路径问题,支持${shortdate}等渲染器实现按天归档,layout可自定义格式,配置后需设“始终复制”并验证日志生成。

要让 NLog 把日志输出到文件,核心是正确配置 NLog.config 文件(xml 格式),并确保目标(target)为 File,同时用规则(rules)把日志路由过去。
基础结构:NLog.config 文件骨架
在项目根目录或输出目录(如 bin/Debug)下新建一个名为 NLog.config 的 XML 文件,内容大致如下:
常用文件配置项说明
fileName 支持布局渲染器(Layout Renderers),灵活控制路径和文件名:
- ${basedir}:程序运行目录(推荐,避免硬编码路径)
- ${shortdate}:如
2024-06-15,适合按天分文件 - ${longdate}:精确到毫秒的时间戳,可用于单行时间格式
- ${processid} 或 ${threadid}:多进程/线程时防冲突
- ${level}:可按级别分文件(如 Error.log、info.log)
例如,按日期滚动的常见写法:
fileName=”${basedir}/logs/${shortdate}.log”
archiveFileName=”${basedir}/logs/archives/log.{#}.txt”
archiveEvery=”Day”
archiveNumbering=”Rolling”
maxArchiveFiles=”30″
encoding=”utf-8″ />
日志内容格式(layout)怎么定制?
默认输出较简略。加 layout 属性可自定义每行日志样式:
fileName=”${basedir}/logs/app.log”
layout=”${longdate} [${level:uppercase=true}] ${logger} ${message} ${exception:format=tostring}” />
常用占位符:
- ${longdate}:2024-06-15 14:23:05.123
- ${level:uppercase=true}:INFO / ERROR
- ${logger}:记录日志时的 logger 名(如
MyApp.Services.UserService) - ${message}:实际日志内容
- ${exception:format=tostring}:完整异常堆栈(仅当有异常时输出)
验证是否生效的小技巧
写完配置别急着跑业务,先快速验证:
- 确保
NLog.config的“复制到输出目录”属性设为“始终复制”(VS 中右键文件 → 属性) - 代码中获取 logger 后,手动写一条日志:
var logger = LogManager.GetCurrentClasslogger();
logger.Info(“NLog 测试日志已发出”); - 检查程序运行目录下是否生成了
logs/app.log,且内容符合预期 - 如果没日志,打开 NLog 内部日志排查:
基本上就这些。不复杂但容易忽略路径权限、文件权限或配置未复制的问题。保持 fileName 用 ${basedir} 开头,基本能避开大部分路径坑。