Log4Net 日志配置[附带源码] 前述

    Log4Net 日志配置[附带源码] 前述

    • 商品编号:
      #20283882_725
      • 原价:
        免费
      • 会员价:
        免费
    • 版本:
      • V1.0.0
    • 数量:
      库存(不限)

    购物车中已存在此商品,请在购物车中操作单击跳转购物车

    • 编码格式:UTF-8
    • 开发语言:C#
    • 版本工具管理:GitHub
    • 源码架构:B/S
    • 开源协议:BSD协议
    • 开发者:每日一bo
    • 开发环境:VisualStudio
    • 数据库:无

    前述

      园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少查阅资料的时间。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库,并且我们还可以记载控制要记载的日志级别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).

    准备工作:

    1.下载log4net.dll 下载地址[http://logging.apache.org/log4net/download_log4net.cgi]

    下载文件:log4net-1.2.13-bin-newkey.zip。 解压选择对应的net版本找到log4net.dll。


     2.在项目中引用log4net.dll。 

     

    实例代码

    准备工作完成后我们来看下实例代码 ,首先在项目中创建一个文件夹LogConfig。把有关log4net的一些配置文件和类都放在这个文件夹里面。

    WEB网站为例,在项目LogConfig文件夹中创建Log4Net.config配置文件。

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <!--添加自定义节点:log4net  type:解析类名,程序集名(log4net.dll)-->
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
    
      <log4net>
        <!--定义输出到文件中-->
        <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
          <!--定义文件存放位置-->
          <file value="C:/log4net/"/>
          <!--是否追加到文件,默认为true,通常无需设置-->
          <appendToFile value="true"/>
          <RollingStyle value="Date"/>
          <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
          <DatePattern value="INFO_yyyyMMdd&quot;.log&quot;" />
          <!--日志文件名是否为静态-->
          <StaticLogFileName value="false"/>
          <!--多线程时采用最小锁定-->
          <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
          <!--布局(向用户显示最后经过格式化的输出信息)-->
          <layout type="log4net.Layout.PatternLayout">
            <!--
               %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 
               %n(new line):换行 
               %d(datetime):输出当前语句运行的时刻 
               %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 
               %t(thread id):当前语句所在的线程ID 
               %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 
               %c(class):当前日志对象的名称,例如:
               %L:输出语句所在的行号 
               %F:输出语句所在的文件名 
               %-数字:表示该项的最小长度,如果不够,则用空格填充
              -->
            <Header value="[Header]&#13;&#10;"/>
            <Footer value="[Footer]&#13;&#10;"/>
            <!--正文-->
            <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline"  />
          </layout>
        </appender>
    
        <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
          <file value="C:/log4net/"/>
          <appendToFile value="true"/>
          <RollingStyle value="Date"/>
          <DatePattern value="ERROR_yyyyMMdd&quot;.log&quot;" />
          <StaticLogFileName value="false"/>
          <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
          <layout type="log4net.Layout.PatternLayout">
            <Header value="[Header]&#13;&#10;"/>
            <Footer value="[Footer]&#13;&#10;"/>
            <!--正文-->
            <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline"  />
          </layout>
        </appender>
    
        <root>
          <level value="DEBUG"/>
          <appender-ref ref="Log4Net_ERROR" />
    
          <level value="INFO"/>
          <appender-ref ref="Log4Net_INFO" />
        </root>
    
      </log4net>
    
    </configuration>

    配置文件写完后我们在来写一个Helper类。同样在项目中创建一个名为LogHelper.cs的类文件。

    using log4net;
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
    
    //指定log4net使用的config文件来读取配置信息
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfig\Log4Net.config", Watch = true)]
    namespace Project.Log4.Net.LogConfig
    {
        /// <summary>
        /// 日志帮助类
        /// </summary>
        public class LogHelper
        {
            private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>();
    
            /// <summary>
            /// 获取记录器
            /// </summary>
            /// <param name="source"></param>
            /// <returns></returns>
            private static ILog GetLogger(Type source)
            {
                if (_loggers.ContainsKey(source))
                {
                    return _loggers[source];
                }
                else
                {
                    ILog logger = LogManager.GetLogger(source);
                    _loggers.TryAdd(source, logger);
                    return logger;
                }
            }
    
            /* Log a message object */
    
            /// <summary>
            /// 调试信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Debug(object source, string message)
            {
                Debug(source.GetType(), message);
            }
    
            /// <summary>
            /// 调试信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="ps"></param>
            public static void Debug(object source, string message, params object[] ps)
            {
                Debug(source.GetType(), string.Format(message, ps));
            }
    
            /// <summary>
            /// 调试信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Debug(Type source, string message)
            {
                ILog logger = GetLogger(source);
                if (logger.IsDebugEnabled)
                    logger.Debug(message);
            }
    
            /// <summary>
            /// 关键信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Info(object source, object message)
            {
                Info(source.GetType(), message);
            }
    
            /// <summary>
            /// 关键信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Info(Type source, object message)
            {
                ILog logger = GetLogger(source);
                if (logger.IsInfoEnabled)
                    logger.Info(message);
            }
    
            /// <summary>
            /// 警告信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Warn(object source, object message)
            {
                Warn(source.GetType(), message);
            }
    
            /// <summary>
            /// 警告信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Warn(Type source, object message)
            {
                ILog logger = GetLogger(source);
                if (logger.IsWarnEnabled)
                    logger.Warn(message);
            }
    
            /// <summary>
            /// 错误信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Error(object source, object message)
            {
                Error(source.GetType(), message);
            }
    
            /// <summary>
            /// 错误信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Error(Type source, object message)
            {
                ILog logger = GetLogger(source);
                if (logger.IsErrorEnabled)
                    logger.Error(message);
            }
    
            /// <summary>
            /// 失败信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Fatal(object source, object message)
            {
                Fatal(source.GetType(), message);
            }
    
            /// <summary>
            /// 失败信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            public static void Fatal(Type source, object message)
            {
                ILog logger = GetLogger(source);
                if (logger.IsFatalEnabled)
                    logger.Fatal(message);
            }
    
            /* Log a message object and exception */
    
            /// <summary>
            /// 调试信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Debug(object source, object message, Exception exception)
            {
                Debug(source.GetType(), message, exception);
            }
    
            /// <summary>
            /// 调试信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Debug(Type source, object message, Exception exception)
            {
                GetLogger(source).Debug(message, exception);
            }
    
            /// <summary>
            /// 关键信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Info(object source, object message, Exception exception)
            {
                Info(source.GetType(), message, exception);
            }
    
            /// <summary>
            /// 关键信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Info(Type source, object message, Exception exception)
            {
                GetLogger(source).Info(message, exception);
            }
    
            /// <summary>
            /// 警告信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Warn(object source, object message, Exception exception)
            {
                Warn(source.GetType(), message, exception);
            }
    
            /// <summary>
            /// 警告信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Warn(Type source, object message, Exception exception)
            {
                GetLogger(source).Warn(message, exception);
            }
    
            /// <summary>
            /// 错误信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Error(object source, object message, Exception exception)
            {
                Error(source.GetType(), message, exception);
            }
    
            /// <summary>
            /// 错误信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Error(Type source, object message, Exception exception)
            {
                GetLogger(source).Error(message, exception);
            }
    
            /// <summary>
            /// 失败信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Fatal(object source, object message, Exception exception)
            {
                Fatal(source.GetType(), message, exception);
            }
    
            /// <summary>
            /// 失败信息
            /// </summary>
            /// <param name="source"></param>
            /// <param name="message"></param>
            /// <param name="exception"></param>
            public static void Fatal(Type source, object message, Exception exception)
            {
                GetLogger(source).Fatal(message, exception);
            }
        }
    
    }

    配置和Helper类都有了..现在来看看调用方法。在项目中创建一个index.aspx页面

    LogHelper.Debug(this, "Debug");
    LogHelper.Error(this, "Error");
    LogHelper.Fatal(this, "Fatal");
    LogHelper.Info(this, "Info");
    LogHelper.Warn(this, "Warn");

    日志生成格式[每天一个文件]: 

     

    参数说明

    Log4Net.config是配置日志输出参数文件。在这个文件中可以到看很多配置节点,大体可以分为二个大类<configSections>...</configSections> 和 <log4net>...</log4net>。我们来看看这些节点都是啥意思。

    1:<configSections>..</configSections>:申明自定义节点log4net解析的类名和程序集名(log4net.dll)。

    2:<log4net>..</log4net>:使用log4net的配置信息都在这里设置。来重点看看都有那些设置信息,这个大节点整体也可以分为二类。

    2.1:定义输出信息设置节点<appender></appender>。

    2.2:定义日志的输出媒介<root></root>。

    配置的总体结构就是这样,下面来看一些详细内容。

     

    appender:决定日志输出的方式(可设置多个节点,如对INFO,ERROR等设置不同的输出方式)。

    主要包括已下几种:

    1 AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
    2 AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
    3 BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
    4 ConsoleAppender:将日志输出到控制台。
    5 EventLogAppender:将日志写到Windows Event Log. 
    6 FileAppender:将日志写到文件中。
    7 LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下). 
    8 MemoryAppender:将日志存到内存缓冲区。
    9 NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
    10 RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
    11 RemotingAppender:通过.NET Remoting将日志写到远程接收端。
    12 RollingFileAppender:将日志以回滚文件的形式写到文件中。(实例代码中使用的是此类型)
    13 SmtpAppender:将日志写到邮件中。
    14 TraceAppender:将日志写到.NET trace 系统。
    15 UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

    从上面提供的方式中可以看出能输出文件、控制台、Windows事件日志和数据库。这个可根据实际情况选择。

    <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
    ...
    </appender>

    这里配置的name(“Log4Net_INFO”)会在定义日志的输出媒介中使用到。name可任意设置。

    在appender 节点中还会配置一些文件存放的地址,日志个数等信息。这些在实例代码中都在体现,这里不做说明。我们在来看看日志最后输出呈现的布局设置信息。

    <layout type="log4net.Layout.PatternLayout">
      <!--头-->
      <Header value="[Header]"/>
      <!--脚注-->
      <Footer value="[Footer]"/>
      <!--正文-->
      <ConversionPattern value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>

     这里配置的信息最终是日志打印出来的样式。我们可以看到这里可以设置内容头Header和尾Footer。正文ConversionPattern。在正文中有出现有 %d  [%t]这些都是啥意思了表示什么。这里有一个对照表可提供参考:

    %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 
    %n(new line):换行 
    %d(datetime):输出当前语句运行的时刻 
    %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 
    %t(thread id):当前语句所在的线程ID 
    %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 
    %c(class):当前日志对象的名称,例如:
    %L:输出语句所在的行号 
    %F:输出语句所在的文件名 
    %-数字:表示该项的最小长度,如果不够,则用空格填充

    配置的基本也就这些。下就是root的配置说明 。

    root

    对设置输出的方式进行指定。

    <root>
      <!--批定DEBUG输出的文件形式记录日志-->
      <level value="DEBUG"/>
      <appender-ref ref="Log4Net_ERROR" />

      <!--批定INFO输出的文件形式记录日志-->
      <level value="INFO"/>
      <appender-ref ref="Log4Net_INFO" />
    </root>

    控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
    比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
    如果没有定义LEVEL的值,则缺省为DEBUG



    权利声明:本站所有商品信息、客户评价等信息是初心商城重要的数据资源,未经许可,禁止非法转载使用。 注:本站商品信息均来自初心商城,其真实性、准确性和合法性由初心商城负责。

                    初心源说明:初心商城主要为程序员提供开发基础的代码源以及成熟项目,网站中所有的商品有提供收费版本的, 也有提供免费版本的,按照大家各自不同的需求进行购买。实实在在的让程序员只用专注于自己的业务实现你的小梦想, 如果您对我们的成果表示认同并且觉得对你有所帮助我们愿意接受来自各方面的支持^_^。

                    支持:用手机扫描二维码支付

                    支付宝支持我们 微信支持我们

                    您的支持将被用于:
                    1、持续深入的上传更多更好的源代码
                    2、建立更加完善的技术社区
                    3、完善现在系统出现各种问题
                    4、购买域名和租赁服务器

                    1、交易规则

                    2、发货方式

                    1、自动:在上方保障服务中标有自动发货的商品,拍下后,将会自动收到来自卖家的商品获取(下载)链接

                    2、手动:在上方保障服务中标有手动发货的商品,拍下后,卖家会收到邮件,也可通过QQ或订单中的电话联系对方。

                    3、退款说明

                    1、描述:源码描述(含标题)与实际源码不一致的(例:描述PHP实际为ASP、描述的功能实际缺少、版本不符等)

                    2、演示:有演示站时,与实际源码小于95%一致的(但描述中有"不保证完全一样、有变化的可能性"类似显著声明的除外)

                    3、发货:手动发货源码,在卖家未发货前,已申请退款的

                    4、服务:卖家不提供安装服务或需额外收费的(但描述中有显著声明的除外)

                    5、其它:如质量方面的硬性常规问题等

                    备注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。交易中的商品,卖家无法对描述进行修改!

                    4、注意事项

                    1、客户买完之后未确认收货,将不会收到下载地址和下载码,确认收货之后才能收到下载地址和下载码。

                    2、在未拍下前,双方在QQ上所商定的内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准);

                    3、在商品同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外);

                    4、在没有"无任何正当退款依据"的前提下,写有"一旦售出,概不支持退款"等类似的声明,视为无效声明;

                    5、虽然交易产生纠纷的几率很小,但请尽量保留如聊天记录这样的重要信息,以防产生纠纷时出现问题不明确的情况。

                    5、交易声明

                    1、本站作为直卖平台,依据交易合同(商品描述、交易前商定的内容)来保障交易的安全及买卖双方的权益;

                    2、非平台线上交易的商品,出现任何后果均与本站无关;无论卖家以何理由要求线下交易的,请联系管理举报。

                    初心Logo

                    初心商城| 初心系列| 初心博客| 版本历史| 系统反馈

                    © 2016-2019 山西米立信息技术有限公司 保留所有权利 京ICP备16055626号
                    违法和不良信息举报电话:186-2950-9347,本网站所列数据,除特殊说明,所有数据均出自我工作室
                    本网站兼容所有主流浏览器,不支持手机自适应

                    返回顶部小火箭