1. 程式人生 > 程式設計 >C# 使用 log4net 日誌元件的方法

C# 使用 log4net 日誌元件的方法

一、 什麼是 log4net

Apache log4net 庫是幫助程式設計師將日誌語句輸出到各種輸出目標的工具,它是從Java中的Log4j遷移過來的一個.Net版的開源日誌框架。log4net 的一個顯著特徵是分層記錄器的概念,使用這些記錄器可以有選擇地控制任意粒度輸出日誌語句。主要特徵如下:

  • 支援多個框架
  • 輸出到多個日誌記錄目標
  • 分層日誌記錄體系結構
  • XML 配置
  • 動態配置
  • 日誌記錄上下文
  • 久經考驗的架構
  • 模組化和可擴充套件設計
  • 高效能和靈活性

二、C# 使用 log4net

新增Nuget 包,搜尋到“log4net”後 ,選擇安裝,具體如下圖所示:

C# 使用 log4net 日誌元件的方法

三、新增 log4net 配置檔案

使用 log4net需要我們配置log4net的配置檔案,目前,配置檔案是用 XML 編寫的。一般有兩種方式,一種是使用og4net自動生成的 “log4net.xml”進行配置,另一種是直接嵌入到執行程式的 app.config 檔案中。C# 使用 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>

主要引數含義如下:

C# 使用 log4net 日誌元件的方法

三、原始碼測試

我們可以新增一個日誌類,專門用於輸出日誌列印,具體程式碼如下(注意: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);
    }

    public static void Warn(string msg)
    {
      Log.Warn(msg);
    }
    public static void Warn(string msg,Exception e)
    {
      Log.Warn(WrapException(msg,e);
    }

    public static void Error(string msg)
    {
      Log.Error(msg);
    }
    public static void Error(string msg,Exception e)
    {
      Log.Error(WrapException(msg,e);
    }

    public static void Fatal(string msg)
    {
      Log.Fatal(msg);
    }
    public static void Fatal(string msg,Exception e)
    {
      Log.Fatal(WrapException(msg,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 日誌元件的資料請關注我們其它相關文章!