时间:2021-05-19
Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架。log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句。主要特征如下:
添加Nuget 包,搜索到“log4net”后 ,选择安装,具体如下图所示:
使用 log4net需要我们配置log4net的配置文件,目前,配置文件是用 XML 编写的。一般有两种方式,一种是使用og4net自动生成的 “log4net.xml”进行配置,另一种是直接嵌入到运行程序的 app.config 文件中。
具体内容如下:
<?xml version="1.0" encoding="utf-8" ?><configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <log4net> <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> <!-- Set root logger level to ERROR and its appenders --> <root> <level value="ALL" /> <appender-ref ref="SysAppender" /> </root> <!-- Print only messages of level DEBUG or above in the packages --> <logger name="WebLogger"> <level value="DEBUG" /> </logger> <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="log/" /> <param name="AppendToFile" value="true" /> <param name="RollingStyle" value="Date" /> <param name="DatePattern" value="'demo_'yyyy_MM_dd-HH'.log'" /> <param name="StaticLogFileName" value="false" /> <param name="RollingStyle" value="Composite" /> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%date [th=%3thread] [line:%5L] [%-5level] %message%newline"/> </layout> </appender> <appender name="consoleApp" type="log4net.Appender.ConsoleAppender,log4net"> <layout type="log4net.Layout.PatternLayout,log4net"> <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /> </layout> </appender> </log4net></configuration>主要参数含义如下:
我们可以添加一个日志类,专门用于输出日志打印,具体代码如下(注意:log4net目前暂时不支持通过配置文件进行文件删除,可通过配置文件设置文件个数与大小进行覆盖备份文件。因此,自动删除日志需要代码实现):
public static class LogUtil { private static log4net.ILog Log { get; } = log4net.LogManager.GetLogger("log"); /// <summary> /// 日志加载设置 /// </summary> /// <param name="exeConfigFile">日志配置文件名称</param> /// <param name="day">保留天数,-1表示不删除</param> public static void Configure(string exeConfigFile,int day=-1) { log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(exeConfigFile)); if (day == -1) return; var files = new System.IO.DirectoryInfo("log").GetFiles(); foreach (var file in files) { // 定时删除日志文件 if ((DateTime.Now - file.CreationTime).TotalDays > day) { file.Delete(); } } } private static string GetMethodName(int skipFrames = 2) { try { // 这里忽略skipFrames层堆栈,也就忽略了当前方法GetMethodName,以及调用此方法的方法,这样拿到的就正好是外部调用打印日志所在函数的方法信息 var method = new StackFrame(skipFrames).GetMethod(); var properties = method?.DeclaringType?.GetProperties( BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); var property = properties?.Where(p => p.GetGetMethod(true) == method || p.GetSetMethod(true) == method) .FirstOrDefault(); var name = $"{method?.DeclaringType?.ToString().Split('.').Last()}.{method?.Name}"; return property == null ? $"{name,-50}" : $"{property.Name,-50}"; } catch (Exception e) { return "ERROR TO GET CALLING METHOD"; } } private static string NoWarp(string msg) { return msg?.Replace("\r\n", " ").Replace("\n", " "); } private static string WrapException(string msg, Exception e) { var builder = new StringBuilder(msg); builder.Append("\t[").Append(e.Message).Append("]"); if (e.InnerException != null) { builder.Append(" --> [").Append(e.InnerException.Message).Append("]"); } return builder.ToString(); } public static void Debug(string msg) { Log.Debug(msg); } public static void Debug(string msg, Exception e) { Log.Debug(WrapException(msg, e), e); } public static void Info(string msg) { Log.Info(msg); } public static void Info(string msg, Exception e) { Log.Info(WrapException(msg, e), e); } public static void Warn(string msg) { Log.Warn(msg); } public static void Warn(string msg, Exception e) { Log.Warn(WrapException(msg, e), e); } public static void Error(string msg) { Log.Error(msg); } public static void Error(string msg, Exception e) { Log.Error(WrapException(msg, e), e); } public static void Fatal(string msg) { Log.Fatal(msg); } public static void Fatal(string msg, Exception e) { Log.Fatal(WrapException(msg, e), e); } }测试代码如下:
static void Main(string[] args) { try { string exeConfigFile = $"{AppDomain.CurrentDomain.BaseDirectory}//Log4netDemo.exe.config"; if (File.Exists(exeConfigFile) == false) { throw new Exception($"应用程序配置文件 [{exeConfigFile}] 不存在,无法加载日志 log4net 的配置"); } LogUtil.Configure(exeConfigFile,1); LogUtil.Info("====================================== Log4netDemo started, log4net setup..."); LogUtil.Warn("程序启动入参不合理"); LogUtil.Error("程序启动失败"); Console.ReadKey(); } catch (Exception ex) { Console.WriteLine(ex); LogUtil.Error("程序加载失败",ex); } }运行程序后,实际输出效果如下:
以上就是C# 使用 log4net 日志组件的方法的详细内容,更多关于C# 使用 log4net 日志组件的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C#控制台程序使用Log4net日志组件,供大家参考,具体内容如下1、Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C
Log4net的优点log4net是.Net下一个非常优秀的开源日志记录组件。log4net记录日志的功能非常强大。它可以将日志分不同的等级,以不同的格式,输出
本文实例讲述了C#实现Log4Net日志分类和自动维护的实现方法。分享给大家供大家参考。具体实现方法如下:一、背景在程序中,我们调试运行时信息,Log4Net是
背景ELMAH就是一个日志的拦截和处理组件,说到.net的日志组件,大家的第一反应该是Log4Net、NLog等这些东西,关于Log4Net和NLog,可以说是
前言用户可以从http://logging.apache.org/log4net/下载log4net的源代码。解压软件包后,在解压的src目录下将log4net