应使用serilog或nlog等专业日志框架而非console.writeline或file.appendalltext,因其具备线程安全、级别过滤、滚动归档、动态配置等关键能力,避免并发异常与服务卡死。

直接用 Microsoft.Extensions.Logging + FileLoggerProvider(或更稳妥的 NLog/Serilog)——别手写 StreamWriter 写文件,那不是日志,是定时埋雷。
为什么不用 Console.WriteLine 或自己 File.AppendAllText
这些方式没有线程安全控制、没日志级别过滤、不支持滚动归档、无法动态改配置,上线后一并发就丢日志或卡死进程。尤其 File.AppendAllText 在多线程下大概率抛 IOException:「The process cannot access the file because it is being used by another process.」
- 日志写入必须是线程安全的异步/缓冲写入
- 必须能按级别(
Info、Error)开关输出 - 生产环境必须支持按大小/时间自动切文件(如
app-20241001.log)
用 Serilog 写入文件(推荐新手起步)
它零配置就能跑,API 直观,且默认线程安全。NuGet 安装:Serilog + Serilog.Sinks.File。
// Program.cs(.NET 6+)
using Serilog;
<p>Log.Logger = new LoggerConfiguration()
.WriteTo.File("logs/app-.log",
rollingInterval: RollingInterval.Day,
retainedFileCountLimit: 7,
fileSizeLimitBytes: 10_000_000)
.CreateLogger();</p><p>try
{
Log.Information("服务启动");
Log.Error(new Exception("测试异常"), "出错了");
}
finally
{
Log.CloseAndFlush(); // 必须调用,否则最后几条可能丢失
}</p>
-
rollingInterval: RollingInterval.Day表示每天一个新文件,旧文件自动重命名(如app-20241001.log→app-20241001.log.1) -
retainedFileCountLimit: 7保留最近 7 天的日志,超出的自动删除 -
fileSizeLimitBytes防止单个文件无限膨胀(注意单位是字节)
用 Microsoft.Extensions.Logging + NLog(适合已有项目集成)
如果你的项目已用 Host.CreateDefaultBuilder,NLog 可无缝替换内置日志提供器。NuGet 安装:NLog + NLog.Extensions.Logging,并添加 nlog.config:
<?xml version="1.0" ?><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"><targets><target xsi:type="File" name="file" filename="logs/${shortdate}.log" archivefilename="logs/archives/log.{#}.txt" archiveevery="Day" archivenumbering="Rolling" maxarchivefiles="7"></target></targets><rules><logger name="*" minlevel="Info" writeto="file"></logger></rules></nlog>
然后在 Program.cs 中注册:
var builder = Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging => logging.ClearProviders())
.UseNLog(); // 这行启用 NLog 替代默认提供器
- 必须调用
logging.ClearProviders(),否则Console和Debug提供器还在抢写 -
NLog的archiveEvery="Day"和maxArchiveFiles是硬需求,不配就会堆满磁盘 -
fileName中的${shortdate}是 NLog 变量,不是 C# 字符串插值
真正难的不是“怎么写进文件”,而是“怎么不让日志拖垮服务”——缓冲区大小、磁盘满时的行为、敏感字段脱敏、结构化日志字段对齐,这些在 Serilog 或 NLog 的文档里藏得深,但漏掉任意一条,线上就可能出 silent failure。










