用 Log4Net 三步实现 .Net Core 类库 分日志等级(不同文件目录)存日志

Posted recordman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用 Log4Net 三步实现 .Net Core 类库 分日志等级(不同文件目录)存日志相关的知识,希望对你有一定的参考价值。

1,建立.Net Core  Web 项目,引入 log4net

2,建立类库,添加如下 helper方法

技术分享图片
  1 using log4net;
  2 using log4net.Config;
  3 using System;
  4 using System.IO;
  5 
  6 namespace Chf.Log
  7 {
  8     /// <summary>
  9     /// Log4Net Helper 2018-12-16 19:15:00  
 10     /// 日志等级:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
 11     /// </summary>
 12     public sealed class LogHelper
 13     { 
 14         private static ILog logger;
 15 
 16         static LogHelper()
 17         {
 18             if (logger == null)
 19             {
 20                 var repository = LogManager.CreateRepository("Chf.Web");
 21                 //指定配置文件
 22                 XmlConfigurator.Configure(repository, new FileInfo("Config//log4netTwo.config"));
 23                 logger = LogManager.GetLogger(repository.Name, "RollingLogFileAppender");
 24             }
 25         }
 26 
 27         /// <summary>
 28         /// 调试信息
 29         /// </summary>
 30         /// <param name="message"></param>
 31         /// <param name="exception"></param>
 32         public static void Debug(string message, Exception exception = null)
 33         {
 34             if (logger.IsDebugEnabled)
 35             {
 36                 if (exception == null)
 37                     logger.Debug(message);
 38                 else
 39                     logger.Debug(FormartLog(message, exception));
 40             }
 41         }
 42 
 43         /// <summary>
 44         /// 一般信息
 45         /// </summary>
 46         /// <param name="message"></param>
 47         /// <param name="exception"></param>
 48         public static void Info(string message, Exception exception = null)
 49         {
 50             if (logger.IsInfoEnabled)
 51             { 
 52                 if (exception == null)
 53                     logger.Info(message);
 54                 else
 55                     logger.Info(FormartLog(message, exception));
 56             }
 57         }
 58 
 59         /// <summary>
 60         /// 警告
 61         /// </summary>
 62         /// <param name="message"></param>
 63         /// <param name="exception"></param>
 64         public static void Warn(string message, Exception exception = null)
 65         { 
 66             if (logger.IsWarnEnabled)
 67             {
 68                 if (exception == null)
 69                     logger.Warn(message);
 70                 else
 71                     logger.Warn(FormartLog(message, exception));
 72             }
 73         }
 74 
 75         /// <summary>
 76         /// 一般错误
 77         /// </summary>
 78         /// <param name="message"></param>
 79         /// <param name="exception"></param>
 80         public static void Error(string message, Exception exception = null)
 81         {
 82             if (logger.IsErrorEnabled)
 83             {
 84                 if (exception == null)
 85                     logger.Error(message);
 86                 else
 87                     logger.Error(FormartLog(message, exception));
 88             }
 89         }
 90 
 91         /// <summary>
 92         /// 致命错误
 93         /// </summary>
 94         /// <param name="message"></param>
 95         /// <param name="exception"></param>
 96         public static void Fatal(string message, Exception exception = null)
 97         {
 98             if (logger.IsFatalEnabled)
 99             {
100                 if (exception == null)
101                     logger.Fatal(message);
102                 else
103                     logger.Fatal(FormartLog(message, exception)); 
104             }
105         }
106 
107 
108         /// <summary>
109         /// 自定义返回格式
110         /// </summary>
111         /// <param name="throwMsg"></param>
112         /// <param name="ex"></param>
113         /// <returns></returns>
114         private static string FormartLog(string throwMsg, Exception ex)
115         {
116             return string.Format("【自定义内容】:{0} 
【异常类型】:{1} 
【异常信息】:{2} 
【堆栈调用】:{3}", new object[] { throwMsg, ex.GetType().Name, ex.Message, ex.StackTrace });
117         }
118     }
119 }
View Code

3,Web项目,添加如下配置文件

技术分享图片
  1 <?xml version="1.0" encoding="utf-8"?>
  2 <configuration>
  3   <configSections>
  4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  5   </configSections>
  6 
  7   <log4net>
  8     <!-- Debug 将日志以回滚文件的形式写到文件中 -->
  9     <appender name="RollingFileDebug" type="log4net.Appender.RollingFileAppender">
 10       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 11       <file value="Log\\Debug\\" />
 12       <!-- 将日志信息追加到已有的日志文件中-->
 13       <appendToFile value="true" />
 14       <param name="MaxFileSize" value="10240"/>
 15       <param name="MaxSizeRollBackups" value="100"/>
 16       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 17       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 18       <!-- 指定按日期切分日志文件 -->
 19       <rollingStyle value="Date" />
 20       <!-- 日志文件的命名规则 -->
 21       <datePattern value="yyyy-MM-dd_HH_mm_ss&quot;.log&quot;" />
 22       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
 23       <staticLogFileName value="false" />
 24       <layout type="log4net.Layout.PatternLayout">
 25         <conversionPattern value="【异常时间】:%date【线程ID】:%thread%newline【异常级别】:%5level%newline%message%newline--------------------------------------------------------------------%newline" />
 26       </layout>
 27       <filter type="log4net.Filter.LevelRangeFilter">
 28         <param name="LevelMin" value="Debug" />
 29         <param name="LevelMax" value="Debug" />
 30       </filter>
 31     </appender>
 32 
 33     <!-- Info 将日志以回滚文件的形式写到文件中 -->
 34     <appender name="RollingFileInfo" type="log4net.Appender.RollingFileAppender">
 35       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 36       <file value="Log\\Info\\" />
 37       <!-- 将日志信息追加到已有的日志文件中-->
 38       <appendToFile value="true" />
 39       <param name="MaxFileSize" value="10240"/>
 40       <param name="MaxSizeRollBackups" value="100"/>
 41       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 42       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 43       <!-- 指定按日期切分日志文件 -->
 44       <rollingStyle value="Date" />
 45       <!-- 日志文件的命名规则 -->
 46       <datePattern value="yyyy-MM-dd_HH_mm_ss&quot;.log&quot;" />
 47       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
 48       <staticLogFileName value="false" />
 49       <layout type="log4net.Layout.PatternLayout">
 50         <conversionPattern value="【异常时间】:%date【线程ID】:%thread%newline【异常级别】:%5level%newline%message%newline--------------------------------------------------------------------%newline" />
 51       </layout>
 52       <filter type="log4net.Filter.LevelRangeFilter">
 53         <param name="LevelMin" value="Info" />
 54         <param name="LevelMax" value="Info" />
 55       </filter>
 56     </appender>
 57 
 58     <!-- Warn 将日志以回滚文件的形式写到文件中 -->
 59     <appender name="RollingFileWarn" type="log4net.Appender.RollingFileAppender">
 60       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 61       <file value="Log\\Warn\\" />
 62       <!-- 将日志信息追加到已有的日志文件中-->
 63       <appendToFile value="true" />
 64       <param name="MaxFileSize" value="10240"/>
 65       <param name="MaxSizeRollBackups" value="100"/>
 66       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 67       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 68       <!-- 指定按日期切分日志文件 -->
 69       <rollingStyle value="Date" />
 70       <!-- 日志文件的命名规则 -->
 71       <datePattern value="yyyy-MM-dd_HH_mm_ss&quot;.log&quot;" />
 72       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
 73       <staticLogFileName value="false" />
 74       <layout type="log4net.Layout.PatternLayout">
 75         <conversionPattern value="【异常时间】:%date【线程ID】:%thread%newline【异常级别】:%5level%newline%message%newline--------------------------------------------------------------------%newline" />
 76       </layout>
 77       <filter type="log4net.Filter.LevelRangeFilter">
 78         <param name="LevelMin" value="Warn" />
 79         <param name="LevelMax" value="Warn" />
 80       </filter>
 81     </appender>
 82 
 83     <!-- Error 将日志以回滚文件的形式写到文件中 -->
 84     <appender name="RollingFileError" type="log4net.Appender.RollingFileAppender">
 85       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
 86       <file value="Log\\Error\\" />
 87       <!-- 将日志信息追加到已有的日志文件中-->
 88       <appendToFile value="true" />
 89       <param name="MaxFileSize" value="10240"/>
 90       <param name="MaxSizeRollBackups" value="100"/>
 91       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
 92       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
 93       <!-- 指定按日期切分日志文件 -->
 94       <rollingStyle value="Date" />
 95       <!-- 日志文件的命名规则 -->
 96       <datePattern value="yyyy-MM-dd_HH_mm_ss&quot;.log&quot;" />
 97       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
 98       <staticLogFileName value="false" />
 99       <layout type="log4net.Layout.PatternLayout">
100         <conversionPattern value="【异常时间】:%date【线程ID】:%thread%newline【异常级别】:%5level%newline%message%newline--------------------------------------------------------------------%newline" />
101       </layout>
102       <filter type="log4net.Filter.LevelRangeFilter">
103         <param name="LevelMin" value="Error" />
104         <param name="LevelMax" value="Error" />
105       </filter>
106     </appender>
107 
108     <!-- Fatal 将日志以回滚文件的形式写到文件中 -->
109     <appender name="RollingFileFatal" type="log4net.Appender.RollingFileAppender">
110       <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 -->
111       <file value="Log\\Fatal\\" />
112       <!-- 将日志信息追加到已有的日志文件中-->
113       <appendToFile value="true" />
114       <param name="MaxFileSize" value="10240"/>
115       <param name="MaxSizeRollBackups" value="100"/>
116       <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 -->
117       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
118       <!-- 指定按日期切分日志文件 -->
119       <rollingStyle value="Date" />
120       <!-- 日志文件的命名规则 -->
121       <datePattern value="yyyy-MM-dd_HH_mm_ss&quot;.log&quot;" />
122       <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false -->
123       <staticLogFileName value="false" />
124       <layout type="log4net.Layout.PatternLayout">
125         <conversionPattern value="【异常时间】:%date【线程ID】:%thread%newline【异常级别】:%5level%newline%message%newline--------------------------------------------------------------------%newline" />
126       </layout>
127       <filter type="log4net.Filter.LevelRangeFilter">
128         <param name="LevelMin" value="Fatal" />
129         <param name="LevelMax" value="Fatal" />
130       </filter>
131     </appender>
132 
133     <logger name="RollingLogFileAppender">
134       <level value="ALL" />
135       <appender-ref ref="RollingFileDebug" />
136       <appender-ref ref="RollingFileInfo" />
137       <appender-ref ref="RollingFileWarn" />
138       <appender-ref ref="RollingFileError" />
139       <appender-ref ref="RollingFileFatal" />
140     </logger>
141 
142     <!--<root> 
143     控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF   
144     比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录  
145      如果没有定义LEVEL的值,则缺省为DEBUG  
146       <level value="ALL" /> 
147        按日期切分日志文件,并将日期作为日志文件的名字  
148       <appender-ref ref="RollingFileAppenderNameByDate" />
149     </root>-->
150   </log4net>
151 </configuration>
View Code

4,运行项目,测试 除以0 和 直接写;就会看到如下

   技术分享图片

技术分享图片

以上是关于用 Log4Net 三步实现 .Net Core 类库 分日志等级(不同文件目录)存日志的主要内容,如果未能解决你的问题,请参考以下文章

dotnet core 6.0 配置使用log4net

dotnet core 6.0 配置使用log4net

[Asp.Net Core]log4net组件使用

[Asp.Net Core]log4net组件使用

Asp.Net Core Log4Net 配置分多个文件记录日志(不同日志级别)

如何将 Log4Net 日志发送到 Application Insights for .NET Core 3.1 Web 应用程序?