当前位置: 移动技术网 > IT编程>开发语言>c# > Log4Net 日志记录的实现

Log4Net 日志记录的实现

2019年09月08日  | 移动技术网IT编程  | 我要评论

一、前言

在上一篇文章【(转载)非常完善的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-&quot;-info.log&quot;" />
      <!--每个文件的大小。
      只在混合方式与文件大小方式下使用。
      超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位: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&quot;-error.log&quot;" />
      <!--每个文件的大小。
      只在混合方式与文件大小方式下使用。
      超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位: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&quot;-debug.log&quot;" />
      <!--每个文件的大小。
      只在混合方式与文件大小方式下使用。
      超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位: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结合到具体项目例子,才更方便讲解。所以接下来,我将开始介绍一些单个的模块实现,然后在基于这些模块,搭建一个简单的项目,然后在基于这个项目,写一些项目应用的文章。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网