Demo版本信息如下:

VS:2019

框架:.Net Core 3.1

Log4Net:2.0.12

思维导图:

【1】添加依赖项

  通过nuget添加Log4Net

【2】创建公共类

  添加公共类Log4NetLogger,实现ILogger, ILoggerProvider,扩展方法Log4netExtensions

  

  1.    /// <summary>
  2. /// ILogger
  3. /// </summary>
  4. public class Log4NetLogger : ILogger
  5. {
  6. private readonly ILog _log;
  7. private ILoggerRepository _loggerRepository;
  8. public Log4NetLogger(string name, XmlElement xmlElement)
  9. {
  10. _loggerRepository = log4net.LogManager.CreateRepository(
  11. Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
  12. _log = LogManager.GetLogger(_loggerRepository.Name, name);
  13. log4net.Config.XmlConfigurator.Configure(_loggerRepository, xmlElement);
  14. }
  15. public IDisposable BeginScope<TState>(TState state)
  16. {
  17. return null;
  18. }
  19.  
  20. public bool IsEnabled(LogLevel logLevel)
  21. {
  22. switch (logLevel)
  23. {
  24. case LogLevel.Critical:
  25. return _log.IsFatalEnabled;
  26. case LogLevel.Debug:
  27. case LogLevel.Trace:
  28. return _log.IsDebugEnabled;
  29. case LogLevel.Error:
  30. return _log.IsErrorEnabled;
  31. case LogLevel.Information:
  32. return _log.IsInfoEnabled;
  33. case LogLevel.Warning:
  34. return _log.IsWarnEnabled;
  35. default:
  36. throw new ArgumentOutOfRangeException(nameof(logLevel));
  37. }
  38. }
  39.  
  40. public void Log<TState>(LogLevel logLevel, EventId eventId, TState state,
  41. Exception exception, Func<TState, Exception, string> formatter)
  42. {
  43. if (!IsEnabled(logLevel))
  44. {
  45. return;
  46. }
  47.  
  48. if (formatter == null)
  49. {
  50. throw new ArgumentNullException(nameof(formatter));
  51. }
  52. string message = null;
  53. if (null != formatter)
  54. {
  55. message = formatter(state, exception);
  56. }
  57. if (!string.IsNullOrEmpty(message) || exception != null)
  58. {
  59. switch (logLevel)
  60. {
  61. case LogLevel.Critical:
  62. _log.Fatal(message);
  63. break;
  64. case LogLevel.Debug:
  65. case LogLevel.Trace:
  66. _log.Debug(message);
  67. break;
  68. case LogLevel.Error:
  69. _log.Error(message);
  70. break;
  71. case LogLevel.Information:
  72. _log.Info(message);
  73. break;
  74. case LogLevel.Warning:
  75. _log.Warn(message);
  76. break;
  77. default:
  78. _log.Warn($"Encountered unknown log level {logLevel}, writing out as Info.");
  79. _log.Info(message, exception);
  80. break;
  81. }
  82. }
  83. }
  84. }
  85.  
  86. /// <summary>
  87. /// ILoggerProvider
  88. /// </summary>
  89. public class Log4NetProvider : ILoggerProvider
  90. {
  91. private readonly string _log4NetConfigFile;
  92. private readonly ConcurrentDictionary<string, Log4NetLogger> _loggers =
  93. new ConcurrentDictionary<string, Log4NetLogger>();
  94. public Log4NetProvider(string log4NetConfigFile)
  95. {
  96. _log4NetConfigFile = log4NetConfigFile;
  97. }
  98.  
  99. public ILogger CreateLogger(string categoryName)
  100. {
  101. return _loggers.GetOrAdd(categoryName, CreateLoggerImplementation);
  102. }
  103.  
  104. public void Dispose()
  105. {
  106. _loggers.Clear();
  107. }
  108. private Log4NetLogger CreateLoggerImplementation(string name)
  109. {
  110. return new Log4NetLogger(name, Parselog4NetConfigFile(_log4NetConfigFile));
  111. }
  112.  
  113. private static XmlElement Parselog4NetConfigFile(string filename)
  114. {
  115. XmlDocument log4netConfig = new XmlDocument();
  116. log4netConfig.Load(File.OpenRead(filename));
  117. return log4netConfig["log4net"];
  118. }
  119. }
  120.  
  121. /// <summary>
  122. /// 扩展方法 Log4netExtensions
  123. /// </summary>
  124. public static class Log4netExtensions
  125. {
  126. public static ILoggerFactory AddLog4Net(this ILoggerFactory factory, string log4NetConfigFile)
  127. {
  128. factory.AddProvider(new Log4NetProvider(log4NetConfigFile));
  129. return factory;
  130. }
  131.  
  132. public static ILoggerFactory AddLog4Net(this ILoggerFactory factory)
  133. {
  134. factory.AddProvider(new Log4NetProvider("log4net.config"));
  135. return factory;
  136. }
  137. }

【3】Startup

  在Startup中注册log4net

  

【5】配置文件

  添加log4Net.config配置文件,需要注意,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//Error//" /><!--对于主要日志错误级别配置对应的文件夹-->
  13. <appendToFile value="true" /><!--是否进行文本追加-->
  14. <rollingStyle value="Date"/>
  15. <datePattern value="yyyy-MM-dd'.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.  
  28. <appender name="WarnRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  29. <file value="D://log//Warn//" />
  30. <appendToFile value="true" />
  31. <rollingStyle value="Date"/>
  32. <datePattern value="yyyy-MM-dd'.log'"/>
  33. <maxSizeRollBackups value="100" />
  34. <staticLogFileName value="false" />
  35. <encoding value="utf-8" />
  36. <layout type="log4net.Layout.PatternLayout">
  37. <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
  38. </layout>
  39. <filter type="log4net.Filter.LevelRangeFilter">
  40. <levelMin value="WARN" />
  41. <levelMax value="WARN" />
  42. </filter>
  43. </appender>
  44.  
  45. <appender name="InfoRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  46. <file value="D://log//Info//" />
  47. <appendToFile value="true" />
  48. <rollingStyle value="Date"/>
  49. <datePattern value="yyyy-MM-dd'.log'"/>
  50. <maxSizeRollBackups value="100" />
  51. <staticLogFileName value="false" />
  52. <encoding value="utf-8" />
  53. <layout type="log4net.Layout.PatternLayout">
  54. <conversionPattern value="%newline%date [%thread %-5level] %n -- %m%n" />
  55. </layout>
  56. <filter type="log4net.Filter.LevelRangeFilter">
  57. <levelMin value="TRACE " />
  58. <levelMax value="INFO" />
  59. </filter>
  60. </appender>
  61.  
  62. <root>
  63. <level value="All" />
  64. <appender-ref ref="ErrorRollingFileAppender" />
  65. <appender-ref ref="WarnRollingFileAppender" />
  66. <appender-ref ref="InfoRollingFileAppender" />
  67. </root>
  68. </log4net>

【6】测试

  此Demo通过MVC实现测试,所以需要添加控制器与视图。

  1、同时在Startup中注册MVC相关服务,services.AddControllersWithViews();

  

  2、更改Configure中的UseEndpoints请求为MVC路由配置

  

  

  1.     app.UseEndpoints(endpoints =>
  2. {
  3. endpoints.MapControllerRoute(
  4. name: "default",
  5. pattern: "{controller=Home}/{action=Index}/{id?}"
  6. );
  7. });

  3、控制器中获取对象

  

  1.      private readonly ILogger _logger;
  2.  
  3. /// <summary>
  4. /// **************通过构造方法获取注册的Log4Net服务
  5. /// </summary>
  6. /// <param name="loggerFactory"></param>
  7. public HomeController(ILoggerFactory loggerFactory)
  8. {
  9. _logger = loggerFactory.CreateLogger<HomeController>();
  10. }

  

  4、调用

  

  1.      public IActionResult Index()
  2. {
  3. //************** 日志对象的引用
  4. _logger.LogInformation($"这是一个一般的日志消息");
  5. _logger.LogWarning($"这是一个警告的日志消息");
  6. _logger.LogError($"这是一个错误的日志消息");
  7. return View();
  8. }

.NET Core引入日志(Log4Net篇)的更多相关文章

  1. Log4net入门(回滚日志文件篇)

    在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会 ...

  2. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  3. .net core使用ocelot---第三篇 日志记录

    简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证使用 上篇介绍使用asp.net core 创建API网关.本文将介绍Ocelo ...

  4. .net core 中使用Log4net输出日志到Mysql数据库中

    .net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...

  5. .NET Core的日志[5]:利用TraceSource写日志

    从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...

  6. .NET Core的日志[1]:采用统一的模式记录日志

    记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断框架(相关A ...

  7. .Net core的日志系统

    .net core是内置了日志系统的,本文这里简单的介绍一下它的基本用法.如下是一个简单的示例: var service = new ServiceCollection() .AddLogging(l ...

  8. .NET Core开发日志——Entity Framework与PostgreSQL

    Entity Framework在.NET Core中被命名为Entity Framework Core.虽然一般会用于对SQL Server数据库进行数据操作,但其实它还支持其它数据库,这里就以Po ...

  9. .NET Core开发日志——RequestDelegate

    本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...

随机推荐

  1. Springboot — 用更优雅的方式发HTTP请求:RestTemplate

    RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...

  2. 深入理解Java虚拟机(三)——垃圾回收策略

    所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...

  3. SQL注入 (一)

    一.手工注入 注入点检测 识别方法:通过在url栏输入'.and 1=1.or 1=1.and sleep(1),如果出现报错,或者页面不一致,则可能存在注入点. 注入类型:整数型.字符型.搜索型.B ...

  4. Hadoop框架:Yarn基本结构和运行原理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Yarn基本结构 Hadoop三大核心组件:分布式文件系统HDFS.分布式计算框架MapReduce,分布式集群资源调度框架Yarn.Ya ...

  5. 【译】理解Rust中的Futures (一)

    原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...

  6. JAVA基础学习1

    一.JAVA是一种具有多种功能的高级语言:1,可以用于开发web页面上的小程序,桌面上运行的应用程序: 2,用于客户端服务器资源通讯的服务器端中间件: 3,还可以用于web服务器. 二.程序设计的5个 ...

  7. 跟我一起学Redis之高可用从主从复制开始

    前言 现在遇到高并发场景时,缓存技术应该算是性能优化的第一步,缓解数据库压力的同时还能提高访问效率,而Redis应该是绝大多数应用场景的首选.但是尽快Redis性能再优秀,在当今高并发场景下,一台服务 ...

  8. MATLAB绘图,绘双坐标轴,绘一图二轴等

    clc; clear all; close all; % %% 画极坐标系 % x = 0:.01 * pi:0.5 * pi; % y = cos(x) + sqrt(-1) * sin(x); % ...

  9. Jquery Ajax如何添加header参数

    转自网络 1 $.ajax({ 2 type: "POST", 3 url: "http://192.168.0.88/action.cgi?ActionID=WEB_R ...

  10. Autofac的基本使用---2、普通类型

    Autofac的基本使用---目录 准备 使用的表是Student,创建相关的IDAL.DAL.IBLL.BLL层. 使用EF,创建一个Model层,存放edmx文件. 控制台程序的使用 using ...