感谢支持
我们一直在努力

Log4Net使用详解

log4net解决的问题是提供一个记录日志的框架,它提供了向多种目标写入的实现,比如利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库(包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite)中,一般来说我们只需要提供一个描述性的字符串,然后log4net就会自动提供有关运行时的一些信息。

vinform程序配置log4net日志输出 http://www.linuxidc.com/Linux/2012-12/76208.htm

关于在Web中支持的问题

在我们开发项目时都会使用到config文件,可以在config文件中配置log4net。这一点Web项目和WinForm项目都是一样的。需要注意的是,因为在Web项目中一般以较低权限的角色来运行Web项目的,所以在使用文件型日志时要注意不要放在本项目根文件夹之外。

在config文件中的配置

要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

<configSections>
  <sectionname=”log4net”type=”System.Configuration.IgnoreSectionHandler”/>
</configSections>

除此之外,还要在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)。

具体说来有如下Appender:

AdoNetAppender:利用ADO.NET记录到数据库的日志。

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

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

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

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

EventLogAppender:将日志写到Windows Event Log.

FileAppender:将日志写到文件中。

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

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

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

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

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

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

SmtpAppender:将日志写到邮件中。

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

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

关于使用log4net中可能会使用到的一些参数

%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个字符则以空格填充。

下面以一个实际的例子来说明问题,比如在配置中有“%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] – %message%newline”,那么实际的日志中会是如下格式:

“记录时间:2010-11-17 16:16:36,561 线程ID:[9] 日志级别:文件:所在行ERROR 出错类:Log4NetDemo.Program property:[(null)] – 错误描述:error

System.Exception: 在这里发生了一个异常,Error Number:2036084948”

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-05/102029p2.htm

关于对数据库的支持

前面已经说过,log4net是支持包括MS SQL Server, Access, Oracle9i,Oracle8i,DB2,SQLite在内的数据库的,如果是文件型数据库(如Access或SQLite)的话就需要指定数据库文件的位置(在Web中最好指定在有读写权限的文件夹下,并且实现创建好表),如果是网络数据库就需要指定正确的数据库连接字符串。

比如要记录到Oracle数据库中,在配置文件中可以增加一个< appender>节点,配置如下:

<appender name=”AdoNetAppender_Oracle” type=”log4net.Appender.AdoNetAppender”>
      <connectionType value=”System.Data.OracleClient.OracleConnection, System.Data.OracleClient” />
      <connectionString value=”data source=[mydatabase];User ID=[user];Password=[password]” />
      <commandText value=”INSERT INTO Log (Datetime,Thread,Log_Level,Logger,Message) VALUES (:log_date, :thread, :log_level, :logger, :message)” />
      <bufferSize value=”128″ />
      <parameter>
        <parameterName value=”:log_date” />
        <dbType value=”DateTime” />
        <layout type=”log4net.Layout.RawTimeStampLayout” />
      </parameter>
      <parameter>
        <parameterName value=”:thread” />
        <dbType value=”String” />
        <size value=”255″ />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%thread” />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=”:log_level” />
        <dbType value=”String” />
        <size value=”50″ />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%level” />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=”:logger” />
        <dbType value=”String” />
        <size value=”255″ />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%logger” />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=”:message” />
        <dbType value=”String” />
        <size value=”4000″ />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%message” />
        </layout>
      </parameter>
    </appender>

当然从上面的配置中的SQL语句中可以看得出这个表的参数,日志表的创建语句如下:

createtable log (
Datetime timestamp(3),
Thread varchar2(255),
Log_Level varchar2(255),
Logger varchar2(255),
Message varchar2(4000)
);

在本例中周公采用了将日志记录到SQLite这个单机数据库的方式,并且还将记录记录日志时的文件名和行号,创建SQLite的SQL

    CREATE TABLE Log ( 
        LogId        INTEGER PRIMARY KEY, 
        Date        DATETIME NOT NULL, 
        Level        VARCHAR(50) NOT NULL, 
        Logger        VARCHAR(255) NOT NULL, 
        Source        VARCHAR(255) NOT NULL, 
        Message        TEXT DEFAULT NULL
        );

增加的< appender>节点配置如下:

    <appender name=”AdoNetAppender_SQLite” type=”log4net.Appender.AdoNetAppender”>
      <bufferSize value=”100″ />
      <connectionType value=”System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.66.0, Culture=neutral” />
      <!–SQLite连接字符串–>
      <connectionString value=”Data Source=c:\\log4net.db;Version=3;” />
      <commandText value=”INSERT INTO Log (Date, Level, Logger,Source, Message) VALUES (@Date, @Level, @Logger, @Source, @Message)” />
      <parameter>
        <parameterName value=”@Date” />
        <dbType value=”DateTime” />
        <layout type=”log4net.Layout.RawTimeStampLayout” />
      </parameter>
      <parameter>
        <parameterName value=”@Level” />
        <dbType value=”String” />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%level” />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=”@Logger” />
        <dbType value=”String” />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%logger” />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=”@Source” />
        <dbType value=”String” />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%file:%line” />
        </layout>
      </parameter>
      <parameter>
        <parameterName value=”@Message” />
        <dbType value=”String” />
        <layout type=”log4net.Layout.PatternLayout”>
          <conversionPattern value=”%message” />
        </layout>
      </parameter>
    </appender>

从上面的配置中可以看出插入数据的SQL语句及参数信息,下面的<parameter>节点就是指定插入的数据,比如我们指定SQL语句中的”@Source”参数来源于log4net中的”%file:%line”参数,也就是这两个参数用“:”用连接起来。

控制日志文件大小的问题

对于一个长时间使用并且有大量业务日志的系统来说,如果使用FileAppender将日志一直记录到一个文件中会引起性能低下的问题,我曾见过有个系统的日志文件达到了800多M,最后系统无法及时响应了,在这种情况下可考虑使用RollingFileAppender循环记录日志,一种是指定文件的最大长度,如果超过了就重新生成一个文件,如下面的配置:

    <appender name=”RollingFileAppender” type=”log4net.Appender.RollingFileAppender”>
      <file value=”RollingFileAppender_log.txt” />
      <appendToFile value=”true” />
      <rollingStyle value=”Size” />
      <maxSizeRollBackups value=”10″ />
      <maximumFileSize value=”100KB” />
      <staticLogFileName value=”true” />
      <layout type=”log4net.Layout.PatternLayout”>
        <conversionPattern value=”%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] – %message%newline” />
      </layout>
    </appender>

在上面的配置中,每个日志文件最大100KB,最大日志文件个数是10生成的日志文件名会是RollingFileAppender_log.txt.1, RollingFileAppender_log.txt.2 … RollingFileAppender_log.txt.10,如果记录的日志超过10个,会从RollingFileAppender_log.txt.1开始覆盖。
 
还有一种方式就是按照日期记录日志,它的配置如下:

    <appender name=”RollingLogFileAppender_DateFormat” type=”log4net.Appender.RollingFileAppender”>
      <file value=”RollingLogFileAppender_DateFormat_log.txt” />
      <appendToFile value=”true” />
      <rollingStyle value=”Date” />
      <!–<datePattern value=”yyyyMMdd-HHmm” />–>
      <datePattern value=”yyyyMMdd” />
      <layout type=”log4net.Layout.PatternLayout”>
        <conversionPattern value=”%date [%thread](%file:%line) %-5level %logger [%property{NDC}] – %message%newline” />
      </layout>
    </appender>

这样一来,每天的日志都写入到一个文件中,当天的日志文件名为“RollingLogFileAppender_DateFormat_log.txt”,非当天的日志都会带上当天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日志,这样就可以很方便地区分每天的日志了,将来查找起来也相当方便。

这样一来,每天的日志都写入到一个文件中,当天的日志文件名为“RollingLogFileAppender_DateFormat_log.txt”,非当天的日志都会带上当天的日期,如“RollingLogFileAppender_DateFormat_log.txt20101117”表示2010年11月17日的日志,这样就可以很方便地区分每天的日志了,将来查找起来也相当方便。

    <root>
      <!–文件形式记录日志–>
      <appender-ref ref=”LogFileAppender” />
      <!–控制台控制显示日志–>
      <appender-ref ref=”ConsoleAppender” />
      <!–Windows事件日志–>
      <!–<appender-ref ref=”EventLogAppender” />–>
      <!–SQLite事件日志–>
      <appender-ref ref=”AdoNetAppender_SQLite” />
      <!–RollingFileAppender事件日志–>
      <appender-ref ref=”RollingFileAppender” />
      <!–RollingFileAppender事件日志,每天一个日志–>
      <appender-ref ref=”RollingLogFileAppender_DateFormat” />
      <!– 如果不启用相应的日志记录,可以通过这种方式注释掉 
      <appender-ref ref=”AdoNetAppender_Access” />
      –>
    </root>

在上面的例子中可以看出,如果想增加日志输出目的地,增加<appender-ref>节点就是了,注意后面的ref是在config中配置的appender name,如果想要取消,删除或者注释掉这行就可以了。

Log4Net的使用

首先要添加config文件,在类库项目、命令行程序及WinForm中添加的是app.config,在WebForm中添加的是web.config。

下面是一个在WinForm项目中的使用Log4Net的例子:

    using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using log4net; 
    using System.Reflection; 
   
    //注意下面的语句一定要加上,指定log4net使用.config文件来读取配置信息 
    //如果是WinForm(假定程序为MyDemo.exe,则需要一个MyDemo.exe.config文件) 
    //如果是WebForm,则从web.config中读取相关信息 
    [assembly: log4net.Config.XmlConfigurator(Watch = true)] 
    namespace Log4NetDemo 
    { 
        class Program 
        { 
            static void Main(string[] args) 
            { 
                Random random = new Random(); 
                for (int i = 0; i < 1; i++) 
                { 
                    //创建日志记录组件实例 
                    //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
   
                    ILog log=log4net.LogManager.GetLogger(typeof(Program)); 
                    //记录错误日志 
                    //log.Error(“error”, new Exception(“在这里发生了一个异常,Error Number:”+random.Next())); 
                    //记录严重错误 
                    //log.Fatal(“fatal”, new Exception(“在发生了一个致命错误,Exception Id:”+random.Next())); 
                    //记录一般信息 
                    //log.Info(“提示:系统正在运行”); 
                    //记录调试信息 
                    //log.Debug(“调试信息:debug”); 
                    //记录警告信息 
                    //log.Warn(“警告:warn”); 
                } 
                Console.WriteLine(“日志记录完毕。”); 
                Console.Read(); 
   
            } 
        } 
    }

在WebForm中也可以使用Log4net,下面是一个在ASP.NET中使用Log4Net的例子:

    using System; 
    using System.Collections.Generic; 
    using System.Web; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using log4net; 
    using System.Reflection; 
   
    [assembly: log4net.Config.XmlConfigurator(Watch = true)] 
    public partial class _Default : System.Web.UI.Page 
    { 
        protected void Page_Load(object sender, EventArgs e) 
        { 
            if (!Page.IsPostBack) 
            { 
                Random random = new Random(); 
                for (int i = 0; i < 1; i++) 
                { 
                    //创建日志记录组件实例 
                    ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
   
                    //ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
                    //记录错误日志 
                    //log.Error(“error”, new Exception(“在这里发生了一个异常,Error Number:”+random.Next())); 
                    //记录严重错误 
                    //log.Fatal(“fatal”, new Exception(“在发生了一个致命错误,Exception Id:”+random.Next())); 
                    //记录一般信息 
                    //log.Info(“提示:系统正在运行”); 
                    //记录调试信息 
                    //log.Debug(“调试信息:debug”); 
                    //记录警告信息 
                    log.Warn(“警告:warn”); 
                    Response.Write(“日志记录完毕。”); 
                } 
            } 
        } 
    }

可以看出它们的代码基本没有区别。

下面是一个在WinForm下的config文件的完整配置,该配置文件所使用的代码就是在上面所使用到的代码,使用LogFileAppender、ConsoleAppender、EventLogAppender、AdoNetAppender_SQLite、RollingFileAppender、RollingLogFileAppender_DateFormat方式记录日志都在本地通过测试。

本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-05/102029.htm

赞(0) 打赏
转载请注明出处:服务器评测 » Log4Net使用详解
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏