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

Log4Net 日志记录的实现

程序员文章站 2022-07-20 10:53:40
一、前言 在上一篇文章【(转载)非常完善的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-&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结合到具体项目例子,才更方便讲解。所以接下来,我将开始介绍一些单个的模块实现,然后在基于这些模块,搭建一个简单的项目,然后在基于这个项目,写一些项目应用的文章。