【改进】用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> <!--错误日志记录数据库--> < ...
随机推荐
- rqnoj-105-核电站问题-dp
刚刚发现一个问题..原来这个oj叫rqnoj不是rnqoj... 简单的状态转换~~ #include<stdio.h> #include<string.h> #include ...
- android使用mount挂载/system/app为读写权限,删除或替换系统应用
注意:以下代码中#开头的则为需要执行的shell命令,其他的为打印的结果.#代表需要使用ROOT权限(su)执行,所以想要修改您android手机某个目录挂载为读写,首先需要有ROOT权限! 先要得到 ...
- 使用PUT方法上传文件无法工作原因分析
现象 在Spring Framework中,使用HTTP的PUT方法上传文件时,在服务器端发现Multipart参数为空. 原因 Spring中的StandardServletMultipartRes ...
- Qt + CURL + mimetic 发送邮件(带附件)
使用了大名鼎鼎的CURL 开源库,以及mimetic开源库. CURL支持N多协议.功能超强,但是不能直接发邮件附件,需要自己拼mime.太麻烦,于是乎~~ mimetic主要用于构造邮件mimeti ...
- Jquery EasyUi实战教程布局篇
转自:http://www.kwstu.com/ArticleView/kwstu_20139413501290 送给大家一个非常好的后台布局模板,本人后来就选择了这个模板http://www.kws ...
- (转)HTML5实战与剖析之触摸事件(touchstart、touchmove和touchend)
HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主 ...
- HTML输出 一 控制列背景颜色
#将需要读取的域名和端口列表保存在名为ports01.txt.ports02的文件中,文件与脚本位于相同目录下$CurrentPath = $MyInvocation.MyCommand.Path.s ...
- 用Spring3编写第一个HelloWorld项目
第一个HelloWorld程序 让我们用Spring来写第一个应用程序吧. 完成这一章要求: 熟悉Java语言 设置好Spring的环境 熟悉简单的Eclipse IDE的操作 如果你还没有设置好环境 ...
- stm32上的Lava虚拟机开发进度汇报(2)
现在已经基本完成了Lava主要函数的编写,但还是有几个问题没解决: 1.实心圆和实心椭圆 2.FillArea 3.GetWord 其中FillArea如果没有很好的解决方法就算了,GetWord用g ...
- 又来折腾Linux
硬盘坏了之后就没装过Linux了,因为弄了一个很老的台式机的80G并口硬盘,根本不够用的,一直懒得理. 前段时间实验室的老机子得报销了,但是里面的东西还可以拆下来,所以又拆下了两个硬盘,这样就有三个8 ...