上一篇随笔中只使用了普通的文件读写来进行日志的写入,正如很多朋友说的,频繁的对文件进行读写会造成很多的问题,代码缺少边界控制和操作控制,没有对资源进行管理,是非常典型的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. JVM 关闭前执行命令的钩子

    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { public void run() { System.out.prin ...

  2. Epplus 使用的简单介绍

    操作Excel的主要有以下类库: MyXls(http://sourceforge.net/projects/myxls/) Koogra(http://sourceforge.net/project ...

  3. sql2008“备份集中的数据库备份与现有数据库不同”解决方法

    因为是在另一台电脑对同名数据库做的备份,用常规方法还原,提示不是相同数据库,不让还原,在网上找到下面的方法解决了: 一.右击系统数据库master,新建查询 执行以下SQL代码: RESTORE DA ...

  4. C#的枚举数(Enumerator)和可枚举类型(Enumerable)

    数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...

  5. ADO.NET 快速入门(十三):使用 OLE DB 检索数据

    OleDbDataReader 类提供了一种从数据源读取数据记录只进流的方法.如果想使用 SQL Server 7.0 或者更高版本,请参考文章:使用 SQL Server 检索数据.   OleDb ...

  6. android 手电筒的实现

    android手机用闪光灯做成手电筒的应用非常多,可是有的不能用. 后来发现是除了把 camera device的 flashmode设置成torch外还要打开预览: 以下是代码: MainActiv ...

  7. 【WinForm】C# 采用POST登录京东

    C# POST 传值登录 京东 想做一个DEMO 练练html的传值和接收,就用Winform 做了一个登录京东的程序. 首先参考的网址是: 艹蛋的青春じ 让我蛋疼ミ:http://www.cnblo ...

  8. BZOJ 4247 挂饰 背包DP

    4247: 挂饰 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id ...

  9. DELPHI 多线程

    效果不正确 unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Control ...

  10. C#制作一个消息拦截器(intercept)1

    首先,我们先要制作一个自己定义Attribute,让他能够具有上下文读取功能,所以我们这个Attribute类要同一时候继承Attribute和IContextAttribute. 接口IContex ...