WPF 手撸插件 七 日志记录

news2024/11/23 23:02:19

1、环境日志这里使用的是log4net.

2、WPF全局捕获异常,代码如下。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows;
using AbstractionLayer;

namespace WPFIPluginDemo
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        public App()
        {
            // 处理UI线程异常
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
            // 处理非UI线程异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            // 处理并行库(TPL)中未捕获的异常,适用于捕获异步任务中发生的异常,例如使用 async 和 await 关键字的异步方法中的异常
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
        }

        private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            //适用于捕获异步任务中发生的异常,例如使用 async 和 await 关键字的异步方法中的异常
            errorLog.Error("并行库(TPL)中未捕获的异常:", e.Exception);
            e.SetObserved();
        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // 处理非UI线程异常
            MessageBox.Show("非UI线程异常: " + ((Exception)e.ExceptionObject).Message);
            
            // 在UI线程上显示错误消息
            Dispatcher.Invoke(() =>
            {
                MessageBox.Show(((Exception)e.ExceptionObject).Message, "应用程序错误", MessageBoxButton.OK, MessageBoxImage.Error);
            });
        }

        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            // 处理UI线程异常
            MessageBox.Show("UI线程异常: " + e.Exception.Message);
            e.Handled = true; // 标记异常已处理
        }
    }
}

3、通过NuGet添加log4net,如下图。

 4、项目中新增log4net配置文件,如下图。

4.1、将配置文件的“复制到输出目录”设置为“如果较新则复制”。如下图。

4.2、 log4net.config的文件内容如下。

<configuration>

	<configSections>
		<!-- log4net的定义 -->
		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
	</configSections>

	<log4net>
		<logger name="logerror">
			<level value="ERROR" />
			<appender-ref ref="ErrorAppender" />
		</logger>
		<logger name="loginfo">
			<level value="INFO" />
			<appender-ref ref="InfoAppender" />
		</logger>

		<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
			<param name="File" value="Log\\LogError\\" />
			<param name="AppendToFile" value="true" />
			<param name="MaxSizeRollBackups" value="100" />
			<param name="MaxFileSize" value="10240" />
			<param name="StaticLogFileName" value="false" />
			<param name="DatePattern" value="yyyyMMdd'.txt'" />
			<param name="RollingStyle" value="Date" />
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="%n异常时间:%d %n异常级别:%-5p%n异常内容:%m%n" />
			</layout>
			<!--< > = <> %n = 回车-->
		</appender>
		<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
			<param name="File" value="Log\\LogInfo\\" />
			<param name="AppendToFile" value="true" />
			<param name="MaxFileSize" value="10240" />
			<param name="MaxSizeRollBackups" value="100" />
			<param name="StaticLogFileName" value="false" />
			<param name="DatePattern" value="yyyyMMdd'.txt'" />
			<param name="RollingStyle" value="Date" />
			<layout type="log4net.Layout.PatternLayout">
				<param name="ConversionPattern" value="日志时间:%d %n日志级别:%-5p  %n日志内容:%m%n%n" />
			</layout>
		</appender>
	</log4net>
</configuration>

4.3、修改App.config,具体内容如下。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<configSections>
		<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
	</configSections>
	<log4net configSource="log4net.config" />
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

4.4、在AssemblyInfo.cs文件中添加“[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]”,整体代码如下。

using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
using log4net.Config;

// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("WPFIPluginDemo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("WPFIPluginDemo")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

//若要开始生成可本地化的应用程序,请设置
//.csproj 文件中的 <UICulture>CultureYouAreCodingWith</UICulture>
//例如,如果您在源文件中使用的是美国英语,
//使用的是美国英语,请将 <UICulture> 设置为 en-US。  然后取消
//对以下 NeutralResourceLanguage 特性的注释。  更新
//以下行中的“en-US”以匹配项目文件中的 UICulture 设置。

//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]


[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //主题特定资源词典所处位置
                                     //(未在页面中找到资源时使用,
                                     //或应用程序资源字典中找到时使用)
    ResourceDictionaryLocation.SourceAssembly //常规资源词典所处位置
                                              //(未在页面中找到资源时使用,
                                              //、应用程序或任何主题专用资源字典中找到时使用)
)]


// 程序集的版本信息由下列四个值组成: 
//
//      主版本
//      次版本
//      生成号
//      修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

5、设置程序启动时,写入信息日志,遇到异常时写入异常日志。示例代码如下。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using System.Windows;
using AbstractionLayer;
using log4net;

namespace WPFIPluginDemo
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {   
        // 用于记录信息日志
        private static readonly ILog log = LogManager.GetLogger("loginfo");
        // 用于记录错误信息日志
        private static readonly ILog errorLog = LogManager.GetLogger("logerror");

        public App()
        {
            // 处理UI线程异常
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
            // 处理非UI线程异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            // 处理并行库(TPL)中未捕获的异常,适用于捕获异步任务中发生的异常,例如使用 async 和 await 关键字的异步方法中的异常
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
            log.Info("程序启动成功。");

            throw new Exception("抛出异常");
        }

        private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            //适用于捕获异步任务中发生的异常,例如使用 async 和 await 关键字的异步方法中的异常
            errorLog.Error("并行库(TPL)中未捕获的异常:", e.Exception);
            e.SetObserved();
        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            // 处理非UI线程异常
            errorLog.Error("非UI线程异常:", ((Exception)e.ExceptionObject));
            
            // 显示错误消息给用户
            // 在UI线程上显示错误消息
            Dispatcher.Invoke(() =>
            {
                MessageBox.Show(((Exception)e.ExceptionObject).Message, "应用程序错误", MessageBoxButton.OK, MessageBoxImage.Error);
            });
        }

        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            // 处理UI线程异常
            errorLog.Error("UI线程异常:", e.Exception);
            e.Handled = true; // 标记异常已处理
        }
    }
}

6、写入的错误和信息日志如下图。

7、示例下载连接地址如下。

https://download.csdn.net/download/xingchengaiwei/89681849

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统架构设计师——系统性能

性能指标 计算机性能指标 操作系统性能指标 网络的性能指标 数据库的性能指标 数据库管理系统的性能指标 应用系统的性能指标 Web服务器的性能指标 性能计算 定义法 计算方法主要包括定义法、公式法、程序检测法和仪器检测法。这些方法分别通过直接获取理想数据、应用衍生出的…

【docker】docker 镜像仓库的管理

Docker 仓库&#xff08; Docker Registry &#xff09; 是用于存储和分发 Docker 镜像的集中式存储库。 它就像是一个大型的镜像仓库&#xff0c;开发者可以将自己创建的 Docker 镜像推送到仓库中&#xff0c;也可以从仓库中拉取所需的镜像。 Docker 仓库可以分为公共仓…

Jsoncpp的安装与使用

目录 安装Jsoncpp Jsoncpp的使用 Value类 构造函数 检测保存的数据类型 提取数据 对json数组的操作 对Json对象的操作 FastWriter类 Reader类 JsonCpp 是一个C库&#xff0c;用于解析和生成JSON数据。它支持解析JSON文件或字符串到C对象&#xff0c;以及将C对象序列…

MySQL的安装—>Mariadb的安装(day21)

该网盘链接有效期为7天&#xff0c;有需要评论区扣我&#xff1a; 通过网盘分享的文件&#xff1a;mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB&#xff0c;双击打开mar…

SprinBoot+Vue学生选课微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

python进阶篇-day03-学生管理系统与深浅拷贝

day03-学生管理系统-面向对象 魔术方法: __ dict __将对象的属性和属性值封装为字典 用字典的值实例化对象: 对象名(**字典) > 拆包 student.py """ 该文件记录的是: 学生类的信息. ​ 学生的属性如下:姓名, 性别, 年龄, 联系方式, 描述信息 ""&…

单片机-STM32 ADC应用(五)

1.ADC模数转换 模拟数字转换器即A/D转换器&#xff0c;或简称ADC&#xff0c;通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义&#xff0c;仅仅表示一个相对大小。故任何一个…

STM32学习记录-11-RTC实时时钟

1 Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 2 UTC/GMT GMT(Green…

量化面试题:什么是朴素贝叶斯分类器?

朴素贝叶斯分类器是一种基于贝叶斯定理的简单而有效的分类算法。它的核心思想是利用特征之间的条件独立性假设来进行分类。以下是朴素贝叶斯分类器的几个关键点&#xff1a; 贝叶斯定理&#xff1a;朴素贝叶斯分类器基于贝叶斯定理&#xff0c;该定理描述了在已知某些条件下&a…

名城优企游学活动走进龙腾半导体:CRM助力构建营销服全流程体系

8月29日&#xff0c;由纷享销客主办的“数字中国 高效增长——名城优企游学系列活动之走进龙腾半导体”研讨会在西安市圆满落幕&#xff0c;来自业内众多领袖专家参与本次研讨会&#xff0c;深入分享交流半导体行业的数字化转型实践&#xff0c;探讨行业数字化、智能化转型之路…

华大智造 否极泰来

甲辰年开年至今&#xff0c;华大智造&#xff08;688114.SH&#xff09;经历了上市以来“最漫长的季节”。 仅在这半年多时间里&#xff0c;这家已经实现全球化布局且能排位在行业最前列的中国生命科技企业&#xff0c;遭遇了几乎所有能遭遇的不利局面。 宏观环境&#xff0c…

前端代码提交前的最后防线:使用Husky确保代码质量

需求背景 我们通常会引入ESLint和Prettier这样的工具来帮助我们规范本地代码的格式。然而&#xff0c;这种格式化过程仅在本地有效&#xff0c;并且依赖于我们在VSCode中手动设置自动保存功能。如果团队成员忘记进行这样的配置&#xff0c;或者在没有格式化的情况下提交了代码…

GIS地理信息+智慧巡检技术解决方案(Word原件)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 3.系统功能设计 3.1.功能清单列表 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#x…

Datawhale X 李宏毅苹果书AI夏令营 Task1.2深度学习进阶详解

目录 一、批量梯度下降法&#xff08;Batch Gradient Descent&#xff0c;BGD&#xff09; 二、随机梯度下降法&#xff08;Stochastic Gradient Descent&#xff0c;SGD&#xff09; 三、动量法&#xff08;Momentum Method&#xff09; 四、自适应学习率的方法 五、并行…

微信小程序认证和备案

小程序备案的流程一般包括以下步骤‌&#xff1a; 准备备案所需材料‌&#xff1a;通常需要提供‌营业执照、法人的‌身份证、两个‌手机号和一个邮箱等资料。 ‌1 ‌登录‌微信公众平台‌&#xff1a;作为第一次开发微信小程序的服务商&#xff0c;需要通过微信公众平台申请…

JVM内存模型简述

JVM内存结构 虚拟机栈&#xff1a; 每个方法会在虚拟机栈中创建一个栈帧&#xff0c;存储这个方法的局部变量表&#xff0c;操作数栈&#xff0c;方法出口等信息。本地方法栈&#xff1a; 与虚拟机栈类似&#xff0c;只是虚拟机栈执行java方法&#xff0c;本地方法栈执行native…

工业园区智慧水务物联网平台建设方案

1. 项目背景与水资源现状 《工业园区智慧水务物联网平台建设方案》针对水资源分布不均、短缺严重的问题&#xff0c;提出了智慧水务物联网平台的建设方案&#xff0c;以应对漏损危害和提升水资源管理效率。 2. 水资源管理政策与目标 国家通过“水十条”和供水数据&#xff0…

基于yolov8的打架行为检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的打架行为检测系统&#xff0c;是当前公共安全领域的一项重要创新。YOLOv8作为最新的目标检测算法&#xff0c;以其高效、准确的性能&#xff0c;在各类图像和视频处理任务中表现出色。该系统利用YOLOv8的先进图像处理和机器学习算法框架&#xff0c;…

品牌知识产权维权的原因

在当今竞争激烈的商业环境中&#xff0c;品牌知识产权维权的重要性愈发凸显。品牌的价值不仅仅在于其产品或服务的质量&#xff0c;更在于其独特的标识、创新的技术以及丰富的文化内涵。而这些宝贵的资产&#xff0c;往往需要通过有效的知识产权保护来确保其安全。 品牌在发展的…

SI案例分享--考虑ESD保护二极管的差分线阻抗仿真

如下图所示&#xff0c;显示了利用CST电磁仿真软件构建的边沿耦合微带线的尺寸&#xff0c;按照 100 欧姆的差分线阻抗进行设计。由于差分线经常会通过连接器连接到电缆&#xff0c;因此极有可能发生 ESD 事件&#xff0c;该事件会在短时间内 &#xff08;< 1 ns&#xff09…