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结合到具体项目例子,才更方便讲解。所以接下来,我将开始介绍一些单个的模块实现,然后在基于这些模块,搭建一个简单的项目,然后在基于这个项目,写一些项目应用的文章。

  • 相关阅读:
    智能推荐算法演变及学习笔记(三):CTR预估模型综述
    从中国农业银行“雅典娜杯”数据挖掘大赛看金融行业数据分析与建模方法
    智能推荐算法演变及学习笔记(二):基于图模型的智能推荐(含知识图谱/图神经网络)
    (设计模式专题3)模板方法模式
    (设计模式专题2)策略模式
    (设计模式专题1)为什么要使用设计模式?
    关于macOS上常用操作命令(持续更新)
    记录下关于RabbitMQ常用知识点(持续更新)
    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    SpringCloud教程二:Ribbon(Finchley版)
  • 原文地址:https://www.cnblogs.com/snailblog/p/11484436.html
Copyright © 2011-2022 走看看