.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. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...
随机推荐
- Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(上)
原文:Expression Blend 的点滴(4)--创建类似iPhone屏幕锁控件(上) 本篇文章,最终效果图: 当然,不只是一个UI而已,如果只是一张图片,那专业的设计师能做出更出色的效果.在 ...
- 二叉堆(binary heap)—— 优先队列的实现
二叉堆因为对应着一棵完全二叉树,因而可以通过线性数组的方式实现. 注意,数组第 0 个位置上的元素,作为根,还是第 1 个位置上的元素作为根? 本文给出的实现,以数组第 1 个位置上的元素作为根,则其 ...
- 【noip模拟】太空电梯 贪心
题目大意 人数n,电梯载重k,电梯限制人数2,给出每个人的体重v,求按照怎样的顺序排队电梯运送的次数越多. 题解 排序后,每次都先选择最小的,然后看最大的上来是否超出载重, 若超出,则这两个对答案贡献 ...
- 远程ssh执行命令时提示找不到命令
最开始的时候碰到这种问题,是在hadoop003上配置了jdk1.8, 在hadoop002上执行ssh hadoop003 java -version提示没有命令,先ssh hadoop003然后执 ...
- visual studio 2015安装win10 SDK文件校验错误的解决方法
这段时间想看一下UWP开发,于是下载了visual 2015 update1社区版,但是在安装完成时提示,windows 10 sdk文件校验码错误,如下图(图片是借用的,我当时没有截屏,错误号是一样 ...
- Arcgis api for javascript学习笔记(4.5版本)-三维地图实现弹窗功能
1. 对于Graphic对象,在初始化Graphic对象时设置popupTemplate属性,即可实现点击Graphic时显示弹窗. <!DOCTYPE html> <html> ...
- Maven打包不打test,Maven中-DskipTests和-Dmaven.test.skip=true的区别
在使用mvn package进行编译.打包时,Maven会执行src/test/java中的JUnit测试用例, 有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip ...
- Android--MVP设计模式实践
MVP设计模式是android开发讨论的很火的一个话题,我对设计模式也有一些拙见,为了实践我的一些想法,我在我最新开发的产品中将我心目中的MVP设计模式进行了实践,最后得到了这样的架构. 特点:简单, ...
- Android TV开发总结(七)构建一个TV app中的剧集列表控件
原文:Android TV开发总结(七)构建一个TV app中的剧集列表控件 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必转载 ...
- A熟知SP.NET---WebForms UnobtrusiveValidationMode 必须“jquery”ScriptResourceMapping。
我相信,有过ASP.NET人们学习经验RequiredFieldValidator控制(验证非空控制)一定不会陌生,禁止控制输入定义的内容的作用(该属性InitialValue的值.属性默认值为空字符 ...