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

Log4Net使用学习笔记

程序员文章站 2022-12-28 22:54:21
项目源文件下载https://files.cnblogs.com/files/ckym/Log4NetTestSourceCode.zip Log4net是一款非常好用的日志记录的框架,使用它可以实现将日志输出到控制台,文件,数据库等功能 网上有很多log4net的使用教程,一些非常简陋,一些又很深 ......

项目源文件下载https://files.cnblogs.com/files/ckym/log4nettestsourcecode.zip

log4net是一款非常好用的日志记录的框架,使用它可以实现将日志输出到控制台,文件,数据库等功能

网上有很多log4net的使用教程,一些非常简陋,一些又很深奥,我学习使用log4net的时候查阅了很多资料,为了可以记住相关功能的实现方式,故记录这篇文章,仅用于初学者使用此文档来进行学习,如有错误,请大神不吝赐教,更多深入用法和原理请大家查询相关文档。

  1. 1.   新建一个控制台应用程序(core)
  2. 2.   在nuget中安装log4net完成之后新建一个log4net的配置文件,配置文件示例如下

 <?xml version="1.0" encoding="utf-8" ?>

<log4net>

  <appender name="consoleappender" type="log4net.appender.consoleappender">

    <layout type="log4net.layout.patternlayout" value="%date [%thread] %-5level %logger - %message%newline" />

  </appender>

 

  <appender name="fileappender" type="log4net.appender.fileappender">

    <file value="log-file.log" />

    <appendtofile value="true" />

    <layout type="log4net.layout.patternlayout">

      <conversionpattern value="%date [%thread] %-5level %logger [%property{ndc}] - %message%newline" />

    </layout>

  </appender>

 

  <appender name="rollinglogfileappender" type="log4net.appender.rollingfileappender">

    <file value="log/" />

    <appendtofile value="true" />

    <rollingstyle value="composite" />

    <staticlogfilename value="false" />

    <datepattern value="yyyymmdd'.log'" />

    <maxsizerollbackups value="10" />

    <maximumfilesize value="1mb" />

    <layout type="log4net.layout.patternlayout">

      <conversionpattern value="%date [%thread] %-5level %logger [%property{ndc}] - %message%newline" />

    </layout>

  </appender>

 

  <!-- name属性指定其名称,type则是log4net.appender命名空间的一个类的名称,意思是,指定使用哪种介质-->

  <appender name="adonetappender" type="microknights.logging.adonetappender, log4net.adonetappender">

    <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->

    <buffersize value="1" />

    <!--日志数据库连接串-->

    <connectiontype value="system.data.sqlclient.sqlconnection, system.data" />

    <connectionstring value="data source=(localdb)\mssqllocaldb;initial catalog=sctest;integrated security=true;connect timeout=30;encrypt=false;trustservercertificate=false;applicationintent=readwrite;multisubnetfailover=false;" />

    <!--日志数据库脚本-->

    <commandtext value="insert into sys_logs (id,createtime,createuser,loglevel,message,userip) values (4,@createtime,@createuser,@loglevel,@custommessage,@userip)" />

    <!--日志时间logdate -->

    <parameter>

      <parametername value="@createtime" />

      <dbtype value="datetime" />

      <layout type="log4net.layout.rawtimestamplayout" />

    </parameter>

    <parameter>

      <parametername value="@loglevel" />

      <dbtype value="string" />

      <size value="200" />

      <layout type="log4net.layout.patternlayout">

        <conversionpattern value="%p" />

      </layout>

    </parameter>

    <parameter>

      <parametername value="@custommessage" />

      <dbtype value="string" />

      <size value="3000" />

      <layout type="log4nettest.customlayout,log4nettest">

        <conversionpattern value="%custommessage{custommessage}" />

      </layout>

    </parameter>

    <!--自定义username -->

    <parameter>

      <parametername value="@createuser" />

      <dbtype value="string" />

      <size value="30" />

      <layout type="log4nettest.customlayout,log4nettest" >

        <conversionpattern value = "%createuser{createuser}"/>

      </layout>

    </parameter>

    <parameter>

      <parametername value="@userip" />

      <dbtype value="string" />

      <size value="20" />

      <layout type="log4nettest.customlayout,log4nettest" >

        <conversionpattern value = "%userip{userip}"/>

      </layout>

    </parameter>

  </appender>

 

  <!-- setup the root category, add the appenders and set the default level -->

  <root>

    <level value="all" />

    <appender-ref ref="consoleappender" />

    <appender-ref ref="fileappender" />

    <appender-ref ref="rollinglogfileappender" />

    <appender-ref ref="adonetappender" />

  </root>

</log4net>

接着在app.config中添加如下行

<configuration>

  <section name="log4net" type="log4net.config.log4netconfigurationsectionhandler,log4net" />

</configuration>

然后再main文件中添加如下代码

iloggerrepository repository = logmanager.createrepository("mycustomrepository");

            //basicconfigurator.configure(repository);//简单配置,只能写日志到控制台

            //读取配置文件的方式实现

            //var log4netconfig = new xmldocument();

            //log4netconfig.load(file.openread("log4net.config"));

            //xmlconfigurator.configure(repository, log4netconfig["log4net"]);

            //直接使用文件的方式

            //注意,要求所有的配置文件必须放置在debug文件夹下面,否则会造成程序不报错,但是也不能正确写入文件的问题

            xmlconfigurator.configure(repository, new fileinfo("log4net.config"));

            ilog log = logmanager.getlogger(repository.name,"mycustomlogger");

 

             //log.debug("this is a log info from log4net test");

             //log.info("netcorelog4net log");

             //log.info("test log");

             //log.error("error");

             //log.info("linezero");

 

             //记录日志到数据库

            customloginfo loginfo = new customloginfo() { id = new random().next(1, 100), message = "this is a log info by log4net", createuser = "sc", userip = dns.gethostaddresses(dns.gethostname())[0].tostring() };

            log.debug(loginfo);

            console.writeline("日志记录完成!");

            console.readkey();

根据注释取消或者注释掉相关的代码,点击运行,可以看到日志输出到文件,或者控制台,或者数据库文件

异常处理:

  1. 找不到adonetappender

在使用log4net2.0.8的时候我们运行会发现报错,因为2.0.8的版本没有提供adonetappender,所以需要我们自己去实现,源代码在项目中可以找到,其他数据库,例如mysql,oracle等数据库一样的实现方式

  1. 实现自定义的转换器和布局,这个可以参考原代码的实现和注释,即可实现相关的功能(注意需要反射的只是).

下面是输出的日志模板的一下缩写对应的关系,可以参考,这些是log4net中自带的转换器实现的。

1)newlinepatternconverter

作用:换行;通配符:%newline,%n

2)loggerpatternconverter

作用:显示logger名;通配符:%logger,%c

3)typenamepatternconverter

作用:显示类名;通配符:%c,%class,%type

4)datepatternconverter

作用:显示时间;通配符:%d,%date

5)exceptionpatternconverter

作用:异常信息;通配符:%exception

6)linelocationpatternconverter

作用:语句所在的行号;通配符:%l,%line

7)messagepatternconverter

作用:信息内容;通配符:%message,%m

8)levelpatternconverter

作用:消息等级;通配符:%level,%p