如何在C#中用TextWriterTraceListener写入日志?配置是否失效?
你的问题核心在于现代.NET(.NET 5+)对System.Diagnostics.Trace的配置逻辑、单文件发布特性的冲突,加上对.NET项目基础配置的理解偏差,导致日志未生成。以下是具体问题和修复步骤:
1. 配置文件不生效(App.config 适配问题)
在.NET Core/.NET 5+环境中,传统App.config不会像.NET Framework那样自动生效。如果坚持用配置文件配置Trace,需将App.config重命名为[你的项目名称].dll.config(例如项目名为windows-audit-monitor,则改为windows-audit-monitor.dll.config),同时确保发布时该文件被复制到输出目录。
更推荐代码直接配置TraceListener,避免配置文件的兼容性问题,修改你的Program.cs:
using System.Diagnostics; namespace Main; class Program { static void Main(string[] args) { try { // 清除默认监听器,避免重复输出 Trace.Listeners.Clear(); // 添加文件日志监听器 var fileListener = new TextWriterTraceListener(@"C:\Users\tyler\src\windows-audit-monitor\trace.log"); Trace.Listeners.Add(fileListener); // 添加控制台监听器 Trace.Listeners.Add(new ConsoleTraceListener()); Trace.AutoFlush = true; Trace.TraceInformation("Application started."); Trace.WriteLine("Hello World!"); // 手动刷新并关闭监听器 Trace.Flush(); fileListener.Close(); Trace.Close(); } catch (Exception ex) { Console.WriteLine("Exception: " + ex.Message); Console.WriteLine("Stack Trace: " + ex.StackTrace); // 打印堆栈信息,精准定位错误 } } }
2. 单文件发布的裁剪问题
你的.csproj中开启了<PublishTrimmed>true</PublishTrimmed>,该选项会裁剪编译时判定为未使用的代码,TextWriterTraceListener可能被误裁剪,导致日志功能失效。需在.csproj中添加规则保留相关类型:
<PropertyGroup> <!-- 保留原有属性,新增裁剪模式配置 --> <TrimMode>partial</TrimMode> </PropertyGroup> <ItemGroup> <!-- 添加裁剪保留规则,确保Trace相关组件不被移除 --> <TrimmerRootAssembly Include="System.Diagnostics.TextWriterTraceListener" /> </ItemGroup>
同时,<PublishSingleFile>true</PublishSingleFile>会将所有文件打包为单个可执行文件,若使用配置文件,需手动设置复制到输出目录:
<ItemGroup> <None Update="App.config"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
3. 路径与权限验证
确认目标日志路径C:\Users\tyler\src\windows-audit-monitor\已存在,且程序拥有写入权限。可先尝试将日志路径改为桌面(C:\Users\tyler\Desktop\trace.log),快速排除路径权限问题。
基础概念快速梳理
- .csproj:项目核心配置文件,管理编译目标、依赖包、发布规则等,类似Python的
setup.py或Go的go.mod。 - App.config/appsettings.json:配置文件,.NET Framework用
App.config,现代.NET更常用appsettings.json,但System.Diagnostics的配置在现代.NET中更推荐代码实现。 - 程序集:编译后的
.dll或.exe文件,是.NET代码的打包单元,类似Java的.jar。 - 解决方案(.sln):多个关联项目的集合管理文件,用于批量管理项目编译、调试。
内容的提问来源于stack exchange,提问作者bp256r1

