上一篇随笔中只使用了普通的文件读写来进行日志的写入,正如很多朋友说的,频繁的对文件进行读写会造成很多的问题,代码缺少边界控制和操作控制,没有对资源进行管理,是非常典型的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,可是,在测试的时候,依旧无法实现写入。

后来发现问题在这里

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

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

【改进】用Log4net建立日志记录的更多相关文章

  1. C# 利用Log4Net进行日志记录

    概述 本文主要简单说明如何使用Log4Net进行日志记录,在程序开发过程中记录日志的优点: 它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug: 一旦在程序中加入了Log 输出 ...

  2. Log4Net异常日志记录在asp.net mvc3.0的应用

    前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...

  3. Log4Net异常日志记录在asp.net mvc3.0的应用(转载)

    这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...

  4. 【转】使用Log4Net进行日志记录

    首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错, ...

  5. winform 应用log4net做日志记录到mysql

    1.nuget装log4net 2.nuget控件台装 mysql.data Install-Package mysql.data -version 6.8.3 (太高的版本用不了,切记) 3.修改a ...

  6. webAPI中使用log4net进行日志记录

    1.从nuget下载log4net 2.根据需求配置web.config,或者另外写一个log4net.config文件,各个节点的意义详细查询api <section name="l ...

  7. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  8. Log4Net + Log4Mongo 将日志记录到MongoDb中

    实现: 将日志保存在MongoDb中: 自定义日志字段: 日志按照日期拆分集合: 第一部分:将日志保存在MongoDb中 新建控制台程序Log4MongoDemo 通过NuGet安装Log4Net ( ...

  9. log4net 添加自定义日志到数据库

    添加操作日志到数据库举例: (一)建立数据库的操作日志表,如下我建立了一个简单的日志表 (二)配置文件中的配置如下 <log4net> <!--错误日志记录数据库--> < ...

随机推荐

  1. Linux下MongoDB备份脚本

    #!/bin/bash today=`date +%Y%m%d` mongodump -h localhost -d salary -o /home/chzhao/mongobackup/$today ...

  2. codeforces 651A Joysticks

    A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  3. BestCoder Round #68 (div.2) geometry(hdu 5605)

    geometry Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  4. BestCoder Round #67 (div.2) N bulbs(hdu 5600)

    N bulbs Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Su ...

  5. HDU 4432 Sum of divisors (水题,进制转换)

    题意:给定 n,m,把 n 的所有因数转 m 进制,再把各都平方,求和. 析:按它的要求做就好,注意的是,是因数,不可能有重复的...比如4的因数只有一个2,还有就是输出10进制以上的,要用AB.. ...

  6. 在数据库各种状态下查询DBID的五大类十种方法汇总

    关于DBID: DBID是DataBase IDentifier的缩写,意思就是数据库的唯一标识符. 这个DBID在数据文件头和控制文件都是存在的,可以用于标示数据文件的归属. 对于不同数据库来说,D ...

  7. Codeforces Round #331 (Div. 2) B. Wilbur and Array 水题

    B. Wilbur and Array Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/596/p ...

  8. mac 环境下mysql 不能删除schema问题的解决办法

    首先说明下问题环境,我是在mac机器上安装的mysql+workbench. 在删除一个数据库的时候,出现error dropping database cant rmdir ./test 的问题. ...

  9. WebBrowser 禁用脚本错误提示

    public partial class Text : UserControl {        public Text()        {                              ...

  10. 天池大数据周冠军分享|附移动推荐算法赛答辩会Top5选手PPT

    上周是淘宝穿衣搭配算法大赛开始评测后的第一周,周冠军是来自浙江大学的"FUC AUTH"队.他们在夺得本周冠军之后,还将自己的获胜经验分享给了大家,究竟有什么秘诀呢? 阿里巴巴天池 ...