利用Log4net记录系统日志信息(支持6种数据库)
Log4net的优点:
几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。
经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;一旦在程序中加入了Log输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。
代码下载(支持6种数据库)
效果预览:
下面举例说明利用Log4net控件 将日志信息保存到数据库
一:下载log4net.dll
将log4net.dll拷贝到bin下面,并添加对它的引用
二:在数据库里面创建表Log
create table LOG
(
LOGDATE VARCHAR2(20),
LOG_LEVEL VARCHAR2(255),
LOGGER VARCHAR2(255),
MESSAGE VARCHAR2(2000),
EXCEPTION VARCHAR2(2000)
)
三:配置Web.config
注意2个地方:
1:在configSections加入相关代码
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
2:log4net里面对数据库连接进行配置
<log4net debug="true">
<!--
定义loger的名称和使用的appender
CREATE TABLE `sys_log` (
`LogDate` datetime DEFAULT NULL,
`Level` varchar(255) DEFAULT NULL,
`Logger` varchar(255) DEFAULT NULL,
`Message` varchar(4000) DEFAULT NULL,
`Exception` varchar(2000) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
-->
<logger name="AA" >
<level value="ALL"/>
<appender-ref ref="ADONetAppender"/>
</logger>
<appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
<!--
定义几条存入数据库 有2条时才写入数据库,没有两条叫缓存
-->
<bufferSize value="100"/>
<param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/>
<connectionString value="server=server;database=postbankv6;uid=root;pwd=888888;charset=gb2312;"/>
<commandText value="INSERT INTO sys_log (LogDate,Level,Logger,Message,Exception) VALUES (@log_date, @log_level,@logger, @message, @exception)"/>
<parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
<parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<size value="255"/>
<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="%C[%M(%L)]"/>
</layout>
</parameter>
<parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter>
</appender>
</log4net>
四:程序调用
1:创建一个辅助类:SystemLog.cs
public class SystemLog
{
private SystemLog()
{
}
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("AA"); //选择<logger name="loginfo">的配置
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("AA"); //选择<logger name="logerror">的配置
public static void SetConfig()
{
log4net.Config.XmlConfigurator.Configure();
}
public static void SetConfig(FileInfo configFile)
{
log4net.Config.XmlConfigurator.Configure(configFile);
}
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
public static void WriteLog(string info, Exception se)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, se);
}
}
}
2: 创建Global.asax,里面设置相关代码
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
SystemLog.SetConfig();
}
3:在页面中调用:
strMsg += FormService.UserID + "修改了车辆信息:车辆ID为为:" + model.ID;
SystemLog.loginfo.Info(strMsg);
注意:
读取WebConfg问题,网上都建议在globe.ascx里面:
void Application_Start(object sender, EventArgs e)
{
//在应用程序启动时运行的代码
PDAManage.SystemLog.SetConfig();
}
但我发现当第二次访问该页面的时候,不能成功将日志保存到数据库,以下是我的解决方案:
1:所有页面继承basePage
2:在BasePage里面加上:
protected override void OnLoad(EventArgs e)
{
if (!base.IsPostBack)
{
SystemLog.SetConfig();
}
}
代码下载(支持6种数据库)
效果预览: