zoukankan      html  css  js  c++  java
  • 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="LogFileInfo" />
          <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="LogFileError" />
          <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="LogFileDebug" />
          <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>
    View Code

    里面配置了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日志文件为image

    这样的字段扩展,可以保存到数据库,也可以与第三方传值字段对接,是不是很方便。

    三、总结

    Log4Net的基本实现,就先介绍到这里。本来计划把与Kibana结合也一起写了,结果发现Kibana结合到具体项目例子,才更方便讲解。所以接下来,我将开始介绍一些单个的模块实现,然后在基于这些模块,搭建一个简单的项目,然后在基于这个项目,写一些项目应用的文章。

  • 相关阅读:
    sell02 展现层编写
    sell01 环境搭建、编写持久层并进行测试
    SpringBoot04 日志框架之Logback
    SpringBoot04 项目热部署详解
    SpringBoot03 项目热部署
    Angular14 利用Angular2实现文件上传的前端、利用springBoot实现文件上传的后台、跨域问题
    Flask17 Flask_Script插件的使用
    Angular13 Angular2发送PUT请求在后台接收不到参数
    PostMan安装
    unix网络编程环境配置程序运行
  • 原文地址:https://www.cnblogs.com/snailblog/p/11484436.html
Copyright © 2011-2022 走看看