65.9K
CodeProject 正在变化。 阅读更多。
Home

log4Net 和 SQLite

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.64/5 (6投票s)

2012年6月14日

Apache

3分钟阅读

viewsIcon

52186

downloadIcon

16276

本文介绍了如何使用 log4Net 和 SQLite。

引言

log4Net 是一个 Apache 库,用于为 .NET 应用程序生成日志。 日志应该是错误、警告、用户信息、调试信息等。 本文是一个快速指南,介绍如何配置 log4net 以将日志消息存储在 SQLite 数据库文件中。

先决条件

1. 从 https://logging.apache.ac.cn/log4net/download_log4net.cgi 下载 Log4net
2. 从 http://system.data.sqlite.org/downloads/1.0.81.0/sqlite-netFx40-setup-bundle-x86-2010-1.0.81.0.exe 下载 SQLite para .NET Framwork 4.0

内容 / 主体

步骤 1:创建 SQLite 数据库

首先,您需要使用 Visual Studio 设计时或使用另一个 SQLite 管理器(例如:Firefox 插件)创建 SQLite 数据库文件,然后您需要使用以下脚本创建 log4net 表,可以使用此链接下载数据库文件:log4net 数据库文件数据库文件必须复制到项目文件夹,文章中的示例使用 App_Data 文件夹如果 App_Data 文件夹不存在,请添加它(右键单击项目/添加/添加 ASP.NET 文件夹/App_Data)。项目结构应如下图所示。

 

创建 log4net 表的脚本如下:

CREATE TABLE [log4net] ( 
    [appdomain] varchar, [aspnetcache] varchar, [aspnetcontext] varchar,
    [aspnetrequest] varchar, [aspnetsession] varchar, [date] datetime,
    [exception] varchar, [file] varchar, [identity] varchar, 
    [location] varchar, [level] varchar, [line] integer, 
    [logger] varchar, [message] varchar, [method] varchar, 
    [ndc] varchar, [property] varchar, [stacktrace] varchar, 
    [stacktracedetail] varchar, [timestamp] bigint,  [thread] varchar,
    [type] varchar,  [username] varchar, [utcdate] datetime, 
    [appfree1] varchar, [appfree2] varchar,  [appfree3] varchar);

步骤 2:配置 web.config / App.config

要配置 web.config 或 app.config,您将包含以下 XML 部分
configSections:添加一个新的 section config

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

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

log4net: 在 configSections 之后包含 log4net 部分

<log4net debug="true">
    <appender name="sqlite" type="log4net.Appender.AdoNetAppender">
      <bufferSize value="1" />
      <connectionType value="System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.81.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
      <connectionString value="data source=|DataDirectory|\log4net.db;Synchronous=Off " />
      <commandText value="INSERT INTO log4net(appdomain, aspnetcache, aspnetcontext, 
        aspnetrequest, aspnetsession, [date], exception, file, identity, location, level, 
        line, logger, message, method, ndc, property, stacktrace, stacktracedetail, 
        [timestamp], thread, type, username, utcdate) VALUES (@appdomain, @aspnetcache, 
        @aspnetcontext, @aspnetrequest, @aspnetsession, @date, @exception, @file, @identity, 
        @location, @level, @line, @logger, @message, @method, @ndc, @property, @stacktrace, 
        @stacktracedetail, @timestamp, @thread, @type, @username, @utcdate)" />
      <parameter>
        <parameterName value="@appdomain" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%appdomain" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@aspnetcache" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%aspnet-cache" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@aspnetcontext" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%aspnet-context" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@aspnetrequest" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%aspnet-request" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@aspnetsession" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%aspnet-session{Usuario}" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
      </parameter>
      <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%exception" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@file" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%file" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@identity" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%identity" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@location" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%location" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@level" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@line" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%line" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@method" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%method" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@ndc" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%ndc" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@property" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%property" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@stacktrace" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%stacktrace" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@stacktracedetail" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%stacktracedetail" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@timestamp" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%timestamp" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@type" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%type" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@username" />
        <dbType value="String" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%username" />
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@utcdate" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%utcdate{yyyy-MM-dd HH:mm:ss}" />
        </layout>
      </parameter>     
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="sqlite" />
    </root>
  </log4net>

* connectionString 中的参数 Synchronous=Off 可以提高 SQLite 插入操作的性能。

* 如果您没有使用 App_Data,则需要在 connectionString 属性中包含绝对路径(c:\myproject ....)

步骤 3:使用库

要在项目中的每个窗体、webform 或类中使用该库,请在位于 Properties 文件夹中的 AssemblyInfo.cs 中添加以下代码行:

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

(如果  AssemblyInfo.cs 文件不存在,请右键单击项目/属性/在“应用程序”选项卡中,单击“程序集信息”/填写信息并单击“确定”

在项目中的每个窗体、webform 或类中,您可以生成日志,如下面的代码所示

...
using log4net;

namespace log4NetExample
{
    public partial class log4netPage : System.Web.UI.Page
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(log4netPage).FullName);
        protected void Page_Load(object sender, EventArgs e)
        {            
            Session["Usuario"] = "log4Net";
            log.Debug("Debug Message");
            log.Info("Debug Message");
            log.Warn("Debug Message");
            log.Fatal("Fatal error", new Exception("Fatal error generated"));
            log.Error("Error message", new Exception("Error message generated"));
            Response.Write("<H1>Log Generated Successfully...</H1>");
        }
    }
}

日志消息将存储在 conection 字符串中指定的 SQLite 数据库中,您可以使用 Visual Studio 中的服务器资源管理器或另一个 SQLite 管理器来检查它。


附录

Log4Net - 内部调试(跟踪调试)

如果您想跟踪 log4net 的内部日志,您需要进行以下配置

首先在 appSettings 部分中添加一个键,如下所示

<appSettings>
    <!-- Set true if you want to trace the internal log for log4Net, see the  system.diagnostics for more details-->
    <add key="log4net.Internal.Debug" value="false"/>
  </appSettings>

之后,在 system.diagnostics 中添加内部跟踪部分,如下所示

<system.diagnostics>
    <trace autoflush="true">
      <listeners>
        <add
            name="textWriterTraceListener"
            type="System.Diagnostics.TextWriterTraceListener"
            initializeData="C:\temp\log4net.txt" />
      </listeners>
    </trace>
  </system.diagnostics>

在 initializeData 中指定的文件中,将存储 log4net 的内部日志,这对于跟踪 log4net 中的内部错误非常有用(因此请记住 log4net 库以静默模式工作)。

Log4net 日志级别

Log4Net 支持多个日志级别,主要级别有:ALL、DEBUG、INFO、WARN、ERROR、FATAL

每条消息都应以每个日志级别发送,这取决于您用于注册日志的方法,例如:

 log.Debug("Debug Message"); //It writes the mesage in DEBUG level
 log.Info("Info Message"); //Write the mesage in INFO level
 log.Warn("Warning Message"); //Write the mesage in WARN level
 log.Fatal("Fatal error", new Exception("Fatal error generated")); //Write the mesage in ERROR level
 log.Error("Error message", new Exception("Error message generated")); //Write the mesage in FATAL level 


您可以使用 web.config 或 app.config 定义应用程序中的日志级别,请找到 section log4net 并在 subsection <root> 中您可以更改 level 值。

<root>
      <level value="ALL" />
      <appender-ref ref="sqlite" />
</root>

在此配置中,所有消息都将被写入日志或数据库文件,因此建议在生产环境中使用“WARN”级别,在开发环境中使用 ALL 或 DEBUG 级别。

下图显示了不同的 log4net 日志级别之间的关系


参考文献

1. SQLite:  官方页面: http://www.sqlite.org/, .Net 驱动官方页面: http://system.data.sqlite.org/ 

2. Log4Net:官方页面:https://logging.apache.ac.cn/log4net/, PatterLayout(允许的参数)https://logging.apache.ac.cn/log4net/release/sdk/log4net.Layout.PatternLayout.html

3. SQLite 性能提示:http://stackoverflow.com/questions/1711631/how-do-i-improve-the-performance-of-sqlite

历史 

  • 2012 年 6 月 14 日:Elvin Deras:文章创建。
  • 2012 年 6 月 14 日:Elvin Deras:添加了源代码示例和附录
© . All rights reserved.