zoukankan      html  css  js  c++  java
  • 【改进】用Log4net建立日志记录

    上一篇随笔中只使用了普通的文件读写来进行日志的写入,正如很多朋友说的,频繁的对文件进行读写会造成很多的问题,代码缺少边界控制和操作控制,没有对资源进行管理,是非常典型的bad code。

    然后经过前辈们的提点,今天使用了Log4net进行日志的写入,发现非常的便捷,同时也集成了对于日志的控制,减少因为日志写入而发生的一系列不该有的错误。

    网上也有很多教程,在此,结合我的教训,我也厚颜无耻的贴出自己的实现步骤,欢迎前辈们指正!!!

    app.config配置文件,我是直接写在系统的app.config文件里面的,新建一个config配置文件会无法识别,也不知道为什么,求前辈指教

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
        </configSections>
        <log4net>
            <root>
                <level value="INFO"/>
                <!--文件形式记录日志-->
                <appender-ref ref="RollingLogFileAppender"/>
            </root>
            <appender  name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
                <!--日志位置-->
                <file value="Log\\" />
                <!--日志名称-->
                <datePattern value="yyyy-MM-dd'.txt'"/>
                <!--最小线程锁-->
                <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
                <!-- 追加到文件-->
                <appendToFile value="true"/>
                <!-- 滑动记录日志-->
                <RollingStyle value="Date"/>
                <!--非固定的日志名称-->
                <staticLogFileName value="false"/>
                <!--备份日志数目 -->
                <param name="MaxSizeRollBackups" value="100"/>
                <!--日志格式-->
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="记录时间:【%date】 [%t]%-5p  %n - %m%n"/>
                </layout>
            </appender>
        </log4net>
        <!--程序自带启动配置文件-->
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
        </startup>
    </configuration>

    以上配置每天会新建一个日志文件,我觉得这样子会方便管理,也方便查看。

    接下来,我们新建一个记录日志的公共类,来供其他操作使用我们的日志记录。

    using System;
    using System.Reflection;
    using log4net;
    using log4net.Config;
    
    [assembly: XmlConfigurator(Watch = true)]
    namespace DataBindingDemo.Helper
    {
        public static class LogHelper
        {
            /// <summary>
            /// 记录错误日志
            /// </summary>
            /// <param name="ex"></param>
            public static void LogError(Exception ex)
            {
                var type = MethodBase.GetCurrentMethod().DeclaringType;
                var log = LogManager.GetLogger(type);
                log.Error(ex);
            }
    
            /// <summary>
            /// 记录普通日志
            /// </summary>
            /// <param name="info"></param>
            public static void LogInfo(string info)
            {
                var type = MethodBase.GetCurrentMethod().DeclaringType;
                var log = LogManager.GetLogger(type);
                log.Info(info);
            }
        }
    }

    在这里,我只使用了两种日志的记录格式。

    有需要的同学可以根据自己的需要进行调整。

    问题:在 LogManager.GetLogger(type); 中的type不能为null,可是通过反射去获取方法类型我只会反射到上一层,不会反射到调用方法的层。也就是说这里type几乎没什么用。网上初略找了找也没有找到对应的详细解释。求前辈指点。

    使用方法

    LogHelper.LogInfo("记录第一个日志");

    这样就能记录下我们需要的日志了。

    疑问:通过配置只能把各种Log记录在一个文件夹下面,如果我想把日志分类,不同的log和关键log,错误log,记录在不同的文件夹中,在Log4net中想不到怎么去实现,求前辈再指点!

    跪谢!

    【解决分类保存Log的方法】

    经过前辈的提醒,通过设置多个appender来分级写入日志,同时也要用到log4net的filter过滤器来过滤不同等级的日志

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
        </configSections>
        
        <log4net>
            <root>
                <level value="ALL"/>
                <!--文件形式记录日志-->
                <appender-ref ref="RollingFileAppenderLogInfo"/>
                <appender-ref ref="RollingFileAppenderLogError"/>
            </root>
    
            <appender  name="RollingFileAppenderLogInfo" type="log4net.Appender.RollingFileAppender">
                <!--日志位置-->
                <file value="Log\\" />
                <!--日志名称-->
                <datePattern value="yyyy-MM-dd'.txt'"/>
                <!--最小线程锁-->
                <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
                <!-- 追加到文件-->
                <appendToFile value="true"/>
                <!-- 滑动记录日志-->
                <RollingStyle value="Date"/>
                <!--非固定的日志名称-->
                <staticLogFileName value="false"/>
                <!--备份日志数目 -->
                <param name="MaxSizeRollBackups" value="100"/>
                <!--日志格式-->
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="记录时间:【%date】 [%t]%-5p  %n - %m%n"/>
                </layout>
                <filter type="log4net.Filter.LevelRangeFilter">
                    <levelMin value="DEBUG" />
                    <levelMax value="INFO" />
                </filter>  
            </appender>
            
            <appender  name="RollingFileAppenderLogError" type="log4net.Appender.RollingFileAppender">
                <!--日志位置-->
                <file value="LogError\\" />
                <!--日志名称-->
                <datePattern value="yyyy-MM-dd'.txt'"/>
                <!--最小线程锁-->
                <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
                <!-- 追加到文件-->
                <appendToFile value="true"/>
                <!-- 滑动记录日志-->
                <RollingStyle value="Date"/>
                <!--非固定的日志名称-->
                <staticLogFileName value="false"/>
                <!--备份日志数目 -->
                <param name="MaxSizeRollBackups" value="100"/>
                <!--日志格式-->
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="记录时间:【%date】 [%t]%-5p  %n - %m%n"/>
                </layout>
                <filter type="log4net.Filter.LevelRangeFilter">
                    <levelMin value="ERROR" />
                    <levelMax value="FATAL" />
                </filter>
            </appender>
        
        </log4net>
        <!--程序自带启动配置文件-->
        <startup>
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
        </startup>
    </configuration>

    在filter中,我们过滤了相应等级的日志,分别在不同appender中写入不同的文件夹,这样,管理日志和错误就更加的简便和快捷了。

    在解决了分类记录日志之后,着手解决单独配置config文件了。

    同同样的,我们在项目中新建config文件,命名为【log4net.config】写下配置文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <configSections>
            <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
        </configSections>
        <log4net>
            <root>
                <level value="ALL"/>
                <!--文件形式记录日志-->
                <appender-ref ref="RollingFileAppenderLogInfo"/>
                <appender-ref ref="RollingFileAppenderLogError"/>
            </root>
    
            <appender  name="RollingFileAppenderLogInfo" type="log4net.Appender.RollingFileAppender">
                <!--日志位置-->
                <file value="Log\\" />
                <!--日志名称-->
                <datePattern value="yyyy-MM-dd'.txt'"/>
                <!--最小线程锁-->
                <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
                <!-- 追加到文件-->
                <appendToFile value="true"/>
                <!-- 滑动记录日志-->
                <RollingStyle value="Date"/>
                <!--非固定的日志名称-->
                <staticLogFileName value="false"/>
                <!--备份日志数目 -->
                <param name="MaxSizeRollBackups" value="100"/>
                <!--日志格式-->
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="记录时间:【%date】 [%t]%-5p  %n - %m%n"/>
                </layout>
                <filter type="log4net.Filter.LevelRangeFilter">
                    <levelMin value="DEBUG" />
                    <levelMax value="INFO" />
                </filter>
            </appender>
    
            <appender  name="RollingFileAppenderLogError" type="log4net.Appender.RollingFileAppender">
                <!--日志位置-->
                <file value="LogError\\" />
                <!--日志名称-->
                <datePattern value="yyyy-MM-dd'.txt'"/>
                <!--最小线程锁-->
                <lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
                <!-- 追加到文件-->
                <appendToFile value="true"/>
                <!-- 滑动记录日志-->
                <RollingStyle value="Date"/>
                <!--非固定的日志名称-->
                <staticLogFileName value="false"/>
                <!--备份日志数目 -->
                <param name="MaxSizeRollBackups" value="100"/>
                <!--日志格式-->
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="记录时间:【%date】 [%t]%-5p  %n - %m%n"/>
                </layout>
                <filter type="log4net.Filter.LevelRangeFilter">
                    <levelMin value="ERROR" />
                    <levelMax value="FATAL" />
                </filter>
            </appender>
    
        </log4net>
    </configuration>

    然后在需要使用log的地方命名空间处添加   [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"Helper\log4net.config", Watch = true)]

    尽管我们在在代码中已经设置了watch为true,可是,在测试的时候,依旧无法实现写入。

    后来发现问题在这里

    这个【默认输出到目录】默认值是不复制的,所以无法实现写入。

    在修改为复制之后成功写入。【同时调用方法不变】

  • 相关阅读:
    Meet Hadoop
    C++常用函数
    Summary
    获得小黄衫感想
    课程作业(八)
    课程作业(七)
    课程作业(六)
    课程作业(五)
    课程作业(四)
    课程作业(三)
  • 原文地址:https://www.cnblogs.com/Bobdong/p/5026215.html
Copyright © 2011-2022 走看看