- A+
所属分类:.NET技术
本篇讲述使用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,打印效果