log4net日志组件使用过程中最重要的部分是配置文件,控制台程序只能有一个config文件我们不得不把大量的log4net配置信息写在App.config文件中,网站可以有多个config文件,根据无侵入式的开发思想我们可以把log4net的配置信息放到一个单独的文件中,这样便于我们维护和修改,这也是Console版和WebForm版的唯一区别。
配置文件:
创建一个log4net.config文件,文件中的配置信息如下(log4net.config文件的内容与Console版本中的App.config文件中的与log4net有关的配置信息部分一样):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!--添加log4net自定义节点-->
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<!--定义输出到文件中-->
<appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--定义文件存放位置-->
<appendToFile value="true" />
<rollingStyle value="Date" />
<!--【1】指定存储到某个具体文件中-->
<!--<file value="D:/log4netfile.txt" />
<datePattern value="yyyyMMdd-HH:mm:ss" />-->
<!--【2】指定存储到某个文件夹中,根据时间生成日志文件-->
<file value="log\\"/>
<datePattern value="yyyy\\yyyyMM\\yyyyMMdd\\yyyyMMdd-HH'.txt'"/>
<staticLogFileName value="false"/>
<param name="MaxSizeRollBackups" value="100"/>
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by 蝈蝈" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<!--%n是换行-->
<conversionPattern value="%n记录时间:%date %n线程ID:[%thread] %n日志级别:%-5level %n出错类:%logger property:[%property{NDC}] - %n错误描述:%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>
<!--SqlServer形式-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--记录n条日志到缓冲区,够n条写入SqlServer-->
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=Guo-pc;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=sasa" />
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<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>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
<root>
<!--控制要记载的日志级别-->
<level value="ERROR"/>
<level value="DEBUG"/>
<!--文件形式记录日志-->
<appender-ref ref="LogFileAppender" />
<!--控制台控制显示日志-->
<appender-ref ref="ConsoleAppender" />
<!--Windows事件日志-->
<appender-ref ref="EventLogAppender" />
<!-- 如果不启用相应的日志记录,可以通过这种方式注释掉
<appender-ref ref="AdoNetAppender_Access" />
-->
<!--SqlServer记录日志-->
<appender-ref ref="AdoNetAppender"/>
</root>
</log4net>
</configuration>
注意:
- <appender name=”LogFileAppender” type=”log4net.Appender.FileAppender”></appender>只能输出日志到某个具体文件中
- <appender name=”LogFileAppender” type=”log4net.Appender.RollingFileAppender”></appender>能输出日志到某个具体文件、输出日志到某个文件夹然后根据时间生成日志文件
- <bufferSize value=”6” />会先把日志爱缓存起来,够数后一起写入数据库
SqlServer数据库Log表生成脚本
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)
Log4netHelper.cs文件
新建Log4netHelper.cs文件
//与Console版本中不一样的地方是,此处指定了ConfigFile = "log4net.config"
//如果WebForm中不能正常写日志的话,那就对log4net.config进行一些设置
//具体步骤:右键log4net.config文件-属性-复制到输出目录:始终复制。目的是为了每次启动时能够找到这个config文件
[assembly: log4net.Config.XmlConfigurator(Watch = true, ConfigFile = "log4net.config")]
namespace Log4netTest
{
class Log4netHelper
{
public static void WriteLogger(Type type,LogLevel logLevel,string msg)
{
log4net.ILog log = log4net.LogManager.GetLogger(type);
switch (logLevel)
{
case LogLevel.Debug: log.Debug(msg); break;
case LogLevel.Error: log.Error(msg); break;
case LogLevel.Fatal: log.Fatal(msg); break;
case LogLevel.Info: log.Info(msg); break;
case LogLevel.Warn: log.Warn(msg); break;
default: break;
}
}
}
/// <summary>
/// 日志记录级别
/// </summary>
public enum LogLevel
{
Debug,
Info,
Warn,
Error,
Fatal
}
}
按钮方法写日志
namespace Log4netTest
{
public partial class Index : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnWriteLog_Click(object sender, EventArgs e)
{
//返回:命名空间+类名,此处为Log4netTest.Index,
//表示在哪个类中记录的日志,如果记录的错误日志表示在那个类中出错
Type type = MethodBase.GetCurrentMethod().DeclaringType;
Log4netHelper.WriteLogger(type, LogLevel.Debug, "测试记录Debug日志");
Log4netHelper.WriteLogger(type, LogLevel.Error, "测试记录Error日志");
}
}
}
上面我演示了将日志记录输出到文件、Sql Server数据库、控制台、Windows事件、Access数据库等五种情况。如果有更多的其它数据源的输出,可以参考官方网站:http://logging.apache.org/log4net/release/config-examples.html 。