.NET Core整合log4net以及全局异常捕获实现

一、前言

log4net是一个比较知名的日志提供程序,.NET Core发布1.0的时候log4net已经给予支持;不过,.NET Core官方推荐的日志提供程序中却没有log4net,不知道内在原因是啥。用.NET Core 写了一个小工具,在这个小工具中使用了log4net来进行日志记录。文章主要记录.NET Core中如何整合log4net以及全局异常捕获的实现。

二、准备

在使用log4net之前先安装log4net。这里操作很简单,通过nuget下载并安装log4net很方便。如下图。

.NET Core整合log4net以及全局异常捕获实现_第1张图片

三、实现

a、log4net配置

新建一个配置文件并命名为log4net.config用来保存log4net的配置。配置好的log4net配置如下。



  
    

b、日志帮助类——Logger

把log4net加载以及常用方法封装在日志帮助类——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; }

        /// 
        /// 静态构造函数,程序启动时自动执行
        /// 
        //static Logger()
        //{
        //    LoggerRepository = CreateLoggerRepository();
        //    LoadLog4NetConfig();
        //}

        /// 
        /// 初始化日志
        /// 
        /// 
        public static void LoadLogger()
        {
            LoggerRepository = CreateLoggerRepository();
            LoadLog4NetConfig();
        }

        /// 
        /// 创建日志仓储实例
        /// 
        /// 
        private static ILoggerRepository CreateLoggerRepository()
        {
            loggerRepository = loggerRepository ?? LogManager.CreateRepository("GlobalExceptionHandler"); // 单例
            return loggerRepository;
        }
        
        /// 
        /// 加载log4net配置
        /// 
        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("已加载日志配置");
        }
    }
}

c、全局异常捕获过滤器

全局异常捕获过滤器的代码如下,代码中并没有对异常做处理,只是直接输出到日志中,可以进一步对日志信息做处理使日志信息可读性更强。

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);
        }
    }
}

d、指定日志提供程序为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();
            });

ConfigureServices方法中完整代码如下。

.NET Core整合log4net以及全局异常捕获实现_第2张图片

e、应用

.NET Core整合log4net以及全局异常捕获实现_第3张图片

你可能感兴趣的:(.NET,Core)