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,你可以轻松实现:
- 自动切割:日志文件不会撑爆硬盘。
- 多级过滤:开发环境看 Debug,生产环境看 Info。
- 全链路追踪:配合全局异常捕获,告别“用户反馈闪退,开发者无从查起”的尴尬局面。
WPF 桌面应用:Log4net 日志系统集成指南
https://sw.rscclub.website/posts/csharplog4netszsy/