跳转到主要内容
杨月昌的软件博客
返回

WPF 桌面应用:Log4net 日志系统集成指南

在桌面端开发中,日志不仅是调试的利器,更是定位用户端“运行崩溃”的唯一线索。Log4net 作为 .NET 生态中长盛不衰的日志框架,其强大的文件滚动更新(Rolling)功能非常适合桌面应用。


第一步:安装与基础配置

通过 NuGet 安装 log4net 后,在 App.config 中进行配置。

优化建议:避免直接将日志写在 D:// 根目录(这通常需要管理员权限)。建议使用相对路径或系统环境变量。

<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="Logs/AppLog.txt"/>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="5MB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>

    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingFileAppender"/>
    </root>
  </log4net>
</configuration>

第二步:启动配置监视

在项目的 Properties/AssemblyInfo.cs 中添加以下特性,确保配置自动加载:

[assembly: log4net.Config.XmlConfigurator(Watch = true)]

第三步:WPF 生命周期中的日志埋点

App.xaml.cs 中记录生命周期,这是追踪程序“是否正常关闭”的关键:

public partial class App : Application
{
    private static readonly ILog Log = LogManager.GetLogger(typeof(App));

    protected override void OnStartup(StartupEventArgs e)
    {
        Log.Info("================ 应用启动 ================");
        base.OnStartup(e);
        
        // 进阶:配置全局异常捕获
        SetupExceptionHandling();
    }

    private void SetupExceptionHandling()
    {
        // 捕获 UI 线程异常
        this.DispatcherUnhandledException += (s, e) => {
            Log.Fatal("UI线程未捕获异常", e.Exception);
            e.Handled = true; 
        };
    }

    protected override void OnExit(ExitEventArgs e)
    {
        Log.Info("================ 应用退出 ================");
        base.OnExit(e);
    }
}

第四步:业务逻辑中的调用

建议使用静态声明的方式引用 Logger,避免每次调用都重复获取,提高性能:

public partial class MainWindow : Window
{
    // 获取当前类的记录器
    private static readonly ILog Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

    public MainWindow()
    {
        InitializeComponent();
    }

    private void LogBtn_Click(object sender, RoutedEventArgs e)
    {
        try 
        {
            Log.Debug("点击了创建日志按钮");
            // 模拟业务逻辑
        }
        catch (Exception ex)
        {
            Log.Error("处理点击事件时发生异常", ex);
        }
    }
}

💡 核心知识点:日志级别的选型

Log4net 的级别是由低到高过滤的。如果你设置级别为 INFO,那么 DEBUG 信息将不会被记录。


总结

通过在 WPF 中集成 Log4net,你可以轻松实现:

  1. 自动切割:日志文件不会撑爆硬盘。
  2. 多级过滤:开发环境看 Debug,生产环境看 Info。
  3. 全链路追踪:配合全局异常捕获,告别“用户反馈闪退,开发者无从查起”的尴尬局面。


上一篇
WPF 权限控制实战:基于 RBAC 模型的优雅实现方案
下一篇
人工智能开发框架深度分析:2026 开发者选型指南