zoukankan      html  css  js  c++  java
  • ASP.NET MVC 使用 Log4net 记录日志

    Log4net 介绍

    Log4net 是 Apache 下一个开放源码的项目,它是Log4j 的一个克隆版。我们可以控制日志信息的输出目的地。Log4net中定义了多种日志信息输出模式。它可以根据需要将日志输出到控制台,文本文件,windows 日志事件查看器中,包括数据库,邮件等等位置,以便我们快速跟踪程序bug。

    Log4net 提供 7个日志等级,从高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG  > ALL

    Log4net 有 3个主要的成员, loggers ,appenders 和 layouts 。 

    • Logger 介绍
      Logger是负责日志的记录者,假设我们需要记录一些正常的运行时日志和出现异常时的错误日志,那么我们可以通过在配置文件当中添加两个Logger实现。Logger主要用于记录日志的分类和控制日志的级别。它可以以多种格式输出日志信息,同时它也可以控制日志的输出级别。
      log4net使用继承体系,也就是说假如存在两个Logger,名字分别为a.b.c和a.b。那么a.b就是a.b.c的祖先。每个Logger都继承了它祖先的属性
    • Appender 介绍
      提供日志记录的输出源,我们可以将日志输出到控制台,文本文件, windows 日志事件查看器中( 在Window日志>应用程序 中查看),数据库,邮件等。这些输出源都是通过 Appender 来配置实现。
      不建议将日志文件保存到数据库中,因为使用 sql 去排查日志还是比较困难的,最好是将日志文件保存的日志管理服务或Elasticsearch,该服务可以提供良好的全文索引以及其他功能。
    • Layout 介绍
      Layout 用于控制 Appender 的输出格式。
      Layout 中 PatternLayout 约定的字符串转换解释
      复制代码
          %m、%message         输出的日志消息
          %d、%datetime        输出当前语句运行的时刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}
          %r、%timestamp       输出程序从运行到执行到当前语句时消耗的毫秒数
          %p、%level           日志的当前优先级别
          %c、%logger          当前日志对象的名称
          %L、%line            输出语句所在的行号
          %F、%file            输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能
          %a、%appdomain       引发日志事件的应用程序域的名称。
          %C、%class、%type    引发日志请求的类的全名,警告:会影响性能
          %exception           异常信息
          %u、%identity        当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能
          %l、%location        引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件
          %M、%method          发生日志请求的方法名,警告:会影响性能
          %n、%newline         换行符
          %x、%ndc             NDC(nested diagnostic context)
          %X、%mdc、%P、%properties  等介于 %property
          %property           输出{log4net:Identity=, log4net:UserName=, log4net:HostName=} 
          %t、%thread         引发日志事件的线程,如果没有线程名就使用线程号。
          %w、%username       当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能
          %utcdate            发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}
          %%                  输出一个百分号
      复制代码

      更多内容请参考:http://logging.apache.org/log4net/release/sdk/html/T_log4net_Layout_PatternLayout.htm

    如何使用

    以 ASP.NET MVC 项目为例

     1.使用 Nuget 安装 log4net ,

    1
    PM> Install-Package log4net

    2.创建 log4net.config 配置文件 ,并且将该文件的属性“复制到输出目录”修改为 “始终复制”

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net-net-2.0"/>
      </configSections>
      <log4net>
        <root>
          <level value="ALL" />
          <appender-ref ref="LogFileAppender" />
          <!--<appender-ref ref="EventLogAppender" />-->
        </root>
        <!--定义输出到文件-->
        <appender name ="LogFileAppender" type="log4net.Appender.RollingFileAppender">
          <!--定义文件存放位置-->
          <param name="File" value ="App_Data"/>
          <param name="AppendToFile" value="true" />
          <param name="MaxSizeRollBackups" value="100" />
          <param name="MaxFileSize" value="10240" />
          <param name="StaticLogFileName" value="false" />
          <!--文件名格式-->
          <param name="DatePattern" value="yyyy.MM.dd'.txt'" />
          <param name="RollingStyle" value ="Date" />
          <!--不以独占方式记录日志,仅在记录每个日志的最短时间内锁定,因为部署到服务器上遇到了文件被占用无法下载日志-->
          <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
          <layout type="log4net.Layout.PatternLayout">
            <!--定义输出格式-->
            <!--示例 2018-08-20 12:10:49,348 -线程ID:[21] 日志级别:[INFO ] : [日志信息]-->
            <param name="ConversionPattern" value="%date 线程ID:[%thread] 日志级别:[%-5level] : [%message]%newline"/>
          </layout>
          <!--过滤级别 FATAL > ERROR > WARN > INFO > DEBUG-->
          <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG" />
            <param name="LevelMax" value="FATAL" />
          </filter>
        </appender>
        <!--定义输出到 windows 事件中-->
        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"></conversionPattern>
          </layout>
        </appender>
      </log4net>
    </configuration>
    复制代码

    3.创建 LogHelper 类,提供日志记录的方法

     View Code

    4. 在 Global.asax 文件 Application_Start 方法中加载你的 log4net.config 文件,并调用 LogHelper类测试记录日志。

    复制代码
    log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/log4net.config")));
    LogHelper.Default.WriteInfo("AppStart"); LogHelper.Default.WriteWarning("Warning"); LogHelper.Default.WriteError("Error"); LogHelper.Default.WriteFatal("Fatal"); try { int a = 3 / 4; int r = 4 / a; } catch (Exception ex) { LogHelper.Default.WriteError(ex.Message, ex); }
    复制代码

    5. 日志效果图

    可能遇到的问题

    由于 log4net 默认是独占文件的,如果程序部署在FTP空间上又需要下载日志文件的时候,会发现无法下载(进程被占用),此时需要更改 Appender(输出源) 的 lockingModel 。

    更多LockingModel 信息,请参考 https://logging.apache.org/log4net/release/sdk/html/P_log4net_Appender_FileAppender_LockingModel.htm

    <!--不以独占方式记录日志,仅在记录每个日志的最短时间内锁定,因为部署到服务器上遇到了文件被占用无法下载日志-->
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

    示例下载

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/sjqq/p/9507845.html
Copyright © 2011-2022 走看看