Log4Net 日志记录的实现
程序员文章站
2023-11-26 12:40:10
一、前言 在上一篇文章【(转载)非常完善的Log4net配置详细说明】介绍了Log4Net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过。 二、Log4Net实现 前面介绍了了Log4Net的配置,这里我在把我用的额Log4Net 的配置信息展示 ......
一、前言
在上一篇文章【(转载)非常完善的log4net配置详细说明】介绍了log4net的配置说明,如果不知道的可以去看看,这里我们就介绍一下日志记录的实现,说得都比较基础,所以大神请绕过。
二、log4net实现
前面介绍了了log4net的配置,这里我在把我用的额log4net 的配置信息展示出来
<log4net debug="false"> <root> <level value="all" /> </root> <logger name="pftlog"> <level value="debug"/> <appender-ref ref="errorrollingfileappender" /> <appender-ref ref="debugrollingfileappender" /> <appender-ref ref="inforollingfileappender" /> </logger> <!--数据日志--> <appender name="inforollingfileappender" type="log4net.appender.rollingfileappender" > <file value="logfile\info\" /> <appendtofile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写log,官方说线程非安全--> <lockingmodel type="log4net.appender.fileappender+minimallock" /> <encoding value="utf-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxsizerollbackups value="20" /> <!--是否只写到一个文件中--> <staticlogfilename value="false" /> <!--按照何种方式产生多个日志文件(日期[date],文件大小[size],混合[composite])--> <rollingstyle value="composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--> <!--这是按日期产生文件夹,并在文件名前也加上日期--> <datepattern value="yyyymmdd-"-info.log"" /> <!--每个文件的大小。 只在混合方式与文件大小方式下使用。 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:kb|mb|gb。 不要使用小数,否则会一直写入当前日志--> <maximumfilesize value="1mb" /> <!--计数类型为1,2,3…--> <!--<countdirection value="1" />--> <!--记录的格式。一般用log4net.layout.patternlayout布局--> <layout type="log4net.layout.patternlayout"> <conversionpattern value="%n记录时间:%date %n线程id[%thread] %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property -%n异常:%exception %n错误描述:%message%newline" /> </layout> <filter type="log4net.filter.levelrangefilter"> <param name="levelmin" value="info" /> <param name="levelmax" value="info" /> </filter> </appender> <!--错误日志--> <appender name="errorrollingfileappender" type="log4net.appender.rollingfileappender" > <file value="logfile\error\" /> <appendtofile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写log,官方说线程非安全--> <lockingmodel type="log4net.appender.fileappender+minimallock" /> <encoding value="utf-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxsizerollbackups value="20" /> <!--是否只写到一个文件中--> <staticlogfilename value="false" /> <!--按照何种方式产生多个日志文件(日期[date],文件大小[size],混合[composite])--> <rollingstyle value="composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--> <!--这是按日期产生文件夹,并在文件名前也加上日期--> <datepattern value="yyyymmdd"-error.log"" /> <!--每个文件的大小。 只在混合方式与文件大小方式下使用。 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:kb|mb|gb。 不要使用小数,否则会一直写入当前日志--> <maximumfilesize value="1mb" /> <!--计数类型为1,2,3…--> <!--<countdirection value="1" />--> <!--记录的格式。一般用log4net.layout.patternlayout布局--> <layout type="log4net.layout.patternlayout"> <conversionpattern value="%n记录时间:%date %n线程id[%thread] %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property -%n异常:%exception %n错误描述:%message%newline" /> </layout> <filter type="log4net.filter.levelrangefilter"> <param name="levelmin" value="error" /> <param name="levelmax" value="error" /> </filter> </appender> <!--调试日志--> <appender name="debugrollingfileappender" type="log4net.appender.rollingfileappender" > <file value="logfile\debug\" /> <appendtofile value="true" /> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写log,官方说线程非安全--> <lockingmodel type="log4net.appender.fileappender+minimallock" /> <encoding value="utf-8" /> <!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数--> <maxsizerollbackups value="20" /> <!--是否只写到一个文件中--> <staticlogfilename value="false" /> <!--按照何种方式产生多个日志文件(日期[date],文件大小[size],混合[composite])--> <rollingstyle value="composite" /> <!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]--> <!--这是按日期产生文件夹,并在文件名前也加上日期--> <datepattern value="yyyymmdd"-debug.log"" /> <!--每个文件的大小。 只在混合方式与文件大小方式下使用。 超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:kb|mb|gb。 不要使用小数,否则会一直写入当前日志--> <maximumfilesize value="1mb" /> <!--计数类型为1,2,3…--> <!--<countdirection value="1" />--> <!--记录的格式。一般用log4net.layout.patternlayout布局--> <layout type="log4net.layout.patternlayout"> <conversionpattern value="%n记录时间:%date %n线程id[%thread] %n日志级别:%-5level %n记录类:%logger %n扩展信息:%property -%n异常:%exception %n错误描述:%message%newline" /> </layout> <filter type="log4net.filter.levelrangefilter"> <param name="levelmin" value="debug" /> <param name="levelmax" value="debug" /> </filter> </appender> </log4net>
里面配置了3个日志的等级(error,debug和info),根据日志的不同等级,记录到对应的文件里面。
下面是具体的实现代码
[assembly: log4net.config.xmlconfigurator(configfile = "log4net.config", configfileextension = "config", watch = true)] namespace pft.standard { public class pftlog { private static ilog log = logmanager.getlogger(assembly.getcallingassembly(), "pftlog"); public static void error(string message, action registedproperties) { registedproperties(); log.error(message); } public static void error(string message, exception exception, action registedproperties) { registedproperties(); log.error(message, exception); } public static void error(exception exception, action registedproperties) { registedproperties(); log.error("系统error信息", exception); } public static void debug(string message, action registedproperties) { registedproperties(); log.debug(message); } public static void debug(string message, exception exception, action registedproperties) { registedproperties(); log.debug(message, exception); } public static void debug(exception exception, action registedproperties) { registedproperties(); log.debug("系统debug信息", exception); } public static void info(string message, action registedproperties) { registedproperties(); log.info(message); } public static void info(string message, exception exception, action registedproperties) { registedproperties(); log.debug(message, exception); } public static void info(exception exception, action registedproperties) { registedproperties(); log.info("系统info信息", exception); } } }
其中registedproperties注册扩展字段。
例如:c#代码
logmanager.info("测试扩展字段", () => { logicalthreadcontext.properties["logtype"] = "扩展字段内容"; });
info日志文件为。
这样的字段扩展,可以保存到数据库,也可以与第三方传值字段对接,是不是很方便。
三、总结
log4net的基本实现,就先介绍到这里。本来计划把与kibana结合也一起写了,结果发现kibana结合到具体项目例子,才更方便讲解。所以接下来,我将开始介绍一些单个的模块实现,然后在基于这些模块,搭建一个简单的项目,然后在基于这个项目,写一些项目应用的文章。