在使用log4net之前先安装log4net。这里操作很简单,通过nuget下载并安装log4net很方便。如下图。

  • log4net配置
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  5. </configSections>
  6.  
  7. <log4net>
  8. <!--定义输出到一个固定文件中-->
  9. <appender name="FileAppender" type="log4net.Appender.FileAppender">
  10. <file value="log/log.txt" />
  11. <appendToFile value="true" />
  12. <layout type="log4net.Layout.PatternLayout">
  13. <!--每条日志末尾的文字说明-->
  14. <header value="
  15. [============================应用程序日志开始============================ ]
  16. " />
  17. <footer value="
  18. [ ===========================应用程序日志结束=============================]
  19. " />
  20. <!--输出格式-->
  21. <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
  22. <conversionPattern value="%newline%newline记录时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
  23. </layout>
  24. </appender>
  25.  
  26. <!--定义输出到文件中,循环创建日志文件,以日期命名-->
  27. <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
  28. <!--定义文件存放位置 保存当前日期的日志,当第二天新日志产生时会把当前日期的日志保存备份-->
  29. <file value="log/log" />
  30. <!--禁止覆盖原有文件,true:覆盖原有文件-->
  31. <appendToFile value="false" />
  32. <rollingStyle value="Date" />
  33. <!--以天为单位进行日志滚动,保存过去日期的日志-->
  34. <datePattern value="yyyy-MM-dd-HHmm&quot;.txt&quot;" />
  35. <layout type="log4net.Layout.PatternLayout">
  36. <!--每条日志末尾的文字说明-->
  37. <header value="
  38. [============================应用程序日志开始============================ ]
  39. " />
  40. <footer value="
  41. [ ===========================应用程序日志结束=============================]
  42. " />
  43. <!--输出格式-->
  44. <!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
  45. <conversionPattern value="%newline%newline记录时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
  46. </layout>
  47. </appender>
  48.  
  49. <!--定义输出到控制台命令行中-->
  50. <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
  51. <layout type="log4net.Layout.PatternLayout">
  52. <!--输出格式-->
  53. <conversionPattern value="%newline时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
  54. </layout>
  55. </appender>
  56.  
  57. <!--定义以不同颜色输出到控制台-->
  58. <appender name="ManagedColoredConsoleAppender" type="log4net.Appender.ManagedColoredConsoleAppender">
  59. <mapping>
  60. <level value="ERROR" />
  61. <foreColor value="DarkRed" />
  62. </mapping>
  63. <mapping>
  64. <level value="WARN" />
  65. <foreColor value="Yellow" />
  66. </mapping>
  67. <mapping>
  68. <level value="INFO" />
  69. <foreColor value="DarkGray" />
  70. </mapping>
  71. <mapping>
  72. <level value="DEBUG" />
  73. <foreColor value="DarkGreen" />
  74. </mapping>
  75.  
  76. <layout type="log4net.Layout.PatternLayout">
  77. <!--输出格式-->
  78. <conversionPattern value="%newline时间:%date 线程ID:[%thread] 日志级别:%-5level 类名或程序集名:%logger %newline property:[%property{NDC}] - 描述:%message%newline" />
  79. </layout>
  80. </appender>
  81.  
  82. <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为log4net.mdb(可以自定义路径)-->
  83. <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
  84. <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=logDB/log4net.mdb" />
  85. <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
  86. <!--定义各个参数-->
  87. <parameter>
  88. <parameterName value="@logDate" />
  89. <dbType value="String" />
  90. <size value="240" />
  91. <layout type="log4net.Layout.PatternLayout">
  92. <conversionPattern value="%date" />
  93. </layout>
  94. </parameter>
  95. <parameter>
  96. <parameterName value="@thread" />
  97. <dbType value="String" />
  98. <size value="240" />
  99. <layout type="log4net.Layout.PatternLayout">
  100. <conversionPattern value="%thread" />
  101. </layout>
  102. </parameter>
  103. <parameter>
  104. <parameterName value="@logLevel" />
  105. <dbType value="String" />
  106. <size value="240" />
  107. <layout type="log4net.Layout.PatternLayout">
  108. <conversionPattern value="%level" />
  109. </layout>
  110. </parameter>
  111. <parameter>
  112. <parameterName value="@logger" />
  113. <dbType value="String" />
  114. <size value="240" />
  115. <layout type="log4net.Layout.PatternLayout">
  116. <conversionPattern value="%logger" />
  117. </layout>
  118. </parameter>
  119. <parameter>
  120. <parameterName value="@message" />
  121. <dbType value="String" />
  122. <size value="240" />
  123. <layout type="log4net.Layout.PatternLayout">
  124. <conversionPattern value="%message" />
  125. </layout>
  126. </parameter>
  127. </appender>
  128. <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
  129.  
  130. <root>
  131. <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
  132. 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
  133. 如果没有定义LEVEL的值,则缺省为DEBUG-->
  134. <level value="ALL"/>
  135. <!--文件形式记录日志-->
  136. <appender-ref ref="RollingFileAppender" />
  137. <!--控制台控制显示日志-->
  138. <!--<appender-ref ref="ConsoleAppender" />-->
  139. <!--控制台以不同颜色显示日志-->
  140. <appender-ref ref="ManagedColoredConsoleAppender" />
  141. <!--定义输出到数据库中。 如果不启用相应的日志记录,可以通过这种方式注释掉-->
  142. <!--<appender-ref ref="AdoNetAppender_Access" />-->
  143. </root>
  144. </log4net>
  145. </configuration>
  • 日志帮助类——Logger
  1. using System;
  2. using log4net;
  3. using log4net.Repository;
  4.  
  5. namespace wxApp.Code.Creater.Api.Common
  6. {
  7. public static class Logger
  8. {
  9. private static ILoggerRepository loggerRepository;
  10.  
  11. public static ILoggerRepository LoggerRepository { get; private set; }
  12. public static ILog Log { get; private set; }
  13.  
  14. /// <summary>
  15. /// 静态构造函数,程序启动时自动执行
  16. /// </summary>
  17. //static Logger()
  18. //{
  19. // LoggerRepository = CreateLoggerRepository();
  20. // LoadLog4NetConfig();
  21. //}
  22.  
  23. /// <summary>
  24. /// 初始化日志
  25. /// </summary>
  26. /// <returns></returns>
  27. public static void LoadLogger()
  28. {
  29. LoggerRepository = CreateLoggerRepository();
  30. LoadLog4NetConfig();
  31. }
  32.  
  33. /// <summary>
  34. /// 创建日志仓储实例
  35. /// </summary>
  36. /// <returns></returns>
  37. private static ILoggerRepository CreateLoggerRepository()
  38. {
  39. loggerRepository = loggerRepository ?? LogManager.CreateRepository("GlobalExceptionHandler"); // 单例
  40. return loggerRepository;
  41. }
  42.  
  43. /// <summary>
  44. /// 加载log4net配置
  45. /// </summary>
  46. private static void LoadLog4NetConfig()
  47. {
  48. // 配置log4net
  49. log4net.Config.XmlConfigurator.Configure(loggerRepository, new System.IO.FileInfo(System.IO.Directory.GetCurrentDirectory() + "/Config/log4net.config"));
  50.  
  51. // 创建log实例
  52. Log = LogManager.GetLogger(loggerRepository.Name, AppDomain.CurrentDomain.FriendlyName);
  53.  
  54. Log.Info("已加载日志配置");
  55. }
  56. }
  57. }
  • 全局异常捕获过滤器

全局异常捕获过滤器的代码如下,代码中并没有对异常做处理,只是直接输出到日志中,可以进一步对日志信息做处理使日志信息可读性更强。

  1. using Microsoft.AspNetCore.Mvc.Filters;
  2.  
  3. namespace wxApp.Code.Creater.Api.Common
  4. {
  5. public class HttpGlobalExceptionFilter : IExceptionFilter
  6. {
  7. public void OnException(ExceptionContext context)
  8. {
  9. Logger.Log.Error("全局异常过滤器捕获的异常:", context.Exception);
  10. }
  11. }
  12. }
  • 指定日志提供程序为log4net以及全局异常捕获

在Startup类的ConfigureServices方法中指定日志提供程序,代码如下。

  1. // 配置日志
  2. services.AddLogging(logConfig => {
  3. //log4net.Config.XmlConfigurator.Configure(Common.Logger.LoggerRepository);
  4. Common.Logger.LoadLogger();
  5. });

代码中Common.Logger.LoggerRepository为日志帮助类——Logger中创建的日志仓储实例。

在Startup类的ConfigureServices方法中添加全局异常捕获过滤器,代码如下。

  1. // 添加全局异常捕获
  2. services.AddMvc(option =>
  3. {
  4. option.Filters.Add<Common.HttpGlobalExceptionFilter>();
  5. });

ConfigureServices方法中完整代码如下。

.NET Core整合log4net以及全局异常捕获实现的更多相关文章

  1. .NET Core整合log4net以及全局异常捕获实现2

    Startup代码 public static ILoggerRepository repository { get; set; } public Startup(IConfiguration con ...

  2. Spring-MVC开发之全局异常捕获全面解读

    异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...

  3. gRPC全局异常捕获

    gRPC全局异常捕获 引 一般的.net项目比如ASP.NET.控制台程序.Windows服务.桌面程序等都会有framework自带的全局异常捕获机制.ASP.NET的ExceptionFilter ...

  4. MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获

    public class BaseController : Controller { /// <summary> /// Called after the action method is ...

  5. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

  6. C#中的那些全局异常捕获

    1.WPF全局捕获异常     public partial class App : Application     {         public App()         {    // 在异 ...

  7. Asp.Net MVC3(三)-MvcApp实现全局异常捕获

    定义异常捕获类: [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMu ...

  8. 使用spring利用HandlerExceptionResolver实现全局异常捕获

    最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...

  9. .Net下的全局异常捕获问题

    全局异常捕获主要目标并不是为了将异常处理掉防止程序崩溃.因为当错误被你的全局异常捕获器抓到的时候,已经证实了你程序中存在BUG. 一般而言,我们的全局异常捕获主要作用就是接收到异常之后进行异常的反馈. ...

随机推荐

  1. Filter,Listener(转)

    一.Filter的功能filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个reques ...

  2. Android分享介绍

    一.使用系统分享 public void execShare(Activity context,String title,String text){ Intent intent = new Inten ...

  3. vultr的80端口?

    1.查看防火墙版本号firewall-cmd --version2.查看防火墙状态firewall-cmd --state3.添加80端口的权限firewall-cmd --zone=public - ...

  4. idea 搭建 SpringBoot 集成 mybatis

    编译器:IDEA2018.2.3 环境:win10,jdk1.8,maven3.4 数据库:mysql 5.7 备注:截图较大,如果看不清,可以在图片上右键=>在新标签页中打开   查看高清大图 ...

  5. mongose TypeError: Cannot read property 'findOne' of undefined

    最近在node的一个项目中,需要在model的一个数据表中写一个钩子函数去调用另外一个文件中的方法,一开始我采用了将此方法放入到global中,直接从global.meteod这样去获取.后来我又尝试 ...

  6. uinty3d导入错误问题解决

    导入第一被复制到文件unity3d在相应的文件夹的安装文件夹.回归后,unity3d软体.正确的选择"输入". 版权声明:本文博主原创文章.博客,未经同意不得转载.

  7. 3 Task中的一些枚举 创建时候的、continue时候的

    创建时常用的枚举: None.PreferFairness.LongRunning.AttacthedToParent.DenyChildAttach.HideScheduler AttacthedT ...

  8. C# WPF QQ新消息托盘悬浮窗效果实现

    原文:C# WPF QQ新消息托盘悬浮窗效果实现 今天在做一个项目的时候需要这么一个效果,但是网上找了一会发现并没有现成的给我参考(复制),但是呢,我千(到)辛(处)万(抄)苦(袭)想(复)破(制)头 ...

  9. 使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中

    原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between- ...

  10. 机器学习: TensorFlow with MLP 笑脸识别

    Tensor Flow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数 ...