NET8使用Microsoft.Extensions.Logging,在Nlog和log4net中随意切换

LoggerHelper类:

 1  public static class LoggerHelper
 2  {
 3      private static ILoggerFactory _loggerFactory;
 4      private static readonly ConcurrentDictionary<Type, ILogger> _loggers = new();
 5 
 6      /// <summary>
 7      /// 初始化日志工厂(Program.cs 里调用)
 8      /// </summary>
 9      public static void Init(ILoggerFactory loggerFactory)
10      {
11          _loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
12      }
13 
14      /// <summary>
15      /// 获取某个类型的 Logger
16      /// </summary>
17      public static ILogger GetLogger(Type type) =>
18          _loggers.GetOrAdd(type, t => _loggerFactory.CreateLogger(t));
19 
20      /// <summary>
21      /// 获取调用类的 Logger(自动推断)
22      /// </summary>
23      private static Type GetCallingType()
24      {
25          var frame = new StackFrame(2, false); // 2 层上调用
26          return frame.GetMethod()?.DeclaringType ?? typeof(object);
27      }
28 
29      private static ILogger GetLoggerForCallingType() =>
30          GetLogger(GetCallingType());
31 
32      // -------- 快捷方法 --------
33      public static void Debug(string msg) => GetLoggerForCallingType().LogDebug(msg);
34      public static void Info(string msg) => GetLoggerForCallingType().LogInformation(msg);
35      public static void Warn(string msg) => GetLoggerForCallingType().LogWarning(msg);
36      public static void Error(string msg, Exception ex = null) =>
37          GetLoggerForCallingType().LogError(ex, msg);
38      public static void Fatal(string msg, Exception ex = null) =>
39          GetLoggerForCallingType().LogCritical(ex, msg);
40  }

Main方法中:

 1   var host = Host.CreateDefaultBuilder()
 2       .ConfigureServices((context, services) =>
 3       {
 4           services.AddSingleton<MainForm>();
 5           //services.AddSingleton<OtherService>();
 6       })
 7       .ConfigureLogging(logging =>
 8       {
 9           logging.ClearProviders();
10           //logging.AddLog4Net("log4net.config");
11           logging.AddNLog(); // 不要 log4net
12       })
13       .Build();
14 
15   var loggerFactory = host.Services.GetRequiredService<ILoggerFactory>();
16   LoggerHelper.Init(loggerFactory);

注意这里: 可任意切换log4net和Nlog

  logging.AddLog4Net("log4net.config");
OR //logging.AddNLog(); // 不要 log4net

在其他代码处写下面的就可以记录日志了:
  LoggerHelper.Info("配置加载完成");
  LoggerHelper.Debug("Debug日志测试");
  LoggerHelper.Error("Error日志测试");

当然别忘记config:

log4net.config始终复制到目录:内容如下:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <log4net>
 3     <!-- Info 日志 -->
 4     <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
 5         <file value="Logs\\info\\" />
 6         <appendToFile value="true" />
 7         <rollingStyle value="Date" />
 8         <datePattern value="yyyy-MM-dd'.log'" />
 9         <staticLogFileName value="false" />
10         <layout type="log4net.Layout.PatternLayout">
11             <conversionPattern value="[%date] %-5level %logger - %message%newline" />
12         </layout>
13         <filter type="log4net.Filter.LevelRangeFilter">
14             <levelMin value="INFO" />
15             <levelMax value="INFO" />
16         </filter>
17     </appender>
18 
19     <!-- Error 日志 -->
20     <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
21         <file value="Logs\\error\\" />
22         <appendToFile value="true" />
23         <rollingStyle value="Date" />
24         <datePattern value="yyyy-MM-dd'.log'" />
25         <staticLogFileName value="false" />
26         <layout type="log4net.Layout.PatternLayout">
27             <conversionPattern value="[%date] %-5level %logger - %message%newline" />
28         </layout>
29         <filter type="log4net.Filter.LevelRangeFilter">
30             <levelMin value="ERROR" />
31             <levelMax value="FATAL" />
32         </filter>
33     </appender>
34 
35     <!-- Debug 日志 -->
36     <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
37         <file value="Logs\\debug\\" />
38         <appendToFile value="true" />
39         <rollingStyle value="Date" />
40         <datePattern value="yyyy-MM-dd'.log'" />
41         <staticLogFileName value="false" />
42         <layout type="log4net.Layout.PatternLayout">
43             <conversionPattern value="[%date] %-5level %logger - %message%newline" />
44         </layout>
45         <filter type="log4net.Filter.LevelRangeFilter">
46             <levelMin value="DEBUG" />
47             <levelMax value="DEBUG" />
48         </filter>
49     </appender>
50 
51     <!-- 根日志 -->
52     <root>
53         <level value="DEBUG" />
54         <appender-ref ref="InfoAppender" />
55         <appender-ref ref="ErrorAppender" />
56         <appender-ref ref="DebugAppender" />
57     </root>
58 </log4net>
View Code

NLog.config始终复制到目录:内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      autoReload="true"
      throwConfigExceptions="true">

    <targets>
        <!-- Info 日志 -->
        <target xsi:type="File" name="infoFile"
                fileName="Logs/Info-N/${shortdate}.log"
                layout="[${longdate}] ${level} ${logger} - ${message} ${exception}" />

        <!-- Error 日志 -->
        <target xsi:type="File" name="errorFile"
                fileName="Logs/Error-N/${shortdate}.log"
                layout="[${longdate}] ${level} ${logger} - ${message} ${exception}" />

        <!-- Debug 日志 -->
        <target xsi:type="File" name="debugFile"
                fileName="Logs/Debug-N/${shortdate}.log"
                layout="[${longdate}] ${level} ${logger} - ${message} ${exception}" />
    </targets>

    <rules>
        <!-- Debug 日志写到 Debug 文件 -->
        <logger name="*" minlevel="Debug" maxlevel="Debug" writeTo="debugFile" />

        <!-- Info 日志写到 Info 文件 -->
        <logger name="*" minlevel="Info" maxlevel="Info" writeTo="infoFile" />

        <!-- Error 及以上写到 Error 文件 -->
        <logger name="*" minlevel="Error" writeTo="errorFile" />
    </rules>
</nlog>
View Code

 

posted @ 2025-08-27 15:49  瘦馬  阅读(15)  评论(0)    收藏  举报