• 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配置做简要说明。

    %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输出自定义日志内容

    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>();
    

      使用方法

    var testLog4Net = app.Services.GetService<ITestLog4Net>()!;
    testLog4Net.Log();

      或者

    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中的新特性。

    本文来自博客园,作者:摇曳de风筝,转载请注明原文链接:https://www.cnblogs.com/pinzi/p/15588766.html

  • 相关阅读:
    一般性能指标
    Spring之AOP框架
    关于电子商务网站
    超级省代码的TAB选项卡
    sql递归
    程序员必备工具,程序员专用工具,程序员专用搜索
    类拟google那样的图片载入
    创建脚本编辑器
    Ancher常用的三种三栏网页宽度自适应布局方法
    js日期加天数
  • 原文地址:https://www.cnblogs.com/pinzi/p/15588766.html
Copyright © 2020-2023  润新知