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;
}
}