不过,我在我这个项目中,具体使用的方法有点不同。
这个学生处学生信息管理系统,业务日志比较简单,其实并不需要使用log4net。所以在这个项目中,只用log4net来记录错误日志。
1.建立配置文件。以下配置,是把信息记录到数据库和一个以当前日期为名字的日志txt文件。从数据库的insert语句就可以看出数据库的
Code
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="server=codebase;database=StuDepartmentOA;uid=sadis;pwd=123;timeout=300;" />
<commandText value="INSERT INTO ErrLog ([Time],[errLevel],[Info],[Exception]) VALUES (@time, @level, @info, @exception)" />
<parameter>
<parameterName value="@time" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@level" />
<dbType value="String" />
<size value="8" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@info" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="1000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%exception" />
</layout>
</parameter>
</appender>
<appender name="FileErrLogAppender" type="log4net.Appender.RollingFileAppender">
<!--日志文件的存储路径-->
<file value="bin\Log\"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd.LOG"/>
<!--根据日期,定义文件名-->
<staticLogFileName value="false"/>
<!--日志文件输出格式-->
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]"/>
<param name="Footer" value="[Footer]"/>
<ConversionPattern value="%nTime: %d %n Level: %level Info: %message %nException: %exception"/>
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
</root>
<!-- Specify the level for some specific categories -->
<logger name="logger">
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<appender-ref ref="FileErrLogAppender"/>
<appender-ref ref="ADONetAppender" />
</logger>
</log4net>
</configuration>
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="server=codebase;database=StuDepartmentOA;uid=sadis;pwd=123;timeout=300;" />
<commandText value="INSERT INTO ErrLog ([Time],[errLevel],[Info],[Exception]) VALUES (@time, @level, @info, @exception)" />
<parameter>
<parameterName value="@time" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@level" />
<dbType value="String" />
<size value="8" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@info" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="1000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%exception" />
</layout>
</parameter>
</appender>
<appender name="FileErrLogAppender" type="log4net.Appender.RollingFileAppender">
<!--日志文件的存储路径-->
<file value="bin\Log\"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd.LOG"/>
<!--根据日期,定义文件名-->
<staticLogFileName value="false"/>
<!--日志文件输出格式-->
<layout type="log4net.Layout.PatternLayout">
<param name="Header" value="[Header]"/>
<param name="Footer" value="[Footer]"/>
<ConversionPattern value="%nTime: %d %n Level: %level Info: %message %nException: %exception"/>
</layout>
</appender>
<!-- Setup the root category, add the appenders and set the default level -->
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
</root>
<!-- Specify the level for some specific categories -->
<logger name="logger">
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<appender-ref ref="FileErrLogAppender"/>
<appender-ref ref="ADONetAppender" />
</logger>
</log4net>
</configuration>
对应的数据库表:
Code
USE [StuDepartmentOA]
GO
/****** 对象: Table [dbo].[ErrLog] 脚本日期: 08/16/2009 10:09:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ErrLog](
[ID] [int] IDENTITY(1,1) NOT NULL,
[time] [datetime] NOT NULL,
[errLevel] [varchar](8) COLLATE Chinese_PRC_CI_AS NOT NULL,
[info] [nvarchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL,
[exception] [varchar](1000) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_errLog] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
USE [StuDepartmentOA]
GO
/****** 对象: Table [dbo].[ErrLog] 脚本日期: 08/16/2009 10:09:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ErrLog](
[ID] [int] IDENTITY(1,1) NOT NULL,
[time] [datetime] NOT NULL,
[errLevel] [varchar](8) COLLATE Chinese_PRC_CI_AS NOT NULL,
[info] [nvarchar](200) COLLATE Chinese_PRC_CI_AS NOT NULL,
[exception] [varchar](1000) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_errLog] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
2.把配置文件放到Web目录下,跟web.config同一层。
3.建立globe.asax文件,在Application_Start中加入
log4net.Config.XmlConfigurator.ConfigureAndWatch(new System.IO.FileInfo(Server.MapPath("~") + @"\log4net.config"));
4.再加入相应的引用。然后如果项目中有其他类库,那么再在对应用到的类库中加入引用。
(!!这里需要注意的是,如果用了NHibernate,就需要注意了,必须加入对应版本的log4net,不然会出错。我本来加了一个1.2.9的log4net,但NHibernate默认用附带的1.2.10,运行时就报错了)
5.实际使用:
Code
using System;
using log4net;
namespace DAL
{
/// <summary>
/// LogHelper 的摘要说明
/// </summary>
public class LogHelper
{
private static ILog Logger = log4net.LogManager.GetLogger("logger");
public static void Debug(string message, Exception ex)
{
if(Logger.IsDebugEnabled)
{
Logger.Debug(message, ex);
}
}
public static void Debug(string message)
{
if (Logger.IsDebugEnabled)
{
Logger.Debug(message);
}
}
public static void Info(string message, Exception ex)
{
if(Logger.IsInfoEnabled)
{
Logger.Info(message, ex);
}
}
public static void Info(string message)
{
if (Logger.IsInfoEnabled)
{
Logger.Info(message);
}
}
public static void Error(string message, Exception ex)
{
if (Logger.IsErrorEnabled)
{
Logger.Error(message,ex);
}
}
public static void Error(string message)
{
if (Logger.IsErrorEnabled)
{
Logger.Error(message);
}
}
}
}
using System;
using log4net;
namespace DAL
{
/// <summary>
/// LogHelper 的摘要说明
/// </summary>
public class LogHelper
{
private static ILog Logger = log4net.LogManager.GetLogger("logger");
public static void Debug(string message, Exception ex)
{
if(Logger.IsDebugEnabled)
{
Logger.Debug(message, ex);
}
}
public static void Debug(string message)
{
if (Logger.IsDebugEnabled)
{
Logger.Debug(message);
}
}
public static void Info(string message, Exception ex)
{
if(Logger.IsInfoEnabled)
{
Logger.Info(message, ex);
}
}
public static void Info(string message)
{
if (Logger.IsInfoEnabled)
{
Logger.Info(message);
}
}
public static void Error(string message, Exception ex)
{
if (Logger.IsErrorEnabled)
{
Logger.Error(message,ex);
}
}
public static void Error(string message)
{
if (Logger.IsErrorEnabled)
{
Logger.Error(message);
}
}
}
}