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

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

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

2:实现 ILogger 接口

  1. public class Log4NetLogger : ILogger
  2. {
  3. private readonly ILog _log;
  4. private ILoggerRepository _loggerRepository;
  5. public Log4NetLogger(string name, XmlElement xmlElement)
  6. {
  7. _loggerRepository = log4net.LogManager.CreateRepository(
  8. Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
  9. _log = LogManager.GetLogger(_loggerRepository.Name, name);
  10. log4net.Config.XmlConfigurator.Configure(_loggerRepository, xmlElement);
  11. }
  12. public IDisposable BeginScope<TState>(TState state)
  13. {
  14. return null;
  15. }
  16. public bool IsEnabled(LogLevel logLevel)
  17. {
  18. switch (logLevel)
  19. {
  20. case LogLevel.Critical:
  21. return _log.IsFatalEnabled;
  22. case LogLevel.Debug:
  23. case LogLevel.Trace:
  24. return _log.IsDebugEnabled;
  25. case LogLevel.Error:
  26. return _log.IsErrorEnabled;
  27. case LogLevel.Information:
  28. return _log.IsInfoEnabled;
  29. case LogLevel.Warning:
  30. return _log.IsWarnEnabled;
  31. default:
  32. throw new ArgumentOutOfRangeException(nameof(logLevel));
  33. }
  34. }
  35. public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,
  36. Exception exception, Func<TState, Exception, string> formatter)
  37. {
  38. if (!IsEnabled(logLevel))
  39. {
  40. return;
  41. }
  42. if (formatter == null)
  43. {
  44. throw new ArgumentNullException(nameof(formatter));
  45. }
  46. string message = null;
  47. if (null != formatter)
  48. {
  49. message = formatter(state, exception);
  50. }
  51. if (!string.IsNullOrEmpty(message) || exception != null)
  52. {
  53. switch (logLevel)
  54. {
  55. case LogLevel.Critical:
  56. _log.Fatal(message);
  57. break;
  58. case LogLevel.Debug:
  59. case LogLevel.Trace:
  60. _log.Debug(message);
  61. break;
  62. case LogLevel.Error:
  63. _log.Error(message);
  64. break;
  65. case LogLevel.Information:
  66. _log.Info(message);
  67. break;
  68. case LogLevel.Warning:
  69. _log.Warn(message);
  70. break;
  71. default:
  72. _log.Warn($"Encountered unknown log level {logLevel}, writing out as Info.");
  73. _log.Info(message, exception);
  74. break;
  75. }
  76. }
  77. }
  78. }

3:实现 ILoggerProvider 接口

  1. public class Log4NetProvider : ILoggerProvider
  2. {
  3. private readonly string _log4NetConfigFile;
  4. private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers =
  5. new ConcurrentDictionary<string, Log4NetLogger>();
  6. public Log4NetProvider(string log4NetConfigFile)
  7. {
  8. _log4NetConfigFile = log4NetConfigFile;
  9. }
  10. public ILogger CreateLogger(string categoryName)
  11. {
  12. return _loggers.GetOrAdd(categoryName, CreateLoggerImplementation);
  13. }
  14. public void Dispose()
  15. {
  16. _loggers.Clear();
  17. }
  18. private Log4NetLogger CreateLoggerImplementation(string name)
  19. {
  20. return new Log4NetLogger(name, Parselog4NetConfigFile(_log4NetConfigFile));
  21. }
  22. private static XmlElement Parselog4NetConfigFile(string filename)
  23. {
  24. XmlDocument log4netConfig = new XmlDocument();
  25. log4netConfig.Load(File.OpenRead(filename));
  26. return log4netConfig["log4net"];
  27. }
  28. }

4:实现扩展接口

  1. public static class Log4netExtensions
  2. {
  3. public static ILoggerFactory AddLog4Net(this ILoggerFactory factory, string log4NetConfigFile)
  4. {
  5. factory.AddProvider(new Log4NetProvider(log4NetConfigFile));
  6. return factory;
  7. }
  8. public static ILoggerFactory AddLog4Net(this ILoggerFactory factory)
  9. {
  10. factory.AddProvider(new Log4NetProvider("log4net.config"));
  11. return factory;
  12. }
  13. }

在Startup加入log4net

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. loggerFactory.AddLog4Net();//log4net
  8. app.UseMvc();
  9. }

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

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!--LOG4日志级别
  3. 0:TRACE;记录一些对程序员调试问题有帮助的信息, 其中可能包含一些敏感信息, 所以应该避免在生产环境中启用Trace日志。
  4. 1:DEBUG;记录一些在开发和调试阶段有用的短时变量(Short-term usefulness), 所以除非为了临时排除生产环境的故障,开发人员应该尽量避免在生产环境中启用Debug日志。
  5. 2:INFO;信息日志,记录应用程序的一些流程, 例如,记录当前api请求的url,请求参数等。
  6. 3:WARN;警告日志;记录应用程序中发生的不正常或者未预期的事件信息。这些信息中可能包含错误消息或者错误产生的条件, 例如, 文件未找到,用户不存在。
  7. 4:ERROR;错误日志;记录应用程序中某个操作产生的错误和异常信息,如对空值进行操作等。
  8. 5:FATAL;毁灭性错误;记录一些需要立刻修复的问题。例如数据丢失,磁盘空间不足。
  9. trace<debug<info<warn<error<fatal -->
  10. <log4net>
  11. <appender name="ErrorRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  12. <file value="D://log//demo//" />
  13. <appendToFile value="true" />
  14. <rollingStyle value="Date"/>
  15. <datePattern value="yyyy-MM-dd-'error.log'"/>
  16. <maxSizeRollBackups value="100" />
  17. <staticLogFileName value="false" />
  18. <encoding value="utf-8" />
  19. <layout type="log4net.Layout.PatternLayout">
  20. <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
  21. </layout>
  22. <filter type="log4net.Filter.LevelRangeFilter">
  23. <levelMin value="ERROR" />
  24. <levelMax value="FATAL" />
  25. </filter>
  26. </appender>
  27. <appender name="WarnRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  28. <file value="D://log//demo//" />
  29. <appendToFile value="true" />
  30. <rollingStyle value="Date"/>
  31. <datePattern value="yyyy-MM-dd-'warn.log'"/>
  32. <maxSizeRollBackups value="100" />
  33. <staticLogFileName value="false" />
  34. <encoding value="utf-8" />
  35. <layout type="log4net.Layout.PatternLayout">
  36. <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
  37. </layout>
  38. <filter type="log4net.Filter.LevelRangeFilter">
  39. <levelMin value="WARN" />
  40. <levelMax value="WARN" />
  41. </filter>
  42. </appender>
  43. <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  44. <file value="D://log//demo//" />
  45. <appendToFile value="true" />
  46. <rollingStyle value="Date"/>
  47. <datePattern value="yyyy-MM-dd-'info.log'"/>
  48. <maxSizeRollBackups value="100" />
  49. <staticLogFileName value="false" />
  50. <encoding value="utf-8" />
  51. <layout type="log4net.Layout.PatternLayout">
  52. <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
  53. </layout>
  54. <filter type="log4net.Filter.LevelRangeFilter">
  55. <levelMin value="TRACE " />
  56. <levelMax value="INFO" />
  57. </filter>
  58. </appender>
  59. <root>
  60. <level value="All" />
  61. <appender-ref ref="ErrorRollingFileAppender" />
  62. <appender-ref ref="WarnRollingFileAppender" />
  63. <appender-ref ref="InfoRollingFileAppender" />
  64. </root>
  65. </log4net>

使用日志

  1. public class ValuesController : ControllerBase
  2. {
  3. private readonly ILogger _logger; //注入日志
  4. public ValuesController(ILoggerFactory loggerFactory)
  5. {
  6. _logger = loggerFactory.CreateLogger<ValuesController>();
  7. }
  8. // GET api/values
  9. [HttpGet]
  10. public ActionResult<IEnumerable<string>> Get()
  11. {
  12. var result = new string[] { "value1", "value2" };
  13. //使用日志
  14. _logger.LogDebug($"返回信息:{string.Join(",",result)}");
  15. return result;
  16. }
  17. }

Asp.net core 使用log4net作为日志组件,记录日志到本地。的更多相关文章

  1. Asp.Net Core中简单使用日志组件log4net

    本文将简单介绍在.NET 6中使用log4net的方法,具体见下文范例. 1.首先新建一个ASP.NET Core空项目 2.通过Nuget包管理器安装下面两个包 log4net Microsoft. ...

  2. asp.net core 3 使用nlog日志组件,使用$ {basedir}保存位置不对,记录下怎么解决

    $ {basedir}指向的是  AppDomain.CurrentDomain.BaseDirectory, Asp.Net.Core的解决方法可能如下(在Program.cs中添加两行): var ...

  3. Asp.Net Core使用Log4Net优化日志【项目开源】

    我在前一篇文章中介绍了一种使用Log4Net的方法,但是那种方法打出来的日志不是很直观 然后我前不久阅读了一篇非常不错的博客:https://www.cnblogs.com/guolianyu/p/9 ...

  4. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  5. 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)

    背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...

  6. ASP.NET Core扩展库之日志

        上一篇我们对Xfrogcn.AspNetCore.Extensions扩展库功能进行了简单的介绍,从这一篇文章开始,我将逐步介绍扩展库中的核心功能.     日志作为非业务的通用领域基础功能, ...

  7. ASP.NET Core使用log4net记录日志

    .NET常用的日志组件有NLog.Log4net等,.NET CORE下微软也自带了日志组件,到目前为止还没用过,而我本人常用的是log4net,下面简单讲讲.NET CORE下怎么使用log4net ...

  8. ASP.NET Core MVC之Serilog日志处理,你了解多少?

    前言 本节我们来看看ASP.NET Core MVC中比较常用的功能,对于导入和导出目前仍在探索中,项目需要自定义列合并,所以事先探索了如何在ASP.NET Core MVC进行导入.导出,更高级的内 ...

  9. asp.net core使用serilog将日志推送到腾讯云日志服务

    为什么是serilog? Serilog是 .NET 中最著名的结构化日志类库. 基于日志事件log events,而不是日志消息log message. 你可以将日志事件格式化为控制台的可读文本或者 ...

随机推荐

  1. go中布尔类型bool的用法

    示例 // bool布尔类型的用法 package main import ( "fmt" "unsafe" ) func main() { // bool类型 ...

  2. C# 事务的创建,提交和回滚

    在C#中开启事务的步骤 01.调用SqlConnection对象的BeginTransaction()方法,创建一个SqlTransaction对象,标志事务开始. 02.将创建的SqlTransac ...

  3. (ACM模板)二分查找

    二分是一个比较大的概念,广义上把东西(可能是问题,区间等等)一分为二都是二分. 这里讲二分查找. 据说只有10%的程序员能写对二分.虽然二分是一个简单的算法.但是其变化和细节却并不简单. 整数二分: ...

  4. Sass函数:数字函数-min()函数、max()函数

    min()函数 min() 函数功能主要是在多个数之中找到最小的一个,这个函数可以设置任意多个参数: >> min(1,2,1%,3,300%) 1% >> min(1px,2 ...

  5. java 发红包案例

  6. java 继承的概念及案例

    package java09; //定义一个员工类 public class Employee { public void method(){ System.out.println("方法执 ...

  7. ZYNQ跑系统 系列(二) petalinux方式移植linux

    三.搭建petalinux工程 0.定位目录    先在shell中找一个准备存放工程的地方,(我的是home/hlf/PRO),命令行cd home/hlf/PRO 1.定位编译链    根据安装p ...

  8. python的strip和split函数

    这两个函数都是string的类函数 1.strip是去掉字符串头尾的特定字符,分三个 aa=' bb=aa.rstrip(') cc=aa.lstrip(') dd=aa.strip(') print ...

  9. $emit 和 $on 进行平行组件之间的传值

    效果图: 注:$emit 和 $on 的事件必须在一个公共的实例上,才能够触发: $emit 触发 $on 接收 需求: 1.有A.B.C三个组件,同时挂载到入口组件中: 2.将A组件中的数据传递到C ...

  10. Raspbian 在虚拟机上运行,运行Flask,供宿主机访问

    Raspbian 在虚拟机上运行,启动Flask,供宿主机访问 参考ref 1, 在virtualbox上跑起来Raspbian OS 参考ref 2, 在Raspbian上安装并运行Falsk, 注 ...