.NET Core引入日志(Log4Net篇)
Demo版本信息如下:
VS:2019
框架:.Net Core 3.1
Log4Net:2.0.12
思维导图:
【1】添加依赖项
通过nuget添加Log4Net
【2】创建公共类
添加公共类Log4NetLogger,实现ILogger, ILoggerProvider,扩展方法Log4netExtensions
- /// <summary>
- /// ILogger
- /// </summary>
- 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;
- }
- }
- }
- }
- /// <summary>
- /// ILoggerProvider
- /// </summary>
- 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"];
- }
- }
- /// <summary>
- /// 扩展方法 Log4netExtensions
- /// </summary>
- 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;
- }
- }
【3】Startup
在Startup中注册log4net
【5】配置文件
添加log4Net.config配置文件,需要注意,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//Error//" /><!--对于主要日志错误级别配置对应的文件夹-->
- <appendToFile value="true" /><!--是否进行文本追加-->
- <rollingStyle value="Date"/>
- <datePattern value="yyyy-MM-dd'.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//Warn//" />
- <appendToFile value="true" />
- <rollingStyle value="Date"/>
- <datePattern value="yyyy-MM-dd'.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//Info//" />
- <appendToFile value="true" />
- <rollingStyle value="Date"/>
- <datePattern value="yyyy-MM-dd'.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>
【6】测试
此Demo通过MVC实现测试,所以需要添加控制器与视图。
1、同时在Startup中注册MVC相关服务,services.AddControllersWithViews();
2、更改Configure中的UseEndpoints请求为MVC路由配置
- app.UseEndpoints(endpoints =>
- {
- endpoints.MapControllerRoute(
- name: "default",
- pattern: "{controller=Home}/{action=Index}/{id?}"
- );
- });
3、控制器中获取对象
- private readonly ILogger _logger;
- /// <summary>
- /// **************通过构造方法获取注册的Log4Net服务
- /// </summary>
- /// <param name="loggerFactory"></param>
- public HomeController(ILoggerFactory loggerFactory)
- {
- _logger = loggerFactory.CreateLogger<HomeController>();
- }
4、调用
- public IActionResult Index()
- {
- //************** 日志对象的引用
- _logger.LogInformation($"这是一个一般的日志消息");
- _logger.LogWarning($"这是一个警告的日志消息");
- _logger.LogError($"这是一个错误的日志消息");
- return View();
- }
.NET Core引入日志(Log4Net篇)的更多相关文章
- Log4net入门(回滚日志文件篇)
在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会 ...
- 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 重点: 实现多级子目录的压缩, ...
- .net core使用ocelot---第三篇 日志记录
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证使用 上篇介绍使用asp.net core 创建API网关.本文将介绍Ocelo ...
- .net core 中使用Log4net输出日志到Mysql数据库中
.net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...
- .NET Core的日志[5]:利用TraceSource写日志
从微软推出第一个版本的.NET Framework的时候,就在“System.Diagnostics”命名空间中提供了Debug和Trace两个类帮助我们完成针对调试和跟踪信息的日志记录.在.NET ...
- .NET Core的日志[1]:采用统一的模式记录日志
记录各种级别的日志是所有应用不可或缺的功能.关于日志记录的实现,我们有太多第三方框架可供选择,比如Log4Net.NLog.Loggr和Serilog 等,当然我们还可以选择微软原生的诊断框架(相关A ...
- .Net core的日志系统
.net core是内置了日志系统的,本文这里简单的介绍一下它的基本用法.如下是一个简单的示例: var service = new ServiceCollection() .AddLogging(l ...
- .NET Core开发日志——Entity Framework与PostgreSQL
Entity Framework在.NET Core中被命名为Entity Framework Core.虽然一般会用于对SQL Server数据库进行数据操作,但其实它还支持其它数据库,这里就以Po ...
- .NET Core开发日志——RequestDelegate
本文主要是对.NET Core开发日志--Middleware的补遗,但是会从看起来平平无奇的RequestDelegate开始叙述,所以以其作为标题,也是合情合理. RequestDelegate是 ...
随机推荐
- Springboot — 用更优雅的方式发HTTP请求:RestTemplate
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率. 我之前的HTTP开发是用ap ...
- 深入理解Java虚拟机(三)——垃圾回收策略
所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...
- SQL注入 (一)
一.手工注入 注入点检测 识别方法:通过在url栏输入'.and 1=1.or 1=1.and sleep(1),如果出现报错,或者页面不一致,则可能存在注入点. 注入类型:整数型.字符型.搜索型.B ...
- Hadoop框架:Yarn基本结构和运行原理
本文源码:GitHub·点这里 || GitEE·点这里 一.Yarn基本结构 Hadoop三大核心组件:分布式文件系统HDFS.分布式计算框架MapReduce,分布式集群资源调度框架Yarn.Ya ...
- 【译】理解Rust中的Futures (一)
原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futur ...
- JAVA基础学习1
一.JAVA是一种具有多种功能的高级语言:1,可以用于开发web页面上的小程序,桌面上运行的应用程序: 2,用于客户端服务器资源通讯的服务器端中间件: 3,还可以用于web服务器. 二.程序设计的5个 ...
- 跟我一起学Redis之高可用从主从复制开始
前言 现在遇到高并发场景时,缓存技术应该算是性能优化的第一步,缓解数据库压力的同时还能提高访问效率,而Redis应该是绝大多数应用场景的首选.但是尽快Redis性能再优秀,在当今高并发场景下,一台服务 ...
- MATLAB绘图,绘双坐标轴,绘一图二轴等
clc; clear all; close all; % %% 画极坐标系 % x = 0:.01 * pi:0.5 * pi; % y = cos(x) + sqrt(-1) * sin(x); % ...
- Jquery Ajax如何添加header参数
转自网络 1 $.ajax({ 2 type: "POST", 3 url: "http://192.168.0.88/action.cgi?ActionID=WEB_R ...
- Autofac的基本使用---2、普通类型
Autofac的基本使用---目录 准备 使用的表是Student,创建相关的IDAL.DAL.IBLL.BLL层. 使用EF,创建一个Model层,存放edmx文件. 控制台程序的使用 using ...