.NET Core整合log4net以及全局异常捕获实现
在使用log4net之前先安装log4net。这里操作很简单,通过nuget下载并安装log4net很方便。如下图。
- log4net配置
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <configSections>
- <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
- </configSections>
- <log4net>
- <!--定义输出到一个固定文件中-->
- <appender name="FileAppender" type="log4net.Appender.FileAppender">
- <file value="log/log.txt" />
- <appendToFile value="true" />
- <layout type="log4net.Layout.PatternLayout">
- <!--每条日志末尾的文字说明-->
- <header value="
- [============================应用程序日志开始============================ ]
- " />
- <footer value="
- [ ===========================应用程序日志结束=============================]
- " />
- <!--输出格式-->
- <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
- <conversionPattern value="%newline%newline记录时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
- </layout>
- </appender>
- <!--定义输出到文件中,循环创建日志文件,以日期命名-->
- <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
- <!--定义文件存放位置 保存当前日期的日志,当第二天新日志产生时会把当前日期的日志保存备份-->
- <file value="log/log" />
- <!--禁止覆盖原有文件,true:覆盖原有文件-->
- <appendToFile value="false" />
- <rollingStyle value="Date" />
- <!--以天为单位进行日志滚动,保存过去日期的日志-->
- <datePattern value="yyyy-MM-dd-HHmm".txt"" />
- <layout type="log4net.Layout.PatternLayout">
- <!--每条日志末尾的文字说明-->
- <header value="
- [============================应用程序日志开始============================ ]
- " />
- <footer value="
- [ ===========================应用程序日志结束=============================]
- " />
- <!--输出格式-->
- <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
- <conversionPattern value="%newline%newline记录时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
- </layout>
- </appender>
- <!--定义输出到控制台命令行中-->
- <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
- <layout type="log4net.Layout.PatternLayout">
- <!--输出格式-->
- <conversionPattern value="%newline时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
- </layout>
- </appender>
- <!--定义以不同颜色输出到控制台-->
- <appender name="ManagedColoredConsoleAppender" type="log4net.Appender.ManagedColoredConsoleAppender">
- <mapping>
- <level value="ERROR" />
- <foreColor value="DarkRed" />
- </mapping>
- <mapping>
- <level value="WARN" />
- <foreColor value="Yellow" />
- </mapping>
- <mapping>
- <level value="INFO" />
- <foreColor value="DarkGray" />
- </mapping>
- <mapping>
- <level value="DEBUG" />
- <foreColor value="DarkGreen" />
- </mapping>
- <layout type="log4net.Layout.PatternLayout">
- <!--输出格式-->
- <conversionPattern value="%newline时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
- </layout>
- </appender>
- <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为log4net.mdb(可以自定义路径)-->
- <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
- <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=logDB/log4net.mdb" />
- <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
- <!--定义各个参数-->
- <parameter>
- <parameterName value="@logDate" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%date" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@thread" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%thread" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@logLevel" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%level" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@logger" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%logger" />
- </layout>
- </parameter>
- <parameter>
- <parameterName value="@message" />
- <dbType value="String" />
- <size value="240" />
- <layout type="log4net.Layout.PatternLayout">
- <conversionPattern value="%message" />
- </layout>
- </parameter>
- </appender>
- <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
- <root>
- <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
- 如果没有定义LEVEL的值,则缺省为DEBUG-->
- <level value="ALL"/>
- <!--文件形式记录日志-->
- <appender-ref ref="RollingFileAppender" />
- <!--控制台控制显示日志-->
- <!--<appender-ref ref="ConsoleAppender" />-->
- <!--控制台以不同颜色显示日志-->
- <appender-ref ref="ManagedColoredConsoleAppender" />
- <!--定义输出到数据库中。 如果不启用相应的日志记录,可以通过这种方式注释掉-->
- <!--<appender-ref ref="AdoNetAppender_Access" />-->
- </root>
- </log4net>
- </configuration>
- 日志帮助类——Logger
- using System;
- using log4net;
- using log4net.Repository;
- namespace wxApp.Code.Creater.Api.Common
- {
- public static class Logger
- {
- private static ILoggerRepository loggerRepository;
- public static ILoggerRepository LoggerRepository { get; private set; }
- public static ILog Log { get; private set; }
- /// <summary>
- /// 静态构造函数,程序启动时自动执行
- /// </summary>
- //static Logger()
- //{
- // LoggerRepository = CreateLoggerRepository();
- // LoadLog4NetConfig();
- //}
- /// <summary>
- /// 初始化日志
- /// </summary>
- /// <returns></returns>
- public static void LoadLogger()
- {
- LoggerRepository = CreateLoggerRepository();
- LoadLog4NetConfig();
- }
- /// <summary>
- /// 创建日志仓储实例
- /// </summary>
- /// <returns></returns>
- private static ILoggerRepository CreateLoggerRepository()
- {
- loggerRepository = loggerRepository ?? LogManager.CreateRepository("GlobalExceptionHandler"); // 单例
- return loggerRepository;
- }
- /// <summary>
- /// 加载log4net配置
- /// </summary>
- private static void LoadLog4NetConfig()
- {
- // 配置log4net
- log4net.Config.XmlConfigurator.Configure(loggerRepository, new System.IO.FileInfo(System.IO.Directory.GetCurrentDirectory() + "/Config/log4net.config"));
- // 创建log实例
- Log = LogManager.GetLogger(loggerRepository.Name, AppDomain.CurrentDomain.FriendlyName);
- Log.Info("已加载日志配置");
- }
- }
- }
- 全局异常捕获过滤器
全局异常捕获过滤器的代码如下,代码中并没有对异常做处理,只是直接输出到日志中,可以进一步对日志信息做处理使日志信息可读性更强。
- using Microsoft.AspNetCore.Mvc.Filters;
- namespace wxApp.Code.Creater.Api.Common
- {
- public class HttpGlobalExceptionFilter : IExceptionFilter
- {
- public void OnException(ExceptionContext context)
- {
- Logger.Log.Error("全局异常过滤器捕获的异常:", context.Exception);
- }
- }
- }
- 指定日志提供程序为log4net以及全局异常捕获
在Startup类的ConfigureServices方法中指定日志提供程序,代码如下。
- // 配置日志
- services.AddLogging(logConfig => {
- //log4net.Config.XmlConfigurator.Configure(Common.Logger.LoggerRepository);
- Common.Logger.LoadLogger();
- });
代码中Common.Logger.LoggerRepository为日志帮助类——Logger中创建的日志仓储实例。
在Startup类的ConfigureServices方法中添加全局异常捕获过滤器,代码如下。
- // 添加全局异常捕获
- services.AddMvc(option =>
- {
- option.Filters.Add<Common.HttpGlobalExceptionFilter>();
- });
ConfigureServices方法中完整代码如下。
.NET Core整合log4net以及全局异常捕获实现的更多相关文章
- .NET Core整合log4net以及全局异常捕获实现2
Startup代码 public static ILoggerRepository repository { get; set; } public Startup(IConfiguration con ...
- Spring-MVC开发之全局异常捕获全面解读
异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...
- gRPC全局异常捕获
gRPC全局异常捕获 引 一般的.net项目比如ASP.NET.控制台程序.Windows服务.桌面程序等都会有framework自带的全局异常捕获机制.ASP.NET的ExceptionFilter ...
- MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
public class BaseController : Controller { /// <summary> /// Called after the action method is ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- Asp.Net MVC3(三)-MvcApp实现全局异常捕获
定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...
- 使用spring利用HandlerExceptionResolver实现全局异常捕获
最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...
- .Net下的全局异常捕获问题
全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
随机推荐
- Filter,Listener(转)
一.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个reques ...
- Android分享介绍
一.使用系统分享 public void execShare(Activity context,String title,String text){ Intent intent = new Inten ...
- vultr的80端口?
1.查看防火墙版本号firewall-cmd --version2.查看防火墙状态firewall-cmd --state3.添加80端口的权限firewall-cmd --zone=public - ...
- idea 搭建 SpringBoot 集成 mybatis
编译器:IDEA2018.2.3 环境:win10,jdk1.8,maven3.4 数据库:mysql 5.7 备注:截图较大,如果看不清,可以在图片上右键=>在新标签页中打开 查看高清大图 ...
- mongose TypeError: Cannot read property 'findOne' of undefined
最近在node的一个项目中,需要在model的一个数据表中写一个钩子函数去调用另外一个文件中的方法,一开始我采用了将此方法放入到global中,直接从global.meteod这样去获取.后来我又尝试 ...
- uinty3d导入错误问题解决
导入第一被复制到文件unity3d在相应的文件夹的安装文件夹.回归后,unity3d软体.正确的选择"输入". 版权声明:本文博主原创文章.博客,未经同意不得转载.
- 3 Task中的一些枚举 创建时候的、continue时候的
创建时常用的枚举: None.PreferFairness.LongRunning.AttacthedToParent.DenyChildAttach.HideScheduler AttacthedT ...
- C# WPF QQ新消息托盘悬浮窗效果实现
原文:C# WPF QQ新消息托盘悬浮窗效果实现 今天在做一个项目的时候需要这么一个效果,但是网上找了一会发现并没有现成的给我参考(复制),但是呢,我千(到)辛(处)万(抄)苦(袭)想(复)破(制)头 ...
- 使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中
原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between- ...
- 机器学习: TensorFlow with MLP 笑脸识别
Tensor Flow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数 ...