Asp.Net Core中简单使用日志组件log4net
2021/11/22 17:11:55
本文主要是介绍Asp.Net Core中简单使用日志组件log4net,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例。
1.首先新建一个ASP.NET Core空项目
2.通过Nuget包管理器安装下面两个包
log4net
Microsoft.Extensions.Logging.Log4Net.AspNetCore
3.在项目根目录下新建log4net的配置文件log4net.config,并将其设置为始终复制。
<?xml version="1.0" encoding="utf-8" ?> <log4net> <!--根配置--> <root> <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG --> <level value="ERROR"/> <level value="WARN"/> <level value="INFO"/> <level value="DEBUG"/> <appender-ref ref="ErrorLog" /> <appender-ref ref="WarnLog" /> <appender-ref ref="InfoLog" /> <appender-ref ref="DebugLog" /> </root> <!-- 错误 Error.log--> <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender"> <!--目录路径,可以是相对路径或绝对路径--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夹--> <param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--写到一个文件--> <staticLogFileName value="false"/> <!--单个文件大小。单位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件数,设为"-1"则不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR" /> <param name="LevelMax" value="ERROR" /> </filter> </appender> <!-- 警告 Warn.log--> <appender name="WarnLog" type="log4net.Appender.RollingFileAppender"> <!--目录路径,可以是相对路径或绝对路径--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夹--> <param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--写到一个文件--> <staticLogFileName value="false"/> <!--单个文件大小。单位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件数,设为"-1"则不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="WARN" /> <param name="LevelMax" value="WARN" /> </filter> </appender> <!-- 信息 Info.log--> <appender name="InfoLog" type="log4net.Appender.RollingFileAppender"> <!--目录路径,可以是相对路径或绝对路径--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夹--> <param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--写到一个文件--> <staticLogFileName value="false"/> <!--单个文件大小。单位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件数,设为"-1"则不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> </appender> <!-- 调试 Debug.log--> <appender name="DebugLog" type="log4net.Appender.RollingFileAppender"> <!--目录路径,可以是相对路径或绝对路径--> <param name="File" value="C:\logs\"/> <!--文件名,按日期生成文件夹--> <param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/> <!--追加到文件--> <appendToFile value="true"/> <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]--> <rollingStyle value="Composite"/> <!--写到一个文件--> <staticLogFileName value="false"/> <!--单个文件大小。单位:KB|MB|GB--> <maximumFileSize value="200MB"/> <!--最多保留的文件数,设为"-1"则不限--> <maxSizeRollBackups value="-1"/> <!--日志格式--> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="[%d{HH:mm:ss}]%m%n"/> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="DEBUG" /> <param name="LevelMax" value="DEBUG" /> </filter> </appender> </log4net>
log4net配置参数此处不多赘述,只针对日志的输出格式参数conversionPattern配置做简要说明。
%p(priority)::日志的当前优先级别(DEBUG、INFO、WARN 等) %t(thread id):当前记录器所在的线程 ID %d(datetime):当前记录器运行时的时刻 %F(file):当前记录器所在的文件名 %L(line):当前记录器所在的行号 %m(message):需要输出的日志消息 %n(new line):换行 %M 方法名 %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 :10:28,921 %l 或 %L 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。 %c 输出日志信息所属的类的全名 %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28 %f 输出日志信息所属的类的类名 %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行 %m 输出代码中指定的信息,如log(message)中的message %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n” %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推 %r 输出自应用启动到输出该日志信息所耗费的毫秒数 %t 输出产生该日志事件的线程名
4.在Program中使用log4net输出自定义日志内容
using log4net; var builder = WebApplication.CreateBuilder(args); //注入Log4Net builder.Services.AddLogging(cfg => { cfg.AddLog4Net(); //默认的配置文件路径是在根目录,且文件名为log4net.config //如果文件路径或名称有变化,需要重新设置其路径或名称 //比如在项目根目录下创建一个名为cfg的文件夹,将log4net.config文件移入其中,并改名为log.config //则需要使用下面的代码来进行配置 //cfg.AddLog4Net(new Log4NetProviderOptions() //{ // Log4NetConfigFileName = "cfg/log.config", // Watch = true //}); }); var app = builder.Build(); //访问根页面时 app.MapGet("/", (ILogger<Program> logger) => { logger.LogInformation("logger:测试一下Log4Net=》Info"); return "Hello World!"; }); //访问test页面时 app.MapGet("/test", () => { var log = LogManager.GetLogger(typeof(Program)); log.Info("log:这是一条普通日志信息"); }); app.Run();
5.将项目运行起来,即可发现日志文件已生成
6.扩展使用:使用简单工厂模式IOC注入到自定义类中使用
新建一个ITestLog4Net接口文件,并为其定义一个Log方法。
public interface ITestLog4Net { public void Log(); }
并且新建一个TestLog4Net的自定义类,继承于ITestLog4Net,并实现该Log方法。
public class TestLog4Net : ITestLog4Net { private readonly ILogger<TestLog4Net> _logger; public TestLog4Net(ILogger<TestLog4Net> logger) { _logger = logger; _logger.LogInformation("ctor测试一下Log4Net=》Info"); } public void Log() { _logger.LogInformation("测试一下Log4Net=》Info"); } }
在Program中注入我们的自定义类TestLog4Net
builder.Services.AddTransient<ITestLog4Net, TestLog4Net>(); testLog4Net.Log();
使用方法
var testLog4Net = app.Services.GetService<ITestLog4Net>()!;
或者
var services = new ServiceCollection()!; var provider = services.BuildServiceProvider()!; var testLog4Net = provider.GetService<ITestLog4Net>()!; 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中的新特性。
这篇关于Asp.Net Core中简单使用日志组件log4net的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具