log4net 根据日志Level级别记录日志
配置文件
<?xml version="1.0" encoding="utf-8" ?> <log4net> <!-- Debug 将日志以回滚文件的形式写到文件中 --> <appender name="RollingFileDebug" type="log4net.Appender.RollingFileAppender" > <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> <file value="Log_Console/" /> <!-- 日志文件的命名规则 --> <datePattern value="yyyy-MM-dd/'Debug.log'"/> <!-- 将日志信息追加到已有的日志文件中--> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="5MB" /> <!-- 指定按日期切分日志文件 --> <rollingStyle value="Date"/> <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> <staticLogFileName value="false" /> <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="时间:%d 内容: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Debug" /> <param name="LevelMax" value="Debug" /> </filter> </appender> <!-- Info 将日志以回滚文件的形式写到文件中 --> <appender name="RollingFileInfo" type="log4net.Appender.RollingFileAppender" > <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> <file value="Log_Console/" /> <!-- 日志文件的命名规则 --> <datePattern value="yyyy-MM-dd/'Info.log'"/> <!-- 将日志信息追加到已有的日志文件中--> <appendToFile value="true" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="5MB" /> <!-- 指定按日期切分日志文件 --> <rollingStyle value="Date"/> <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> <staticLogFileName value="false" /> <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="时间:%d 内容: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Info" /> <param name="LevelMax" value="Info" /> </filter> </appender> <!-- WARN 将日志以回滚文件的形式写到文件中 --> <appender name="RollingFileWarn" type="log4net.Appender.RollingFileAppender" > <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> <file value="Log_Console/" /> <!-- 日志文件的命名规则 --> <datePattern value="yyyy-MM-dd/'Warn.log'"/> <!-- 将日志信息追加到已有的日志文件中--> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="5MB" /> <!-- 指定按日期切分日志文件 --> <rollingStyle value="Date"/> <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> <staticLogFileName value="false" /> <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="时间:%d 内容: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Warn" /> <param name="LevelMax" value="Warn" /> </filter> </appender> <!-- Error 将日志以回滚文件的形式写到文件中 --> <appender name="RollingFileError" type="log4net.Appender.RollingFileAppender" > <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> <file value="Log_Console/" /> <!-- 日志文件的命名规则 --> <datePattern value="yyyy-MM-dd/'Error.log'"/> <!-- 将日志信息追加到已有的日志文件中--> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="5MB" /> <!-- 指定按日期切分日志文件 --> <rollingStyle value="Date"/> <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> <staticLogFileName value="false" /> <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="时间:%d 内容: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Error" /> <param name="LevelMax" value="Error" /> </filter> </appender> <!-- Fatal 将日志以回滚文件的形式写到文件中 --> <appender name="RollingFileFatal" type="log4net.Appender.RollingFileAppender" > <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> <file value="Log_Console/" /> <!-- 日志文件的命名规则 --> <datePattern value="yyyy-MM-dd/'Fatal.log'"/> <!-- 将日志信息追加到已有的日志文件中--> <appendToFile value="true" /> <rollingStyle value="Size" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="5MB" /> <!-- 指定按日期切分日志文件 --> <rollingStyle value="Date"/> <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> <staticLogFileName value="false" /> <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="时间:%d 内容: %m%n" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="Fatal" /> <param name="LevelMax" value="Fatal" /> </filter> </appender> <root> <!--控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 如果没有定义LEVEL的值,则缺省为DEBUG--> <appender-ref ref="RollingFileDebug" /> <appender-ref ref="RollingFileInfo" /> <!--<appender-ref ref="RollingFileWarn" />--> <!--<appender-ref ref="RollingFileError" />--> <!--<appender-ref ref="RollingFileFatal" />--> <level value="DEBUG" /> </root> <logger name="NHibernate"> <level value="WARN" /> </logger> </log4net>
日志记录类
using log4net; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; [assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)] namespace FileMonitor { /// <summary> /// 日志帮助类 /// 需要设置 log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~/MyConfig/Log4Net.config"))); /// 调用:private static readonly log4net.ILog MyLog = Log.LogHelper.GetInstance(); /// </summary> public class LogHelper { private static ILog log; private static LogHelper logHelper = null; /// <summary> /// 初始化 /// </summary> /// <returns></returns> public static ILog GetInstance() { logHelper = new LogHelper(null); return log; } /// <summary> /// 初始化 /// </summary> /// <param name="configPath"></param> /// <returns></returns> public static ILog GetInstance(string configPath) { logHelper = new LogHelper(configPath); return log; } /// <summary> /// 构造函数 /// </summary> /// <param name="configPath">配置文件路径</param> private LogHelper(string configPath) { if (!string.IsNullOrEmpty(configPath)) { log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(configPath)); } else { log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); } } } }
引用的log4net.dll文件
出处:https://blog.csdn.net/gavinoldmen/article/details/116203589
=======================================================================================
个人使用
在程序中如何根据日志级别,输出不同的日志呢?如何获取日志的Level级别?请听我给你分析,我们先看一下关于EffectiveLevel的源码。
/// <summary> /// Gets the effective level for this logger. /// </summary> /// <returns>The nearest level in the logger hierarchy.</returns> /// <remarks> /// <para> /// Starting from this logger, searches the logger hierarchy for a /// non-null level and returns it. Otherwise, returns the level of the /// root logger. /// </para> /// <para>The Logger class is designed so that this method executes as /// quickly as possible.</para> /// </remarks> public virtual Level EffectiveLevel { get { for (Logger logger = this; logger != null; logger = logger.m_parent) { Level level = logger.m_level; if ((object)level != null) { return level; } } return null; } }
不难吧?如果当前日志对象没有定义Level,则取父对象的Level,最终一定能从root中取出来。
所以,我们可以直接从EffectiveLevel获取当前配置文件中的Level的值
var log = (log4net.Repository.Hierarchy.Logger)ClassLibrary1.LogHelp.LogicLog.Logger; var le = log.EffectiveLevel;
也可以写成静态扩展方法
public static log4net.Core.Level LogLevel(this log4net.ILog log) { var _log = (log4net.Repository.Hierarchy.Logger)log?.Logger; return _log?.EffectiveLevel; }
在配置文件中Level定义记录的日志级别,就是说,你要记录哪个级别以上的日志,级别由低往高依次是: ALL > DEBUG > INFO > WARN > ERROR > FATAL > None
我们默认的是使用的 log4net.Core.LogImpl类来实现,我们查看源码public class LogImpl : LoggerWrapperImpl, ILog, ILoggerWrapper 那么我们看看源码,
public virtual bool IsDebugEnabled => Logger.IsEnabledFor(m_levelDebug);
public virtual bool IsInfoEnabled => Logger.IsEnabledFor(m_levelInfo);
所有的调用都是指向了log4net.Repository.Hierarchy.logger下面的IsEnabledFor方法来实现的,如下:
/// <summary> /// Checks if this logger is enabled for a given <see cref="P:log4net.Repository.Hierarchy.Logger.Level" /> passed as parameter. /// </summary> /// <param name="level">The level to check.</param> /// <returns> /// <c>true</c> if this logger is enabled for <c>level</c>, otherwise <c>false</c>. /// </returns> /// <remarks> /// <para> /// Test if this logger is going to log events of the specified <paramref name="level" />. /// </para> /// <para> /// This method must not throw any exception to the caller. /// </para> /// </remarks> public virtual bool IsEnabledFor(Level level) { try { if (level != (Level)null) { if (m_hierarchy.IsDisabled(level)) { return false; } return level >= EffectiveLevel; } } catch (Exception exception) { LogLog.Error(declaringType, "Exception while logging", exception); } return false; }
而且Level类重写了比较运算符,我这里就不一一列出来了,感兴趣的朋友,可以自己研究Log4Net的源码,
所以我们哦可以使用日志对象的 IsDebugEnabled 属性判断,当然这个判断可能和配置文件不太准确,因为层级实际上是一个包含的关系,仅仅供参考。
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/16966615.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!