我是一个三层架构的应用程序,将日志记录放在了业务层,并写入了数据库,整个使用操作步骤为以下步骤。
第一步 编写配置文件
文件名称为 log4net.config 内容如下
<?xml version="1.0" encoding="utf-8"?>
<log4net>
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="server=fogwang;database=zzrd;uid=sa;pwd=sa;pooling=false;" />
<commandText value="INSERT INTO LogInfo ([dtDate],[sThread],[sLevel],[sLogger], [ClientIP], [PageUrl],[sMessage],[sException],OpreateType,UserAccount,UIOrSysAdmin,LogType) VALUES (@log_date, @thread, @log_level, @logger, @ClientIP, @PageUrl,@message, @exception,@OpreateType,@UserAccount,@UIOrSysAdmin,@LogType)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@ClientIP" />
<dbType value="String" />
<size value="50"></size>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%properties{ClientIP}" />
</layout>
</parameter>
<parameter>
<parameterName value="@PageUrl" />
<dbType value="String" />
<size value="200"></size>
<layout type="log4net.Ext.Web.ReflectionLayout">
<conversionPattern value="%properties{RequestUrl}" />
</layout>
</parameter>
<parameter>
<parameterName value="@OpreateType" />
<dbType value="String" />
<size value="50"></size>
<layout type="log4net.Ext.Web.ReflectionLayout">
<conversionPattern value="%properties{OpreateType}" />
</layout>
</parameter>
<parameter>
<parameterName value="@UserAccount" />
<dbType value="String" />
<size value="50"></size>
<layout type="log4net.Ext.Web.ReflectionLayout">
<conversionPattern value="%properties{UserAccount}" />
</layout>
</parameter>
<parameter>
<parameterName value="@UIOrSysAdmin" />
<dbType value="String" />
<size value="10"></size>
<layout type="log4net.Ext.Web.ReflectionLayout">
<conversionPattern value="%properties{UIOrSysAdmin}" />
</layout>
</parameter>
<parameter>
<parameterName value="@LogType" />
<dbType value="String" />
<size value="50"></size>
<layout type="log4net.Ext.Web.ReflectionLayout">
<conversionPattern value="%properties{LogType}" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="3500" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="3500" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<!-- setup the root category, add the appenders and set the default level -->
<root>
<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>
<appender-ref ref="ADONetAppender" />
</root>
<logger name="StellaLogger">
<level value="ALL"/>
<appender-ref ref="AdoNetAppender" />
</logger>
</log4net>
附:配置文件解释:
log4net.Layout.PatternLayout中的转换模式(ConversionPattern)
%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
%n(new line):换行
%d(datetime):输出当前语句运行的时刻
%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class):当前日志对象的名称,例如:
模式字符串为:%-10c -%m%n
代码为:
ILog log=LogManager.GetLogger(“Exam.Log”);
log.Debug(“Hello”);
则输出为下面的形式:
Exam.Log - Hello
%L:输出语句所在的行号
%F:输出语句所在的文件名
%-数字:表示该项的最小长度,如果不够,则用空格填充
例如,转换模式为%r [%t]%-5p %c - %m%n 的 PatternLayout 将生成类似于以下内容的输出:
176 [main] INFO org.foo.Bar - Located nearest gas station.
第二步骤在业务层的属性文件关联配置文件:
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net/log4net.config", Watch = true)]
其中ConfigFile的属性为放在显示层中配置文件的位置
第三步在业务层中的使用:
#region 删除记录
/// <summary>
/// 删除记录
/// </summary>
/// <param name="id">ID(可多个)</param>
/// <returns></returns>
public bool Delete ( string id )
{
DataTable dt= dal.getNewsList("id,title,typename"," in in("+id+")");
log4net.Ext.Web.IWebLog log = log4net.Ext.Web.WebLogManager.GetLogger(typeof(NewsBLL));
log.Info("删除新闻标题:" + dt.Rows[0]["title"] + "新闻编号:" + dt.Rows[0]["id"] + "类别:" + dt.Rows[0]["typename"], WebUtility.Comm.GetAdminOrUIUserCook()[0], WebUtility.Comm.GetIP(), WebUtility.Comm.GetUrl(), log4net.Ext.Web.WebLogImpl.OpreateType.删除, log4net.Ext.Web.WebLogImpl.UIOrSys.后台, log4net.Ext.Web.WebLogImpl.LogType.信息操作日志);
return dal.Delete ( id );
}
#endregion
第四步:读取操作日志:
数据层代码:
public class LogOpreateDAL
{
public int Delete(string id)
{
return SqlHelper.ExecuteNonQuery(DBConn.GetSqlConn(), CommandType.Text, "Delete LogInfo Where LogID In(" + id + ")");
}
public DataSet GetListByPage(string expcon, int pagesize, int CurrentPage, out int PageCount, out int RecordCount)
{
PagerDAL dal = new PagerDAL();
return dal.GetPagerList(DBConn.GetSqlConn(), "LogInfo", "LogId", 1, "*", pagesize, CurrentPage, expcon, out PageCount, out RecordCount);
}
}
显示效果如下: