在C#项目中快速接入NLog只需NuGet安装并配置nlog.config文件,设为“始终复制”,用${basedir}/logs/${shortdate}.log路径;Serilog需手动注册全局异常处理器并调用UseSerilog()替换原生日志系统。

怎么在 C# 项目里快速接入 NLog 并输出到文件
直接用 NuGet 安装 NLog 包,再配一个 nlog.config 文件就能跑起来,不用改一行代码逻辑。关键在于配置文件的写法和日志级别控制。
- 安装命令:
dotnet add package NLog(.NET CLI)或通过 Visual Studio NuGet 管理器搜索安装 -
nlog.config必须设为“复制到输出目录:始终复制”,否则运行时找不到配置 - 默认日志级别是
Info,Debug级别日志不会写入,调试时记得调高minlevel - 文件目标路径建议用
${basedir}/logs/${shortdate}.log,避免硬编码路径;Windows 和 Linux 路径分隔符由 NLog 自动处理
示例配置片段(nlog.config 中的 <targets></targets> 部分):
<target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} ${uppercase:${level}} ${logger} ${message} ${exception:format=tostring}" />Serilog 怎么捕获未处理异常并自动记录堆栈
Serilog 本身不监听全局异常,必须手动挂载 AppDomain.CurrentDomain.UnhandledException 或 TaskScheduler.UnobservedTaskException,否则程序崩溃时日志就断了。
- 在
Program.cs最早位置(如Main开头)调用Log.Logger = new LoggerConfiguration().CreateLogger() - 注册全局异常处理器:
AppDomain.CurrentDomain.UnhandledException += (s, e) => Log.Fatal(e.ExceptionObject as Exception, "Unhandled exception"); - 异步任务异常容易漏掉,务必加
TaskScheduler.UnobservedTaskException处理 -
WriteTo.Console()默认不显示异常详情,要加outputTemplate或用RenderedCompactJsonFormatter才能完整输出Exception.ToString()
推荐初始化写法:
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Console(outputTemplate: "{Timestamp:HH:mm:ss} [{Level:u3}] {Message:lj}{NewLine}{Exception}")
.WriteTo.File("logs/log-.txt", rollingInterval: RollingInterval.Day)
.CreateLogger();NLog 和 Serilog 在 ASP.NET Core 里的注册方式有什么区别
两者都支持 ILoggingBuilder 扩展,但 Serilog 是“替换”原生日志系统,NLog 是“接入”原生系统,这直接影响 ILogger<t></t> 的行为和性能开销。
- NLog:调用
builder.Host.UseNLog()即可,后续仍用Microsoft.Extensions.Logging.ILogger,兼容所有中间件日志输出 - Serilog:必须用
Host.CreateDefaultBuilder().UseSerilog(),且要在WebHostBuilder构建前注册,否则ILogger实例会是空壳 - Serilog 的
Log.Error(ex, ...)和logger.LogError(ex, ...)输出内容一致;NLog 的logger.Error(ex, ...)需确保 layout 中包含${exception}才能渲染堆栈 - ASP.NET Core 的请求日志(如
Microsoft.AspNetCore.Hosting.Diagnostics)默认级别是Information,若想看到详细请求耗时,需在配置中显式开启Microsoft.AspNetCore命名空间的日志
为什么日志文件没生成、或者只写了一两行就停了
最常见原因是权限不足、路径不可写、或日志组件被提前释放。尤其在 Windows 服务、IIS 或 Docker 容器中,工作目录和权限模型和开发环境完全不同。
- NLog:检查
nlog.config中keepFileOpen="false"(默认true),IIS 下多个 w3wp 进程争抢文件锁会导致写入失败 - Serilog:如果用了
WriteTo.File()但没指定shared: true,多进程场景下会抛IOException并静默失败 - .NET 6+ 的 Minimal Hosting 模式下,若在
WebApplication.CreateBuilder()之前调用Log.Logger,会触发静态构造器初始化失败,日志直接丢失 - Docker 容器中挂载日志目录时,宿主机路径需有写权限,且容器内用户 UID 需匹配(例如 Alpine 镜像常用
www-data用户)
排查技巧:临时把 target 改成 Console 或 Debug,看是否真有日志产生;再查 NLog 内置的 internalLogLevel 或 Serilog 的 SelfLog.Enable(...) 输出诊断信息。


















