Asp.Net Core中简单使用日志组件log4net
本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例。
1.首先新建一个ASP.NET Core空项目
2.通过Nuget包管理器安装下面两个包
Install-Package log4net
Install-Package Microsoft.Extensions.Logging.Log4Net.AspNetCore
3.在项目根目录下新建log4net的配置文件log4net.config,并将其设置为始终复制。
1 <log4net> 2 <!--根配置--> 3 <root> 4 <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG --> 5 <level value="ERROR"/> 6 <level value="WARN"/> 7 <level value="INFO"/> 8 <level value="DEBUG"/> 9 <appender-ref ref="ErrorLog" /> 10 <appender-ref ref="WarnLog" /> 11 <appender-ref ref="InfoLog" /> 12 <appender-ref ref="DebugLog" /> 13 </root> 14 <!-- 错误 Error.log--> 15 <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender"> 16 <!--目录路径,可以是相对路径或绝对路径--> 17 <param name="File" value="D:\logs\"/> 18 <!--文件名,按日期生成文件夹--> 19 <param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/> 20 <!--追加到文件--> 21 <appendToFile value="true"/> 22 <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> 23 <rollingStyle value="Composite"/> 24 <!--写到一个文件--> 25 <staticLogFileName value="false"/> 26 <!--单个文件大小。单位:KB|MB|GB--> 27 <maximumFileSize value="200MB"/> 28 <!--最多保留的文件数,设为"-1"则不限--> 29 <maxSizeRollBackups value="-1"/> 30 <!--日志格式--> 31 <layout type="log4net.Layout.PatternLayout"> 32 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> 33 </layout> 34 <filter type="log4net.Filter.LevelRangeFilter"> 35 <param name="LevelMin" value="ERROR" /> 36 <param name="LevelMax" value="ERROR" /> 37 </filter> 38 </appender> 39 40 <!-- 警告 Warn.log--> 41 <appender name="WarnLog" type="log4net.Appender.RollingFileAppender"> 42 <!--目录路径,可以是相对路径或绝对路径--> 43 <param name="File" value="D:\logs\"/> 44 <!--文件名,按日期生成文件夹--> 45 <param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/> 46 <!--追加到文件--> 47 <appendToFile value="true"/> 48 <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> 49 <rollingStyle value="Composite"/> 50 <!--写到一个文件--> 51 <staticLogFileName value="false"/> 52 <!--单个文件大小。单位:KB|MB|GB--> 53 <maximumFileSize value="200MB"/> 54 <!--最多保留的文件数,设为"-1"则不限--> 55 <maxSizeRollBackups value="-1"/> 56 <!--日志格式--> 57 <layout type="log4net.Layout.PatternLayout"> 58 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> 59 </layout> 60 <filter type="log4net.Filter.LevelRangeFilter"> 61 <param name="LevelMin" value="WARN" /> 62 <param name="LevelMax" value="WARN" /> 63 </filter> 64 </appender> 65 66 <!-- 信息 Info.log--> 67 <appender name="InfoLog" type="log4net.Appender.RollingFileAppender"> 68 <!--目录路径,可以是相对路径或绝对路径--> 69 <param name="File" value="D:\logs\"/> 70 <!--文件名,按日期生成文件夹--> 71 <param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/> 72 <!--追加到文件--> 73 <appendToFile value="true"/> 74 <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> 75 <rollingStyle value="Composite"/> 76 <!--写到一个文件--> 77 <staticLogFileName value="false"/> 78 <!--单个文件大小。单位:KB|MB|GB--> 79 <maximumFileSize value="200MB"/> 80 <!--最多保留的文件数,设为"-1"则不限--> 81 <maxSizeRollBackups value="-1"/> 82 <!--日志格式--> 83 <layout type="log4net.Layout.PatternLayout"> 84 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> 85 </layout> 86 <filter type="log4net.Filter.LevelRangeFilter"> 87 <param name="LevelMin" value="INFO" /> 88 <param name="LevelMax" value="INFO" /> 89 </filter> 90 </appender> 91 92 <!-- 调试 Debug.log--> 93 <appender name="DebugLog" type="log4net.Appender.RollingFileAppender"> 94 <!--目录路径,可以是相对路径或绝对路径--> 95 <param name="File" value="D:\logs\"/> 96 <!--文件名,按日期生成文件夹--> 97 <param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/> 98 <!--追加到文件--> 99 <appendToFile value="true"/> 100 <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> 101 <rollingStyle value="Composite"/> 102 <!--写到一个文件--> 103 <staticLogFileName value="false"/> 104 <!--单个文件大小。单位:KB|MB|GB--> 105 <maximumFileSize value="200MB"/> 106 <!--最多保留的文件数,设为"-1"则不限--> 107 <maxSizeRollBackups value="-1"/> 108 <!--日志格式--> 109 <layout type="log4net.Layout.PatternLayout"> 110 <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> 111 </layout> 112 <filter type="log4net.Filter.LevelRangeFilter"> 113 <param name="LevelMin" value="DEBUG" /> 114 <param name="LevelMax" value="DEBUG" /> 115 </filter> 116 </appender> 117 118 </log4net>
log4net配置参数此处不多赘述,只针对日志的输出格式参数conversionPattern配置做简要说明。
%M 输出日志方法名 %m 输出日志消息内容 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个换行符 %l或%L 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 %c 输出日志信息所属的类的全名 %d 输出完整的日志时间点的日期时间,支持自定义格式。比如:%d{HH:mm:ss},输出类似:22:10:28 %f 输出日志信息所属的类的类名
4.在Program中使用log4net输出自定义日志内容
1 using log4net; 2 3 var builder = WebApplication.CreateBuilder(args); 4 //注入Log4Net 5 builder.Services.AddLogging(cfg => 6 { 7 cfg.AddLog4Net(); 8 //默认的配置文件路径是在根目录,且文件名为log4net.config 9 //如果文件路径或名称有变化,需要重新设置其路径或名称 10 //比如在项目根目录下创建一个名为cfg的文件夹,将log4net.config文件移入其中,并改名为log.config 11 //则需要使用下面的代码来进行配置 12 //cfg.AddLog4Net(new Log4NetProviderOptions() 13 //{ 14 // Log4NetConfigFileName = "cfg/log.config", 15 // Watch = true 16 //}); 17 }); 18 var app = builder.Build(); 19 //访问根页面时 20 app.MapGet("/", (ILogger<Program> logger) => 21 { 22 logger.LogInformation("logger:测试一下Log4Net=》Info"); 23 return "Hello World!"; 24 }); 25 //访问test页面时 26 app.MapGet("/test", () => 27 { 28 var log = LogManager.GetLogger(typeof(Program)); 29 log.Info("log:这是一条普通日志信息"); 30 }); 31 app.Run();
5.将项目运行起来,即可发现日志文件已生成
6.扩展使用:使用简单工厂模式IOC注入到自定义类中使用
新建一个ITestLog4Net接口文件,并为其定义一个Log方法。
1 public interface ITestLog4Net 2 { 3 public void Log(); 4 }
并且新建一个TestLog4Net的自定义类,继承于ITestLog4Net,并实现该Log方法。
1 public class TestLog4Net : ITestLog4Net 2 { 3 private readonly ILogger<TestLog4Net> _logger; 4 public TestLog4Net(ILogger<TestLog4Net> logger) 5 { 6 _logger = logger; 7 _logger.LogInformation("ctor测试一下Log4Net=》Info"); 8 } 9 10 11 public void Log() 12 { 13 _logger.LogInformation("测试一下Log4Net=》Info"); 14 } 15 }
在Program中注入我们的自定义类TestLog4Net
1 builder.Services.AddTransient<ITestLog4Net, TestLog4Net>();
使用方法
1 var testLog4Net = app.Services.GetService<ITestLog4Net>()!; 2 testLog4Net.Log();
或者
1 var services = new ServiceCollection()!; 2 var provider = services.BuildServiceProvider()!; 3 var testLog4Net = provider.GetService<ITestLog4Net>()!; 4 testLog4Net.Log();
其中,使用下面这种写法,将会收到一个编译警告信息。
warning ASP0000: Calling 'BuildServiceProvider' from application code results in an additional copy of singleton services being created. Consider alternatives such as dependency injecting services as parameters to 'Configure'.
推荐使用上面的写法,百度之后,得到的答案是:不要通过调用BuildServiceProvider()这个方法应该只被 Host 调用一次。重复的服务提供者可能会导致一些意想不到的错误。如果有哪位大佬知道具体原因,请告知一下,谢谢!
Tips:代码中的感叹号!表示该对象不会为空,一定要确保该对象不会为空才能这样写,这是C#10中的新特性。
本文来自博客园,作者:摇曳de风筝,转载请注明原文链接:https://www.cnblogs.com/pinzi/p/15588766.html