You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:15:22