Asp.Net Core中简单使用日志组件log4net

本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例。

1.首先新建一个ASP.NET Core空项目

Asp.Net Core中简单使用日志组件log4net_第1张图片

 2.通过Nuget包管理器安装下面两个包

log4net
Microsoft.Extensions.Logging.Log4Net.AspNetCore

 Asp.Net Core中简单使用日志组件log4net_第2张图片

 3.在项目根目录下新建log4net的配置文件log4net.config,并将其设置为始终复制 



	
	
		
		
		
		
		
		
		
		
		
	
	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
			
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
			
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
			
			
		
	

	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
			
		
		
			
			
		
	


  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 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.将项目运行起来,即可发现日志文件已生成

Asp.Net Core中简单使用日志组件log4net_第3张图片

 

 

 

  6.扩展使用:使用简单工厂模式IOC注入到自定义类中使用

  新建一个ITestLog4Net接口文件,并为其定义一个Log方法。

public interface ITestLog4Net
{
        public void Log();
}

    并且新建一个TestLog4Net的自定义类,继承于ITestLog4Net,并实现该Log方法。

public class TestLog4Net : ITestLog4Net
{
        private readonly ILogger _logger;
        public TestLog4Net(ILogger logger)
        {
            _logger = logger;
            _logger.LogInformation("ctor测试一下Log4Net=》Info");
        }


        public void Log()
        {
            _logger.LogInformation("测试一下Log4Net=》Info");
        }
}

  在Program中注入我们的自定义类TestLog4Net  

builder.Services.AddTransient();
testLog4Net.Log();

   使用方法

var testLog4Net = app.Services.GetService()!;

  或者

var services = new ServiceCollection()!;
var provider = services.BuildServiceProvider()!;
var testLog4Net = provider.GetService()!;
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'.

Asp.Net Core中简单使用日志组件log4net_第4张图片

 

   推荐使用上面的写法,百度之后,得到的答案是:不要通过调用BuildServiceProvider(). 这个方法应该只被 Host 调用一次。重复的服务提供者可能会导致一些意想不到的错误。如果有哪位大佬知道具体原因,请告知一下,谢谢!

 

Tips:代码中的感叹号!表示该对象不会为空,一定要确保该对象不会为空才能这样写,这是C#10中的新特性。

你可能感兴趣的:(Asp.Net Core中简单使用日志组件log4net)