C# 使用 log4net 日志组件的方法

一、 什么是 log4net 

      Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架。log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句。主要特征如下:

  • 支持多个框架
  • 输出到多个日志记录目标
  • 分层日志记录体系结构
  • XML 配置
  • 动态配置
  • 日志记录上下文
  • 久经考验的架构
  • 模块化和可扩展设计
  • 高性能和灵活性   

二、C# 使用 log4net

       添加Nuget 包,搜索到“log4net”后 ,选择安装,具体如下图所示:

三、添加 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 日志组件的方法 的全部内容, 来源链接: utcz.com/z/343947.html

回到顶部