最近做个项目要用到日志系统,这这可把我给难住了,后来问了下度娘,发现只有你想不到的,没有那些找不到的开源组件,后来发现了log4net,但是我是控制台程序,没有个实例还真不好搞,想想还是看看他的运行过程吧,记录如下:

首先我们来分析一下Log4net的工作原理:

  Log4net是基于.NET开发的一款非常著名的记录日志开源组件。它通过一套XML配置的日志引擎,将日志分不同的等级,分别 是:FATAL 、 ERROR、 WARN、 INFO 、 DEBUG、ALL(允许所有的日志请求)和OFF(拒绝所有的日志请求),缺省为DEBUG,前五个可以看到和我们平常在调试应用程序的出错有点类似, 在编译器中也会留下如错误、警告之类的提示信息,它们的错误级别不断的降低。

  我们接着看Log4net的核心组成部分,Log4net主要由五个部分组成,分别为Logger,Appenders, Filters, Layouts 和Object Renders。

  1) Logger:主要负责日志的记录,它记录的方式有多种,可以是以文件、数据库、控制台、邮件等多处方式;

  2) Appenders:主要负责记录日志介质的方式,它的输出方式主要包括:

  AdoNetAppender:将日志记录到数据库中。可以采用SQL和存储过程两种方式。

  AspNetTraceAppender:能用ASP.NET中跟踪的方式查看记录的日志。

  BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。

  ColoredConsoleAppender:在终端的窗口写下高亮度的日志事件。

  ConsoleAppender:将日志输出到控制台。

  EventLogAppender:将日志写到Windows操作系统的日志中去。

  FileAppender:将日志写到文件中。

  ForwardingAppender:用来为一个Appender指定一组约束。

  MemoryAppender:将日志存到内存缓冲区。

  NetSendAppender:将日志输出到Windows Messenger service,这些日志信息将在用户终端的对话框中显示。

  OutputDebugStringAppender:配置该Appender以向OutputDebugString API写入日志。

  RemotingAppender:通过.NET Remoting将日志写到远程接收端。

  RollingFileAppender:将日志以回滚文件的形式写到文件中。

  SmtpAppender:将日志写到邮件中。

  SmtpPickupDirAppender:配置与SmtpAppender类似,但要把SmtpHost换为PickupDir。

  TraceAppender:将日志写到.NET trace 系统。

  UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

  以上有些输出方式可能会经常用到,有些可能会不经常用到,具体我们在下面举例来说明。

  3) Layouts:主要负责把记录日志格式化输出,显示得格式主要如下:

  %timestamp [%thread] %-5level %logger{2} %ndc - %message%newline

  timestamp: 表示程序已经开始执行的时间。 单位[毫秒]。

  Thread:执行当前代码的线程。

  Level:日志的级别。

  Logger:日志相关请求的名称。

  Message:日志消息。

  newline:换行。

  下面我们来举两个常用的实例来看看Log4net是如何在.NET环境下实现日志的记录的。

一、 文件记录方式:

  我们考虑一下这样的情况,首先我们要把日志的记录文件存放到一个记事本文档中,另外,随着应用程序运行的时间不断增长,写入这个记事本文件的内 容也会越来越大,这个时候,我们可能会想如果按天来生成日志文件或者文件大小到达一定的大小时就自动增加一个新的日志文件,无疑会提高我们检查日志的效 率,Log4net就可以轻松的实现这样的功能。我们看具体的应用,步骤如下:

  1) 首先建立一个Windows应用程序的项目,然后需要增加应用程序的配置文件App.Config,如果在WEB应用程序中,就需要配置 Web.Config,然后添加引用,加入之前我们在网上下载的Log4net.dll文件,然后在AssemblyInfo.cs文件里加入下面的语 句:

  [assembly: log4net.Config.DOMConfigurator(ConfigFileExtension = "config", Watch = true)]

  2) 在配置文件里面设置如下:

< ?xml version="1.0" encoding="utf-8" ?>

  < configuration>

  < !--日志配置部分-->

  < configSections>

  < section name="log4net" type="System.Configuration.IgnoreSectionHandler" />

  < /configSections>

  < !-- Log4net配置设定 -->

  < log4net debug="false">

  < appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">< !--RollingFileAppender将日志以回滚文件的形式写到文件中-->

  < file value="log.txt" />< !--输出日志文件的路径-->

  < appendToFile value="true" />< !--输出日志时自动向后追加-->

  < rollingStyle value="Composite" />

  < datePattern value=".yyyyMMdd" />< !--输出日期格式-->

  < maxSizeRollBackups value="10" />< !--日志最大个数-->

  < maximumFileSize value="1MB" />< !--单个日志的最大容量-->

  < staticLogFileName value="true" />< !--true表示当前最新日志文件名永远为file节中-->

  < layout type="log4net.Layout.PatternLayout">

  < conversionPattern value="%date %-5level %logger -%m%n" />

  < /layout>

  < /appender>

  < root>

  < level value="WARN" />

  < appender-ref ref="RollingLogFileAppender" />

  < /root>

  < /log4net>

  < /configuration>

  %d, %date :表示当然的时间

  %level : 表示日志的级别

  %logger, %c:表示日志产生的主题,通常是所在的类名,便于定位问题

  %m, %message :表示日志的具体内容

  %n, %newline: 换行

3) 然后在Form窗口的代码里先定义下面的接口:

  private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

  我们可以在窗口中拖动一个Button控件,然后在它的Click事件中,写入以下的代码:

  log.Error("这是一个错误日志");

  log.Fatal("这是一个致命的错误日志");

  log.Warn("这是一个警告日志");

  运行过后,然后点击Button,可以看到生成一个log.txt日志文件,里面写入的内容如下:

  2009-06-01 21:16:54,171 ERROR Log4netApp.Form1 -这是一个错误日志

  2009-06-01 21:16:54,187 FATAL Log4netApp.Form1 -这是一个致命的错误日志

  2009-06-01 21:16:54,187 WARN Log4netApp.Form1 -这是一个警告日志

  当我们在第二天再运行此程序时,就会发现到前一天生成的文件已经改名成log.txt.加上年月日了,效果如图一:

  

  图一 日志文件列表

  二、 数据库记录的方式:

  1) 建立存入日志的数据表LogInfo

      CREATE TABLE [dbo].[LogInfo] (

  [AddDate] [datetime] NOT NULL,

  [Message] [varchar] (2000) NOT NULL

  )

  2) 建立一个ASP.NET WEB项目,并将log4net.dll添加到引用。然后在AssemblyInfo.cs中加入下面的代码:

  [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

  3) 添加一个全局应用程序类Global.asax,然后在Application_Start事件里添加下面的代码:

  log4net.Config.XmlConfigurator.Configure();

  4) 接下来需要在Web.Config文件里面配置详细的数据库设置,如下:

  

< ?xml version="1.0"?>

  < configuration>

  < !--日志配置部分-->

  < configSections>

  < section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>

  < /configSections>

  < appSettings/>

  < connectionStrings/>

  < system.web>

  < compilation debug="true" />

  < authentication mode="Windows" />

  < /system.web>

  < !-- Log4net配置设定 -->

  < log4net>

  < logger name="LogRecord">

  < level value="ALL" />

  < appender-ref ref="AdoNetAppender_SqlServer" />

  < /logger>

  < appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">

  < bufferSize value="1"/>< !--log信息记录的缓冲大小 -->

  < connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

  < connectionString value="data source=(local);initial catalog=test1;integrated security=false;persist security info=True;User ID=sa;Password="/>< !--数据库连接字符串 -->

  < commandText value="INSERT INTO LogInfo([AddDate],[Message]) Values( @log_date,@message)"/> < !--数据库插入 -->

  < parameter>

  < parameterName value="@log_date" />

  < dbType value="DateTime" />

  < layout type="log4net.Layout.RawTimeStampLayout" />< !--当前日期 -->

  < /parameter>

  < parameter>

  < parameterName value="@message" />

  < dbType value="String" />

  < size value="2000" />

  < layout type="log4net.Layout.PatternLayout">< !--后台日志的信息 -->

  < conversionPattern value="%message" />

  < /layout>

  < /parameter>

  < /appender>

  < /log4net>

  < /configuration>

5) 然后在页面上拖一个Button控件和一个Label控件,在Button控件的点击事件中写入以下代码:

  

      try

  {

  ILog logger = LogManager.GetLogger("LogRecord");

  logger.Debug("用Log4Net写入数据库日志");

  }

  catch (Exception ex)

  {

  throw ex;

  }

  finally

  {

  lbMsg.Text="操作日志已经记录到数据库";

  }

  运行后,点击按钮,点击几次,就会在库中增加几条记录,效果如图二:

  

  图二 Log4net插入数据库

  以上介绍的是Log4net常用的两种日志的记录方法,在实际应用中,还有其它的记录方法,如控制台的应用、将日志的信息发送到指定的邮箱。

  可以见得,在开发过程中我们在运用Log4net时,可以给我们的应用程序带来丰富的体验度,通过提高日志的记录性能,可以精确的控制日志信息 的输出,在.NET中,可以方便的通过配置文件,就方便日志的记录,Log4net还有其它很多丰富的应用功能,感兴趣的朋友可以进一步的去研究它。

还是log4net的使用的更多相关文章

  1. Log4net - 规则简介

    参考页面: http://www.yuanjiaocheng.net/CSharp/csharprumenshili.html http://www.yuanjiaocheng.net/entity/ ...

  2. Log4net - 项目使用的一个简单Demo

    参考页面: http://www.yuanjiaocheng.net/entity/entitytypes.html http://www.yuanjiaocheng.net/entity/entit ...

  3. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  4. Log4Net应用问题

    问题 一.日志存储方式 1.txt 2.SQLServer数据库 3.log文件 二.项目类型不同 1winFrom 2webFrom 3MVC 4WPF 5控制台 三.切分依据不同 1.空间大小 2 ...

  5. 在C#代码中应用Log4Net系列教程(附源代码)

    Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这 ...

  6. Log4net入门(帮助类篇)

    在前几篇Log4net入门文件的讲述过程中,我们在使用log4net的类中都要编写如下一行代码: private static log4net.ILog log = log4net.LogManage ...

  7. Log4net入门(WCF篇)

    在上一篇Log4net入门(ASP.NET MVC 5篇)中,我们讲述了如何在ASP.NET MVC 5项目中使用log4net.在这一篇中,我们将讲述如何在WCF应用中使用log4net,为了讲述这 ...

  8. Log4net入门(ASP.NET MVC 5篇)

    在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...

  9. Log4net入门(SQL篇)

    我们在Log4net入门(回滚日志篇)中详细讲述了如何将日志信息输出到日志文件中,在这一篇中,我们将讲述如何将日志文件写入SQL Server数据库,以方便我们分析统计日志信息. 首先,我们在SQL ...

  10. Log4net入门(回滚日志文件篇)

    在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会 ...

随机推荐

  1. IPicture总结

    1.利用IPicture接口加载.显示图片 IPicture接口管理一个图片对象和它的属性.图片对象提供对Bitmap Icon Metafile的语言不相关的抽象支持.图像对象的主要接口是IPict ...

  2. 你真的用上keepalive了吗

    转自http://qa.blog.163.com/blog/static/19014700220134771052763/ Keep-Alive即俗称的长连接,使客户端到服务端建立的连接持续有效,当对 ...

  3. NODE.JS安装配置

  4. poj 1065 Wooden Sticks_贪心

    题意:将木棍放在机器里处理,第一根需要一分钟,剩余的如果大于等于前边放入的长度和重量,就不用费时间,否则需要一分钟,计算给出一组数的最少时间. 思路:先按长度排序,相同在比较重量,然后按顺序比较得出结 ...

  5. 单链表反转(递归和非递归) (Java)

    链表定义 class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } 非递归实现很简单,只需要遍历一遍链表,在遍历过 ...

  6. 2014:超越炒作,进入部署SDN的时代

    2013 年,我们看到了非常多新的SDN 产品.体系结构.营销活动和各种会议,一些新的标准和开源组织也进入了这个领域.当时的SDN 刚刚从炒作周期的高点回归下来.转眼到了2014 年,这一年我们会看到 ...

  7. nyoj 523 亡命逃窜 【BFS】

    亡命逃窜 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 从前有个叫hck的骑士,为了救我们漂亮的公主,潜入魔王的老巢,够英雄吧.只是英雄不是这么好当的.这个可怜的娃 ...

  8. Linux下命令行显示当前全路径方法

    /etc/profile 和 ~/.bashrc 或者直接在用户的.bash_profile中添加 export PS1='[\u@\h \W]\$' 然后执行source命令

  9. json输出用法+jquery validate

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  10. Silverlight学习(三)

    最近对WCFRIA+MVVM+Prism有了初步的认识,能够简单的实现一些数据库的交互.这节主要讲的是Silverlight通过domainservice和ado.net实体数据模型与数据库的交互.本 ...