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

posted @   园子的蜗牛  阅读(1102)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示