log4Net 和 SQLite






3.64/5 (6投票s)
本文介绍了如何使用 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:添加了源代码示例和附录