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

    phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/ow ...

  2. js获取服务端IP及端口及协议

    alert("location:"+window.location); alert("href: "+window.location.href); alert( ...

  3. jQuery弹性滑动导航菜单实现思路及代码

    <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" /> <meta na ...

  4. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  5. cocos2d-x Mask的实现及优化

    转自:http://blog.ch-wind.com/cocos2d-x%E4%B8%ADmask%E7%9A%84%E5%AE%9E%E7%8E%B0%E5%8F%8A%E4%BC%98%E5%8C ...

  6. 逐行读取txt

    Dim fso, f1, ts, s Const ForReading = 1 Set fso = CreateObject("Scripting.FileSystemObject" ...

  7. .net抓取网页信息 - Jumony框架使用1

    往往在实际开发中,经常会用到一些如抓取网站信息之类的的操作,往往大家采用的是用一些正则的方式获取,但是有时候正则是很死板的,我们常常试想能不能使用jquery的选择器,获取符合自己要求的元素,然后进行 ...

  8. BW导航属性设置

    BW中的Attribute(属性)分为Display Att.和Navigation(导航) Att.,这里我就简称Dis. att和Nav. att了,导航属性可以做为变量来查询和做限制 1.首先进 ...

  9. 2013年中国区Skyline软件价格体系

    < 2013年中国区Skyline软件价格体系                         序号 产品名称 描述 市场报价         1 TerraExplorer Pro 5.1 对 ...

  10. Ruby on Rails Tutorial 第一章 之 Git项目管理

    1.安装和设置 (1)git的安装(略) (2)初始化设置 $ git config --global user.name "LihuaSun" $ git config --gl ...