这篇文章主要介绍了C# 使用 log4net 日志组件的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
一、 什么是 log4net
Apache log4net 库是帮助程序员将日志语句输出到各种输出目标的工具,它是从Java中的Log4j迁移过来的一个.Net版的开源日志框架。log4net 的一个显著特征是分层记录器的概念,使用这些记录器可以有选择地控制任意粒度输出日志语句。主要特征如下:
- 支持多个框架
 - 输出到多个日志记录目标
 - 分层日志记录体系结构
 - XML 配置
 - 动态配置
 - 日志记录上下文
 - 久经考验的架构
 - 模块化和可扩展设计
 - 高性能和灵活性   
 
二、C# 使用 log4net
添加Nuget 包,搜索到“log4net”后 ,选择安装,具体如下图所示:
<?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>
主要参数含义如下:
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 日志组件的资料请关注得得之家其它相关文章!
				 沃梦达教程
				
			本文标题为:C# 使用 log4net 日志组件的方法
				
        
 
            
        
             猜你喜欢
        
	     - c# 模拟线性回归的示例 2023-03-14
 - 如何使用C# 捕获进程输出 2023-03-10
 - Unity3D实现渐变颜色效果 2023-01-16
 - 在C# 8中如何使用默认接口方法详解 2023-03-29
 - C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
 - Oracle中for循环的使用方法 2023-07-04
 - Unity Shader实现模糊效果 2023-04-27
 - .NET CORE DI 依赖注入 2023-09-27
 - WPF使用DrawingContext实现绘制刻度条 2023-07-04
 - user32.dll 函数说明小结 2022-12-26
 
						
						
						
						
						
				
				
				
				