Log4Net使用学习笔记
项目源文件下载https://files.cnblogs.com/files/ckym/log4nettestsourcecode.zip
log4net是一款非常好用的日志记录的框架,使用它可以实现将日志输出到控制台,文件,数据库等功能
网上有很多log4net的使用教程,一些非常简陋,一些又很深奥,我学习使用log4net的时候查阅了很多资料,为了可以记住相关功能的实现方式,故记录这篇文章,仅用于初学者使用此文档来进行学习,如有错误,请大神不吝赐教,更多深入用法和原理请大家查询相关文档。
- 1. 新建一个控制台应用程序(core)
- 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();
根据注释取消或者注释掉相关的代码,点击运行,可以看到日志输出到文件,或者控制台,或者数据库文件
异常处理:
- 找不到adonetappender
在使用log4net2.0.8的时候我们运行会发现报错,因为2.0.8的版本没有提供adonetappender,所以需要我们自己去实现,源代码在项目中可以找到,其他数据库,例如mysql,oracle等数据库一样的实现方式
- 实现自定义的转换器和布局,这个可以参考原代码的实现和注释,即可实现相关的功能(注意需要反射的只是).
下面是输出的日志模板的一下缩写对应的关系,可以参考,这些是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