685 字
3 分钟
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 信息将不会被记录。

  • DEBUG: 内部调试细节(开发期使用)。
  • INFO: 关键业务流程(用户登录、开始下载、完成支付)。
  • WARN: 异常但可自动修复的情况(网络瞬时抖动、配置项缺失使用默认值)。
  • ERROR: 业务失败但程序不崩溃(数据保存失败、图片加载404)。
  • FATAL: 毁灭性打击(数据库连接失败、内存溢出),通常伴随程序闪退。

总结#

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

  1. 自动切割:日志文件不会撑爆硬盘。
  2. 多级过滤:开发环境看 Debug,生产环境看 Info。
  3. 全链路追踪:配合全局异常捕获,告别“用户反馈闪退,开发者无从查起”的尴尬局面。
WPF 桌面应用:Log4net 日志系统集成指南
https://sw.rscclub.website/posts/csharplog4netszsy/
作者
杨月昌
发布于
2022-11-18
许可协议
CC BY-NC-SA 4.0