• .Net Core 5.x Api开发笔记 基础日志(Log4Net)(八)


    本篇讲述使用Log4Net日志的基础用法

    1,在项目中引入如下包文件,版本选择最新稳定版即可

    1 <PackageReference Include="log4net" Version="2.0.12" />
    2 <PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="5.0.0" />

    2,在项目根目录加入Log4net.config 配置文件 (注意:别忘了将文件,右键---属性--始终复制)

    3,Log4net.config 配置文件,这里只展示Debug日志类型,其他几个日志类型都一样,照搬就行

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <log4net>
     3     <!-- 将日志以回滚文件的形式写到文件中 -->
     4     <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
     5     <!--Error-->
     6     <!--Info-->
     7     <!--WARN-->
     8     
     9     <!--Debug-->
    10     <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
    11         <!--不加utf-8编码格式,中文字符将显示成乱码-->
    12         <param name="Encoding" value="utf-8" />
    13         <!--定义文件存放位置-->
    14         <file value="Log/Debug/debug.log"/>
    15         <!--是否追加到文件-->
    16         <appendToFile value="true" />
    17         <!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
    18         <rollingStyle value="Date" />
    19         <!--是否保存日志文件的扩展名-->
    20         <PreserveLogFileNameExtension value="true" />
    21         <!--日志文件名是否为静态-->
    22         <StaticLogFileName value="false"/>
    23         <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
    24         <datePattern value="yyyyMMdd" />
    25         <!--最多产生的日志文件数,超过则只保留最新的n+1个-->
    26         <maxSizeRollBackups value="1" />
    27         <!--每个文件的大小,只在混合方式与文件大小方式下使用,超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入,没带数字最晚写入-->
    28         <maximumFileSize value="256MB" />
    29         <!--多线程时采用最小锁定 不锁定文本文件,防止多线程时不能写Log-->
    30         <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    31         <!--布局(向用户显示最后经过格式化的输出信息)-->
    32         <layout type="log4net.Layout.PatternLayout">
    33             <conversionPattern value="%date| %-5level %c %newline%message%newline--------------------------------%newline" />
    34         </layout>
    35         <!--过滤设置,LevelRangeFilter为使用的过滤器。-->
    36         <filter type="log4net.Filter.LevelRangeFilter">
    37             <levelMin value="DEBUG" />
    38             <levelMax value="DEBUG" />
    39         </filter>
    40     </appender>
    41     <!--Debug-->
    42 
    43     <root>
    44         <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF -->
    45         <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 -->
    46         <!-- 如果没有定义LEVEL的值,则缺省为DEBUG -->
    47         <level value="ALL" />
    48         <!-- 按日期切分日志文件,并将日期作为日志文件的名字 -->
    49         <appender-ref ref="ErrorLog" />
    50         <appender-ref ref="InfoLog" />
    51         <appender-ref ref="WarnLog" />
    52         <appender-ref ref="DebugLog" />
    53     </root>
    54 </log4net>

    4,在 Program.cs 文件中全局配置日志

     1 public static IHostBuilder CreateHostBuilder(string[] args) =>
     2     Host.CreateDefaultBuilder(args)
     3         .ConfigureWebHostDefaults(webBuilder =>
     4         {
     5             webBuilder.UseStartup<Startup>()
     6             .ConfigureLogging((hostingContext, builder) =>
     7             {
     8                 //1.过滤掉系统默认的一些日志
     9                 //2.这里配置后,appsettings.json中的Logging配置将失效
    10                 builder.AddFilter("System", LogLevel.Error);     //只有错误时才打印日志
    11                 builder.AddFilter("Microsoft", LogLevel.Error);  //只有错误时才打印日志
    12                 builder.AddFilter("Microsoft.Hosting.Lifetime", LogLevel.Error);  //只有错误时才打印日志
    13                 builder.AddFilter("MyShopApi", LogLevel.Debug);  //自定义项目过滤级别,使用项目命名空间
    14 
    15                 //3.清除console控制台打印的日志,注释改行后控制台也会同步打印日志
    16                 //builder.ClearProviders();
    17 
    18                 //4.默认log4net.confg
    19                 //Windows环境不区分大小写,这么写为了适应Linux环境
    20                 builder.AddLog4Net(Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config"));
    21             });
    22         });

    5,同样,如果不在 Program.cs 入口中配置日志级别,则系统默认使用appsettings.json配置文件的日志级别

     1   "Logging": {
     2     "LogLevel": {
     3       "Default": "Information", //默认级别
     4       "MyShopApi": "Debug", //使用项目命名空间  自定义项目过滤级别
     5       "Microsoft": "Error", //注释该行后,将不打印系统日志(或者使用高日记级别也不会打印基础系统信息)
     6       "System": "Error",    //注释该行后,将不打印系统日志(或者使用高日记级别也不会打印基础系统信息)
     7       "Microsoft.Hosting.Lifetime": "Error" //注释该行后,将不打印系统日志(或者使用高日记级别也不会打印基础系统信息)
     8     },
     9     "Log4Net": {
    10       "Name": "MyShopApi"
    11     }
    12   },
    13   "AllowedHosts": "*",

    6,用法1,使用构造函数注入,红色加粗部分

     1 [Route("api/[controller]/[action]")]
     2 [ApiController]
     3 public class UserController : ControllerBase
     4 {
     5     private readonly ILogger<UserController> logger;
     6 
     7     public UserController(IUserService _userService,ILogger<UserController> _logger)
     8     {
     9         userService = _userService;
    10         this.logger = _logger;
    11     }
    12     
    13     。。。。
    14     
    15     [HttpPost]
    16     public async Task<IActionResult> GetUserInfo()
    17     {
    18         //测试日志
    19         this.logger.LogInformation("this is logInfo");
    20         this.logger.LogError("this is logerror");
    21         this.logger.LogDebug("this is debug");
    22         this.logger.LogWarning("this is warning");
    23         this.logger.LogTrace("this is trace");
    24     }

    7,用法2,主要用在中间件或过滤器中,日志打印效果同上

     1 public class ExceptionHandlerMid
     2 {
     3     private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(ExceptionHandlerMid));
     4     private readonly RequestDelegate _next;
     5 
     6     public ExceptionHandlerMid(RequestDelegate next)
     7     {
     8         this._next = next;
     9     }
    10     
    11     
    12     private async Task HandleExceptionAsync(HttpContext context, Exception ex)
    13     {
    14         if (ex == null) return;
    15 
    16         Console.WriteLine($"异常消息:{ex.GetBaseException()}");
    17         log.Error(ex.GetBaseException().ToString());
    18     }
    19 }

    8,打印效果

     

    作者:PeterZhang
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    .NET设计模式系列文章
    [转]给年轻工程师的十大忠告
    [你必须知道的.NET]第二十回:学习方法论
    写给开发者看的关系型数据库设计
    AjaxPro使用说明
    Spring.Net入门篇(一) [转]
    [从设计到架构] 必须知道的设计模式
    4月1日SharePoint Designer将开始免费
    12月累计更新的一个导出导入网站的问题在2月累计更新中修复了
    修复错误1093 “Unable to get the private bytes memory limit for the W3WP process”
  • 原文地址:https://www.cnblogs.com/peterzhang123/p/15145365.html
Copyright © 2020-2023  润新知