欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在.NET 6中使用日志组件log4net的方法

程序员文章站 2022-03-10 14:38:43
本文将简单介绍在.net 6中使用log4net的方法,具体见下文范例。1.首先新建一个asp.net core空项目2.通过nuget包管理器安装下面两个包log4netmicrosoft.exte...

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

1.首先新建一个asp.net core空项目

在.NET 6中使用日志组件log4net的方法

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

log4net

microsoft.extensions.logging.log4net.aspnetcore

在.NET 6中使用日志组件log4net的方法

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

在.NET 6中使用日志组件log4net的方法

在.NET 6中使用日志组件log4net的方法

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

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

并且新建一个testlog4net的自定义类,继承于itestlog4net,并实现该log方法。

在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'.

在.NET 6中使用日志组件log4net的方法

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

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

到此这篇关于在.net 6中使用日志组件log4net的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。