Asp.net core 使用log4net作为日志组件,记录日志到本地。

Posted lonelyxmas

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Asp.net core 使用log4net作为日志组件,记录日志到本地。相关的知识,希望对你有一定的参考价值。

原文:Asp.net core 使用log4net作为日志组件,记录日志到本地。

GitHub demo :https://github.com/zhanglilong23/Asp.NetCore.Demo

1:引入包?首先使用Nuget引入log4net包,版本应>= 2.0.7

2:实现 ILogger 接口

 public class Log4NetLogger : ILogger
    
        private readonly ILog _log;
        private ILoggerRepository _loggerRepository;
        public Log4NetLogger(string name, XmlElement xmlElement)
        
            _loggerRepository = log4net.LogManager.CreateRepository(
                Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
            _log = LogManager.GetLogger(_loggerRepository.Name, name);
            log4net.Config.XmlConfigurator.Configure(_loggerRepository, xmlElement);
        
        public IDisposable BeginScope<TState>(TState state)
        
            return null;
        

        public bool IsEnabled(LogLevel logLevel)
        
            switch (logLevel)
            
                case LogLevel.Critical:
                    return _log.IsFatalEnabled;
                case LogLevel.Debug:
                case LogLevel.Trace:
                    return _log.IsDebugEnabled;
                case LogLevel.Error:
                    return _log.IsErrorEnabled;
                case LogLevel.Information:
                    return _log.IsInfoEnabled;
                case LogLevel.Warning:
                    return _log.IsWarnEnabled;
                default:
                    throw new ArgumentOutOfRangeException(nameof(logLevel));
            
        

        public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,
            Exception exception, Func<TState, Exception, string> formatter)
        
            if (!IsEnabled(logLevel))
            
                return;
            

            if (formatter == null)
            
                throw new ArgumentNullException(nameof(formatter));
            
            string message = null;
            if (null != formatter)
            
                message = formatter(state, exception);
            
            if (!string.IsNullOrEmpty(message) || exception != null)
            
                switch (logLevel)
                
                    case LogLevel.Critical:
                        _log.Fatal(message);
                        break;
                    case LogLevel.Debug:
                    case LogLevel.Trace:
                        _log.Debug(message);
                        break;
                    case LogLevel.Error:
                        _log.Error(message);
                        break;
                    case LogLevel.Information:
                        _log.Info(message);
                        break;
                    case LogLevel.Warning:
                        _log.Warn(message);
                        break;
                    default:
                        _log.Warn($"Encountered unknown log level logLevel, writing out as Info.");
                        _log.Info(message, exception);
                        break;
                
            
        
    

3:实现 ILoggerProvider 接口

 public class Log4NetProvider : ILoggerProvider
    
        private readonly string _log4NetConfigFile;
        private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers =
            new ConcurrentDictionary<string, Log4NetLogger>();
        public Log4NetProvider(string log4NetConfigFile)
        
            _log4NetConfigFile = log4NetConfigFile;
        

        public ILogger CreateLogger(string categoryName)
        
            return _loggers.GetOrAdd(categoryName, CreateLoggerImplementation);
        

        public void Dispose()
        
            _loggers.Clear();
        
        private Log4NetLogger CreateLoggerImplementation(string name)
        
            return new Log4NetLogger(name, Parselog4NetConfigFile(_log4NetConfigFile));
        

        private static XmlElement Parselog4NetConfigFile(string filename)
        
            XmlDocument log4netConfig = new XmlDocument();
            log4netConfig.Load(File.OpenRead(filename));
            return log4netConfig["log4net"];
        
    

4:实现扩展接口

 public static class Log4netExtensions
    
        public static ILoggerFactory AddLog4Net(this ILoggerFactory factory, string log4NetConfigFile)
        
            factory.AddProvider(new Log4NetProvider(log4NetConfigFile));
            return factory;
        

        public static ILoggerFactory AddLog4Net(this ILoggerFactory factory)
        
            factory.AddProvider(new Log4NetProvider("log4net.config"));
            return factory;
        
    

在Startup加入log4net

 public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
        
            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
            
            loggerFactory.AddLog4Net();//log4net
            app.UseMvc();
        

log4net.config 实现。可以根据日志级别进行自定义

<?xml version="1.0" encoding="utf-8" ?>
<!--LOG4日志级别 
    0:TRACE;记录一些对程序员调试问题有帮助的信息, 其中可能包含一些敏感信息, 所以应该避免在生产环境中启用Trace日志。
    1:DEBUG;记录一些在开发和调试阶段有用的短时变量(Short-term usefulness), 所以除非为了临时排除生产环境的故障,开发人员应该尽量避免在生产环境中启用Debug日志。
    2:INFO;信息日志,记录应用程序的一些流程, 例如,记录当前api请求的url,请求参数等。
    3:WARN;警告日志;记录应用程序中发生的不正常或者未预期的事件信息。这些信息中可能包含错误消息或者错误产生的条件, 例如, 文件未找到,用户不存在。
    4:ERROR;错误日志;记录应用程序中某个操作产生的错误和异常信息,如对空值进行操作等。
    5:FATAL;毁灭性错误;记录一些需要立刻修复的问题。例如数据丢失,磁盘空间不足。
trace<debug<info<warn<error<fatal -->
<log4net>
  <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="D://log//demo//" />
    <appendToFile value="true" />
    <rollingStyle value="Date"/>
    <datePattern value="yyyy-MM-dd-‘error.log‘"/>
    <maxSizeRollBackups value="100" />
    <staticLogFileName value="false" />
    <encoding value="utf-8" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="ERROR" />
      <levelMax value="FATAL" />
    </filter>
  </appender>

  <appender name="WarnRollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="D://log//demo//" />
    <appendToFile value="true" />
    <rollingStyle value="Date"/>
    <datePattern value="yyyy-MM-dd-‘warn.log‘"/>
    <maxSizeRollBackups value="100" />
    <staticLogFileName value="false" />
    <encoding value="utf-8" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="WARN" />
      <levelMax value="WARN" />
    </filter>
  </appender>

  <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="D://log//demo//" />
    <appendToFile value="true" />
    <rollingStyle value="Date"/>
    <datePattern value="yyyy-MM-dd-‘info.log‘"/>
    <maxSizeRollBackups value="100" />
    <staticLogFileName value="false" />
    <encoding value="utf-8" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
    </layout>
    <filter type="log4net.Filter.LevelRangeFilter">
      <levelMin value="TRACE " />
      <levelMax value="INFO" />
    </filter>
  </appender>

  <root>
    <level value="All" />
    <appender-ref ref="ErrorRollingFileAppender" />
    <appender-ref ref="WarnRollingFileAppender" />
    <appender-ref ref="InfoRollingFileAppender" />
  </root>
</log4net>

使用日志

 public class ValuesController : ControllerBase
    
        private readonly ILogger _logger; //注入日志
        public ValuesController(ILoggerFactory loggerFactory)
        
            _logger = loggerFactory.CreateLogger<ValuesController>();
        
        // GET api/values
        [HttpGet]
        public ActionResult<IEnumerable<string>> Get()
        
            var result = new string[]  "value1", "value2" ;
            //使用日志
            _logger.LogDebug($"返回信息:string.Join(",",result)");
            return result;
        
     

以上是关于Asp.net core 使用log4net作为日志组件,记录日志到本地。的主要内容,如果未能解决你的问题,请参考以下文章

[Asp.Net Core]log4net组件使用

Asp.Net Core Log4Net 配置分多个文件记录日志(不同日志级别)

(VIP-朝夕教育)2021-06-06 .NET高级班 41-ASP.NET Core log4.net日志框架的使用

[Asp.Net Core]ActionFilter做日志

log4net 使用总结- 在ASP.NET MVC 中使用

log4net 使用总结- 在ASP.NET MVC 中使用