【改进】用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,可是,在测试的时候,依旧无法实现写入。
后来发现问题在这里

这个【默认输出到目录】默认值是不复制的,所以无法实现写入。
在修改为复制之后成功写入。【同时调用方法不变】
【改进】用Log4net建立日志记录的更多相关文章
- C# 利用Log4Net进行日志记录
概述 本文主要简单说明如何使用Log4Net进行日志记录,在程序开发过程中记录日志的优点: 它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug: 一旦在程序中加入了Log 输出 ...
- Log4Net异常日志记录在asp.net mvc3.0的应用
前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...
- Log4Net异常日志记录在asp.net mvc3.0的应用(转载)
这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...
- 【转】使用Log4Net进行日志记录
首先说说为什么要进行日志记录.在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分.它可以记录下系统所产生的所有行为,并按照某种规范表达出来.我们可以使用日志系统所记录的信息为系统进行排错, ...
- winform 应用log4net做日志记录到mysql
1.nuget装log4net 2.nuget控件台装 mysql.data Install-Package mysql.data -version 6.8.3 (太高的版本用不了,切记) 3.修改a ...
- webAPI中使用log4net进行日志记录
1.从nuget下载log4net 2.根据需求配置web.config,或者另外写一个log4net.config文件,各个节点的意义详细查询api <section name="l ...
- asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...
- Log4Net + Log4Mongo 将日志记录到MongoDb中
实现: 将日志保存在MongoDb中: 自定义日志字段: 日志按照日期拆分集合: 第一部分:将日志保存在MongoDb中 新建控制台程序Log4MongoDemo 通过NuGet安装Log4Net ( ...
- log4net 添加自定义日志到数据库
添加操作日志到数据库举例: (一)建立数据库的操作日志表,如下我建立了一个简单的日志表 (二)配置文件中的配置如下 <log4net> <!--错误日志记录数据库--> < ...
随机推荐
- stdlib.h 头文件
stdlib 头文件即standard library标准库头文件.stdlib.h里面定义了五种类型.一些宏和通用工具函数. 类型例如size_t.wchar_t.div_t.ldiv_t和lldi ...
- MyBatis中井号与美元符号的区别
#{变量名}可以进行预编译.类型匹配等操作,#{变量名}会转化为jdbc的类型. select * from tablename where id = #{id} 假设id的值为12,其中如果数据库字 ...
- C++中用二维数组传参时形参该怎样写[转]
二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写? 要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正 ...
- CSS 边框的宽度
边框的宽度 您可以通过 border-width 属性为边框指定宽度. 为边框指定宽度有两种方法:可以指定长度值,比如 2px 或 0.1em:或者使用 3 个关键字之一,它们分别是 thin .me ...
- window.parent != window 解决界面嵌套问题
页面在被嵌套的时,效果:,,如果用户点击“刷新”,该问题即可解决. 如果想通过代码解决的话,这个问题属于客户端的问题,不是服务器端的问题. 如果直接写:window.location.href = “ ...
- HTML5画布Canvas
一.Canvas概念介绍 1.概念 Canvas : 画布 2.作用 : HTML5 Canvas 元素用于图形的绘制, 通过脚本(通常是JavaScript)来完成.它本身只是个图形容器,必须使用脚 ...
- iOS开发-Core Location和Map Kit
一.Core Location确定物理位置 利用以下3种技术: 1.GPS(最精确的) 2.蜂窝基站ID定位(cell ID Location) 3.WPS(Wi-Fi Positioning Ser ...
- Hadoop之父Doug Cutting
生活中,可能所有人都间接用过他的作品,他是Lucene.Nutch .Hadoop等项目的发起人.是他,把高深莫测的搜索技术形成产品,贡献给普罗大众:还是他,打造了目前在云计算和大数据领域里如日中天的 ...
- android开发在adapter中使用反射添加元素
android开发中最常用的控件之一就是listview,伴随listview还要有adapter和放入适配器的item.然后假设其中有一部分item的生成符合一定规律,Item item = new ...
- iOS开发笔记系列-基础5(分类和协议)
分类 在Objective-C中,除了通过新建子类的方式来向类添加新方法外,还可以通过分类的方式.分类提供了一种简单的方式,将类的定义模块化到相关方法的组或分类中,它还提供了扩展现有类定义的简便方式, ...