【转】使用Log4Net进行日志记录

     首先说说为什么要进行日志记录。在一个完整的程序系统里面,日志系统是一个非常重要的功能组成部分。它可以记录下系统所产生的所有行为,并按照某种规范表达出来。我们可以使用日志系统所记录的信息为系统进行排错,优化系统的性能,或者根据这些信息调整系统的行为。

     Log4net是一个很著名的开源的日志记录组件。官方网址为:http://logging.apache.org/log4net/ ,使用Log4net能够很简单的为我们的程序添加日志记录功能。下面我们先通过一个网站例子来说明如何在.net中使用log4net。

创建日志记录步骤

第一步,

       当然是添加log4net.dll的引用啦,我这里提供一个log4net的dll文件,懒得去官网下的可以到这里下http://www.vdisk.cn/down/index/7509396A7366

第二步,

       在AssemblyInfo.cs文件中添加下面一句话:


1

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

这句话的意思是log4net会自动寻找配置文件App.config或Web.config从而获得并加载其中的配置信息。如果想log4net随时监视配置文件以便重新加载的话就要这样写按照上面一样写(winform程序ConfigFile为App.config)。

第三步,

      配置Web.config。

<configuration>

  <configSections>

        <!--注意:这里需要添加-->
        <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
   </configSections>
  <connectionStrings>
    <add name="ApplicationServices"
         connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
         providerName="System.Data.SqlClient" />
  </connectionStrings>

   <!--注意:这里需要添加-->

   <log4net>

        <!--定义输出到文件中-->
        <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
            <!--定义文件存放位置-->
            <file value="C:\log.txt" />
            <appendToFile value="true" />
            <rollingStyle value="Date" />
            <datePattern value="yyyyMMdd-HH:mm:ss" />
            <layout type="log4net.Layout.PatternLayout">
                <!--输出格式-->
                <!--样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
                <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
            </layout>
        </appender>

        <!--定义输出到控制台命令行中-->
        <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>

        <!--定义输出到windows事件中-->
        <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
            </layout>
        </appender>

        <!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
        <appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
            <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
            <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
            <!--定义各个参数-->
            <parameter>
                <parameterName value="@logDate" />
                <dbType value="String" />
                <size value="240" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%date" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@thread" />
                <dbType value="String" />
                <size value="240" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%thread" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@logLevel" />
                <dbType value="String" />
                <size value="240" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%level" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@logger" />
                <dbType value="String" />
                <size value="240" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%logger" />
                </layout>
            </parameter>
            <parameter>
                <parameterName value="@message" />
                <dbType value="String" />
                <size value="240" />
                <layout type="log4net.Layout.PatternLayout">
                    <conversionPattern value="%message" />
                </layout>
            </parameter>
        </appender>

        <!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
        <root>
            <!--文件形式记录日志-->
            <appender-ref ref="LogFileAppender" />
            <!--控制台控制显示日志-->
            <appender-ref ref="ConsoleAppender" />
            <!--Windows事件日志-->
            <!--<appender-ref ref="EventLogAppender" />-->
            <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉
                <appender-ref ref="AdoNetAppender_Access" />
            -->
        </root>

    </log4net>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpModules>

      <add name="fileUpload" type="WebApplication3.ProcessFileModule"/>
    </httpModules>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
      <providers>
        <clear/>
        <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
             enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
             maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
             applicationName="/" />
      </providers>
    </membership>

    <profile>
      <providers>
        <clear/>
        <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
      </providers>
    </profile>

    <roleManager enabled="false">
      <providers>
        <clear/>
        <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
        <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
      </providers>
    </roleManager>
    <httpRuntime maxRequestLength="10240000"/>
  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

上面这段配置取自周公,配置的说明上面已经注释的比较详细了。

第四步,

在程序中记录信息。我们在项目下Default.aspx的Page_Load方法加入如下代码:

           //获得log4net实例
           ILog log = log4net.LogManager.GetLogger("LogFileAppender");
           log.Info("Default.aspx下面的PageLoad方法被执行");

然后运行项目,可以发现在c:\log4netfile.txt中已经记录了一条日志信息:

记录时间:2011-04-21 21:26:17,729 线程ID:[4] 日志级别:INFO  出错类:LogFileAppender property:[(null)] - 错误描述:Default.aspx下面的PageLoad方法被执行

通过上面这几步我想您已经能够为程序创建一些简单日志记录功能了。下面我们再来详细说说log4net其他的一些使用方法与特点。

log4net详细说明

    这里我通过问答的形式来说明log4net的一些应用。

1.log4net总共有几种记录方式,每种方式该如何配置与使用?

Log4net目前支持的输出方式包括:

1 AdoNetAppender

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

2 AnsiColorTerminalAppender

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

3 AspNetTraceAppender

     能用asp.net中Trace的方式查看记录的日志。

4 BufferingForwardingAppender

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

5 ConsoleAppender

     将日志输出到控制台。

6 EventLogAppender

     将日志写到Windows Event Log.

7 FileAppender

     将日志写到文件中。

8 LocalSyslogAppender

     将日志写到local syslog service (仅用于UNIX环境下).

9 MemoryAppender

     将日志存到内存缓冲区。

10 NetSendAppender

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

11 RemoteSyslogAppender

     通过UDP网络协议将日志写到Remote syslog service。

12 RemotingAppender

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

13 RollingFileAppender

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

14 SmtpAppender

     将日志写到邮件中。

15 TraceAppender

     将日志写到.NET trace 系统。

16 UdpAppender

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

 

可以看到目前支持的方式还是很多的,我这里调几个认为常用的做个例子。

  1.文件的方式我们上面已经讲过了,这里不再做例子了。

  2.数据库方式:

    首先,添加数据库记录appender

<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
        <!--数据库连接字符串-->
        <connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
        <commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
        <!--定义各个参数-->
        <parameter>
            <parameterName value="@logDate" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@thread" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%thread" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@logLevel" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%level" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@logger" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%logger" />
            </layout>
        </parameter>
        <parameter>
            <parameterName value="@message" />
            <dbType value="String" />
            <size value="240" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%message" />
            </layout>
        </parameter>
    </appender>

然后建立c:log4net.mdb 数据库,并在代码中启用数据库记录方式:

           //获得log4net实例
           ILog log = log4net.LogManager.GetLogger("AdoNetAppender_Access");
           log.Debug("Default.aspx下面的PageLoad方法被执行");

这样日志就被记录到数据库中了。

2.log4net如何过滤我想要的日志信息,比如一个日志中只记录程序错误日志?

这个需求可以通过配置filter来实现。具体操作如下:

    全局方式

    这种方式会将级别应用于所有的日志输入方式。具体操作为在root节点下添加:

     <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
         比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
     -->
     <!--如果没有定义LEVEL的值,则缺省为DEBUG-->
     <level value="ERROR" />

这样对于所有的日志记录方式,所有地域ERROR级别的都不会被记录了。

     单独配置级别方式:

      该方式不会影响其他的日志输入方式。方法如下为,在具体的appender下添加filter:

          <filter type="log4net.Filter.LevelRangeFilter">
               <param name="LevelMin" value="ERROR" />
               <param name="LevelMax" value="Fatal" />
           </filter>

这种方式可以配置记录级别的方位,如果只需要记录一种,则最大和最小设置一样就行了。

3.你上面的日志输出格式我不喜欢,如何在log4net中配置我想要的日志输出格式?

log4net的输入格式定义在每个appender的layout中。具体的有以下内置可选项:

%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 
%n(new line):换行 
%d(datetime):输出当前语句运行的时刻 
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 
%t(thread id):当前语句所在的线程ID 
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 
%c(class):当前日志对象的名称,例如: 
%f(file):输出语句所在的文件名。 
%l(line):输出语句所在的行号。 
%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。

通过这些东西,你可以任意组合你喜欢的输出格式内容。

 

4.有没有方式控制程序自动按日期记录日志信息,即每天的日志都在不同的日志文件中?

其实这种方式对应于一种特定的记录方式:RollingFileAppender。这种方式也是基于文件记录的,不过他提供更加灵活的日志记录方式。具体说来他可以按日志文件的大小或者日志记录的时间进行自动变换日志文件。

按每天不同的日期进行记录分类:

<appender name="RollingLogFileAppenderEveryMin" type="log4net.Appender.RollingFileAppender">

<!--日志文件名开头-->

<file value="c:\logfile.txt" />

<!--是否追加到文件-->

<appendToFile value="true" />

<!--变换的形式为日期-->

<rollingStyle value="Date" />

<!--日期的格式,每分钟换一个文件记录-->

<datePattern value="yyyyMMdd-HHmm" />

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

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />

</layout>

</appender>

按照日志文件的大小进行变换,通过这种方式可以有效降低日志文件体积膨胀的问题:

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">

<!--日志文件名-->

<file value="c:\log.txt"/>

<!--是否在文件中追加-->

<appendToFile value="true"/>

<!--按照文件的大小进行变换日志文件-->

<rollingStyle value="Size"/>

<!--最大变换数量,如果超过这个数量则从第一个文件开始复写-->

<maxSizeRollBackups value="10"/>

<!--最大文件大小,支持KB,MB,GB-->

<maximumFileSize value="100KB"/>

<!--日志文件名是否为静态-->

<staticLogFileName value="true"/>

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

<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>

</layout>

</appender>

最后从网上找了一段写日志的原则,感觉还是很好的:

【写日志的原则】

Ⅰ.在catch后,把异常写入日志.

Ⅱ.在调用第三方控件的开始和结束处.

Ⅲ.在连接数据库的开始结束处.

Ⅳ.除非必要,不要在循环体中加入日志,否则一旦出问题可能导致日志暴增.

Ⅴ.在自己认为很重要的逻辑处写入日志.

 

如果要将log方法写在类库里面,那么可以参考这篇文章http://hi.baidu.com/sjbh/blog/item/10cda8d689fb0c3807088b87.html

 

 

时间: 2024-12-23 04:07:35

【转】使用Log4Net进行日志记录的相关文章

我心中的核心组件(可插拔的AOP)~第三回 日志记录组件之log4net

在项目中有统一的日志是很必要的,之前自己写过vlog项目,这个项目与现在比较流行的log4net很像,用起来也很方便,今天主要说一下log4net这个日志工具,这使用vs2012测试的,使用nuget把log4net组件添加到项目中,如图: 然后在项目里为log4net建立一个配置文件,可以命名为log4net.config,一般代码如下: <log4net> <logger name="loginfo"> <level value="INFO&

Log4Net日志记录的两种方式

log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. log4net是Apache软件基金会Apache Logging Services工程的一部分.Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务.(f:百度百科) 原理 Log4net是基于.NET开发的一款记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR.

Redis——Redis与Log4Net完成了分布式日志记录

一,思路            为了单独记录我们程序中各种异常,我们这样做:创建一个队列,当出现异常的时候,将异常放入到队列中,另外,我们在程序启动时,开启一个线程,用来从存放异常的队列中取得异常信息,进行写入文件.         模拟代码:                 自定义异常出现时候的处理类:                        public class MyExceptionAttribute:System.Web.Mvc.HandleErrorAttribute { /

MVC使用Log4Net进行错误日志记录学习笔记4_实用技巧

在Web应用运行过程中,我们难免会遇到程序运行异常,这个时候我们就应该将异常信息记录下来,以便开发人员和维护人员对异常原因进行还原,对异常原因进行修复.在ASP.NET平台中进行日志记录的组件也有很多,如Log4Net.CommonLogging等,我们这里选用Log4Net进行异常日志的记录. 1. 捕获异常 在ASP.NET MVC中提供了一个全局的异常处理过滤器:HandleErrorAttribute,可以通过该过滤器捕获异常信息. 我们在Models文件夹下新建类型Log4Except

使用log4net无法将日志记录插入mysql数据库解决办法

写在前面 今天没事研究了下,将日志文件写入mysql数据库,因为新公司用的数据库也是mysql,项目中需要将日志信息写入数据库,没办法,就研究了下.在使用过程中遇到一个很蛋疼的问题.最后解决了,郁闷了半天.这里做一下记录,以免再犯. 之前写个这方面的文章,关于配置信息,可参考我的这篇文章:Log4Net日志记录两种方式 解决办法 问题就出在我直接将log4net写入数据库的配置文件log4net.config直接复制过来在项目中使用了,当然是修改了连接字符串,提供程序等与mysql相关的配置.配

Log4Net日志记录两种方式

本文转载:http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介      log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Apache软件基金会Apache Logging Services工程的一部分.Apache日志服务工程致力于为程序调试和审计提供跨语言的日志服务.(f:百度百科) 原理  

Log4net日志记录组件的使用步骤详解和下载_实用技巧

第一步: 添加并应用Log4net.dll.然后在Web.config文件中添加下面的配置局 复制代码 代码如下: <configSections>     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> 第二步: 新建Log4Net.config的配置文件,

以HTML为表现的日志记录组件

关于日志记录,如果你不想随用随写,又不想用log4net的话,也许你可以了解一下这个! 我也是个很懒的人,程序上的东西,只要别人写好了,而且自己用着爽,绝不做重复的coding.这个组件的起源是因为感觉log4net太强大太复杂(对我来说真是这样),当我想用log4net的时候,看到配置我都吓尿n次了,而这个时候心中又突发奇想,用HTML来做日志的表现!理由有二,一是HTML和CSS大家都会,二是可以实现很好的可读可视性. 一.配置文件说明 <?xml version="1.0"

.net jMail邮件发送(含抄送、密送、多发、日志记录)实例代码_实用技巧

jmail是一个第三方邮件操作组件,通常位于web服务器端,实现收邮件及发邮件功能(客户端用Foxmail这类就很好了).可以利用它轻松实现发邮件.抄送.密送.多发.日志记录及收邮件功能.本章要讲的,就是:发邮件.抄送.密送.多发.日志记录. 一.组件准备下载JMail44_pro并安装(记下安装路径) 找到安装路径,将其中的jmail.dll复制到项目中 二.核心发送代码新建MailAPI.cs,并输入以下代码 复制代码 代码如下: using System;using System.Coll