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>
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>
浙公网安备 33010602011771号