【改进】用Log4net建立日志记录

摘要:
--文件记录日志--˃˂!接下来,我们将创建一个新的公共类来记录其他操作的日志。使用LogHelper LogInfo;通过这种方式,我们可以记录所需的日志。如前所述,多个附加器设置为分层写入日志,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)]

【改进】用Log4net建立日志记录第1张

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

后来发现问题在这里

【改进】用Log4net建立日志记录第2张

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

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

免责声明:文章转载自《【改进】用Log4net建立日志记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ocelot和Consul 实现网关API 服务注册 负载均衡macos php安装扩展sqlsrv连接sqlserver下篇

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

相关文章

jmeter将响应结果中的Excel导出到本地

时间戳的命名方式避免出现导出记录重复而无法再次导出的现象 import java.io.*;import java.text.SimpleDateFormat;import java.util.Date; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");//设置日期格式S...

shell计算时间差

#!/bin/bash current1=`date "+%Y-%m-%d %H:%M:%S"` start_time=`date -d "$current1" +%s` sleep 5s current2=`date "+%Y-%m-%d %H:%M:%S"` end_time=`date -d "$current2" +%s` #相减算差值...

odoo使用笔记

1:active字段为False的记录如何显示: odoo中默认,active字段为False的记录上不显示的。但是如果在创建时没有勾选active,之后想要显示它,那就需要吧active修改为True。 然而它现在是不可见的,怎么修改? 通过odoo提供的搜索视图来实现: 自定义筛选——active字段——为假 即可把active为False的记录显示出...

SQL语句oracle中如何插入Date类型的数据

在开发的时候,经常要写条SQL语句将信息插入表中,插入的数据如果字段是date类型,就必须将date类型转换成字符串String类型在通过sql语句插入数据库。这是我字段唯一的方法,如果有高人请另赐教! 我的解决方法是用oracle中的to_date()方法,具体看下面的例子 Oracle中插入date数据代码 insertintonews(ID,MS...

Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等

这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数、Mybatis、事务管理等。 本节所使用的代码是在上一节项目代码中,继续追加的,因此需要先学习上一节内容。 一、使用@Async实现异步调用 要在springboot中使用异步调用方法,只要在被调用的方法上面加上@Async就可以...

Shell脚本编程(一)

shell 脚本编程(一) 1 . shell 的作用 Shell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地...