asp.net core使用 log4net全局日志处理

一、引用类库:

  1、 Microsoft.Extensions.Logging.Log4Net.AspNetCore

  2、log4net.AspNetCore

二、配置 log4net.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
    <appender name="DebugAppender" type="log4net.Appender.DebugAppender" >
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
        </layout>
    </appender>
    <!--指定日记记录方式,以滚动文件的方式(文件记录)-->
    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
        <!--日志路径-->
        <file value="log\log.txt" />
        <!--是否是向文件中追加日志-->
        <appendToFile value="true" />
        <!--log保留天数-->
        <param name= "MaxSizeRollBackups" value= "10"/>
        <!--每个文件最大3M-->
        <param name="maximumFileSize" value="3MB" />
        <!--日志根据日期滚动-->
        <param name="RollingStyle" value="Date" />
        <!--日志文件名格式为:logs_20080831.log-->
        <param name="DatePattern" value="&quot;logs_&quot;yyyyMMdd&quot;.log&quot;" />
        <!--日志文件名是否是固定不变的-->
        <param name="StaticLogFileName" value="false" />
        <!--布局-->
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date %5level %logger.%method [%line] - MESSAGE: %message%newline %exception" />
        </layout>
    </appender>
    <root>
        <level value="ALL"/>
        <appender-ref ref="DebugAppender" />
        <appender-ref ref="RollingFile" />
    </root>
</log4net>

三、创建自己的 MyExceptionFilterAttribute并继承 ExceptionFilterAttribute 该抽象类,依赖注入日志对象 logger

public class MyExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly ILogger<MyExceptionFilterAttribute> _logger;        
        /// <summary>
        /// 通过构造函数的方式,依赖注入日志对象
        /// </summary>
        /// <param name="logger"></param>
        public MyExceptionFilterAttribute(ILogger<MyExceptionFilterAttribute> logger)
        {
            this._logger = logger;
        }
        public override void OnException(ExceptionContext context)
        {
            // 判断是否被处理过
            if (!context.ExceptionHandled)
            {
                context.ExceptionHandled = true;
                var str = $"异常:{context.HttpContext.Request.Path}{context.Exception.Message}";
                // 输出到控制台
                Console.WriteLine(str);
                // 写入文本日志(或者是记录到数据库等....)
                _logger.LogWarning(str);
                if (context.HttpContext.Request.Method == "GET")
                {
                    // 如果是 get请求,则跳转页面
                }
                else
                {
                    // 如果是post 则都是ajax请求,则返回json数据格式,输出自定义或者约定好的格式
                    context.Result = new JsonResult(new { Result = false, Message = "请求出现错误,请联系管理员" });
                }
            }
        }
    }

四、在Program.cs配置使用log4net

public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .ConfigureLogging((context, loggingBuilder) =>
            {
                loggingBuilder.AddFilter("System", LogLevel.Warning);
                loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);
                // 使用log4net
                loggingBuilder.AddLog4Net();
            })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

五、在Startup.cs ConfigureServices方法里面注册全局Filters错误日志处理

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews(options=> 
            {
                // 全局注册,全局生效
                options.Filters.Add(typeof(MyExceptionFilterAttribute));
            });
        }

这样系统都可以统一处理异常。避免代码中到处都是try catch,开发人员多,写出来的日志格式等不统一,错误日志漏处理等现象。

posted @ 2021-01-13 23:49  changsen.wang  阅读(124)  评论(0编辑  收藏