Log4在.NetCore中的应用

摘要:
--错误日志附件媒体--˃˂!

1.管理Nuget程序包,安装Log4

2.log4net.config 的编写(有异常日志类和信息日志类,按需要配置)

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <log4net>
    <!-- 错误日志类-->
    <logger name="logerror">
      <level value="ALL" />
      <appender-ref ref="ErrorAppender" />
    </logger>
    <!-- 错误日志附加介质-->
    <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志文件路径-->
      <param name="File" value="Log\LogError\" />
      <!--是否是向文件中追加日志-->
      <param name="AppendToFile" value="true" />
      <!--log保留天数-->
      <param name="MaxSizeRollBackups" value="1000" />
      <!--最大文件大小-->
      <param name="MaxFileSize" value="10240" />
      <!--日志文件名是否是固定不变的-->
      <param name="StaticLogFileName" value="false" />
      <!--日志文件名格式为:2008-08-31.log-->
      <param name="DatePattern" value="yyyy-MM-dd&quot;.htm&quot;" />
      <!--日志根据日期滚动-->
      <param name="RollingStyle" value="Date" />
      <!--信息日志布局-->
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n【异常时间】:%d [%t] &lt;BR&gt;%n【异常级别】:%-5p &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  />
      </layout>
    </appender>
  </log4net>

</configuration>

cofig配置好之后,在startup里面,创建log仓储

 public static ILoggerRepository repository { get; set; }
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            repository = LogManager.CreateRepository("LogRepository");//创建一个Log仓储
            XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));//文件流读取log配置文件
            InitRepository.LogRepository = repository;
        }

运行后,会在程序目录创建文件夹和html文件

Log4在.NetCore中的应用第1张

现在我们写一个异常,将异常写入到日志里。

首先我们需要写一个全局异常的过滤器GlobalExceptions,捕获程序异常

//全局异常捕获过滤器
    public class GlobalExceptions : IExceptionFilter
    {
        private readonly IHostingEnvironment _env;
        public GlobalExceptions(IHostingEnvironment env)
        {
            _env = env;
        }
        /// <summary>
        /// 当出现异常的时候,会调用该方法捕获异常,该方法是对IExceptionFilter里面的OnException的实现
        /// </summary>
        /// <param name="context"></param>
        public void OnException(ExceptionContext context)
        {
            //将异常上下文给到LogHelper写入
             LogHelper.ErrorLog(context.Exception);
                
        }
    }
这里我们需要将过滤器注册下

Log4在.NetCore中的应用第2张

OnException方法是对IExceptionFilter里同名方法的实现,当抛出异常的时候就会进入这里了,我们将异常上下文给到LogHelper,帮忙写入到日志文件中
LogHelper部分代码
 public class InitRepository
    {
        public static ILoggerRepository LogRepository { get; set; }
    }

    public class LogHelper
    {
        //全局异常错误记录持久化
        private static readonly ILog logerror = LogManager.GetLogger(InitRepository.LogRepository.Name, "logerror");
        //自定义操作记录
        //private static readonly ILog loginfo = LogManager.GetLogger(InitRepository.LogRepository.Name, "loginfo");

        #region 全局异常错误记录持久化    
        /// <summary>
        /// 全局异常错误记录持久化     
        /// </summary>
        /// <param name="ex">异常上下文</param>
        public static void ErrorLog(Exception ex)
        {
            string errorMsg = string.Format("【异常信息】:{0} <br>【异常类型】:{1} <br>【堆栈调用】:{2} <br>", new object[] {ex.Message,
                ex.GetType().Name, ex.StackTrace });
            errorMsg = errorMsg.Replace("
", "<br>");
            errorMsg = errorMsg.Replace("位置", "<strong style="color:red">位置</strong>");
            logerror.Error(errorMsg);
        }
        #endregion


        #region 自定义操作记录       
        /// <summary>
        /// 自定义操作记录,与仓储中的增删改的日志是记录同一张表,操作记录暂不需要        
        /// </summary>
        /// <param name="throwMsg"></param>
        /// <param name="ex"></param>
        //public static void WriteLog(string throwMsg, Exception ex)
        //{
        //    string errorMsg = string.Format("【抛出信息】:{0} <br>【异常类型】:{1} <br>【异常信息】:{2} <br>【堆栈调用】:{3}", new object[] { throwMsg,
        //        ex.GetType().Name, ex.Message, ex.StackTrace });
        //    errorMsg = errorMsg.Replace("
", "<br>");
        //    errorMsg = errorMsg.Replace("位置", "<strong style="color:red">位置</strong>");
        //    logerror.Error(errorMsg);
        //}
        #endregion

    }

现在我们去写一个异常

Log4在.NetCore中的应用第3张

这里重点说下,写异常的时候不能加async,这个标识会在主线程下创建一个子线程,当没有await 返回程序执行结果或异常的时候,异常会直接死在子线程里,不回被全局异常捕获到,大概就是下面这个意思

Log4在.NetCore中的应用第4张

我们去掉标识再执行这个异常,监测主线程的过滤器就能检测到异常,Loghelper将异常信息写入文件

Log4在.NetCore中的应用第5张



免责声明:文章转载自《Log4在.NetCore中的应用》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇DirectFB简介以及移植[一]【转】cad.net 文字偏移及符号表下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

ubuntu 常见安装软件错误

安装xlibs dev.2。错误:apt-get-installlibqt3-headers libqt3-mt-dev3。错误:这基本上意味着它要安装许多KDEspecificpackagestowork。这个'configure:aapt-get-installbuild essential7。错误:...

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

Oracle 12c新特性(For DBA)

2: Oracle12cIn-MemoryOracle12cIn-Memory提供了一种独特的双格式体系结构,它可以使用传统的行格式和新的内存列格式同时在内存中存储表。与其他NOSQL分片结构相比,OracleSharding提供了优异的运行时性能和更简单的生命周期管理。OracleSharding使用GDS体系结构自动部署和管理分片和复制技术。GDS还提供...

java实现word转pdf文件(高效不失真)

importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;importorg.aspectj.weaver.ast.Test;importcom.aspose.words.Document;importcom.aspose.words.License;importc...

sqlmap 安装使用

Id=1“”8)从配置文件加载攻击目标,并使用参数“-c”指定配置文件。Sqlmap将解析配置文件并根据配置文件的配置执行操作。sqlmap conf文件的安装目录中有一个名为sqlmap的文件,它是配置文件的模板。Id=1“--当前用户#列出数据库sqlmap.py u的所有用户”http://192.168.12.157:30336/#/login?...

ORACLE无法删除当前连接用户

今天在做Oracle数据库是遇到ORACLE无法删除当前连接用户,经查找可用如下方法解决。SQL˃dropuseracascade;//删除用户以及用户表空间下所有对象用户已丢弃。...