您的位置:首页 > 数据库

Log4Net 添加自定义字段并保存到数据库

2017-12-01 17:15 246 查看
Log4Net是常用的功能强大的日志插件,该插件提供了几个默认字段

大家可能都用过Log4Net插件来记录日志,该插件默认提供了这几个字段@log_date, @thread, @log_level, @logger, @message, @exception, 但有时这几个字段不能满足我们记录日志的需求,需要扩展我们所需的其他字段,并记录到数据库。比如,我需要记录UserID,UnitCode,MenuID,OperateType等。下面按步骤介绍一下如何在Log4Net组件下,自定义字段并保存到数据库:

第一步:在数据库日志表中添加自定义字段



第二步:创建Custom实体ActionLoggerInfo

public class ActionLoggerInfo
{
public int UserID { get; set; }
public string UnitCode { get; set; }
public int MenuID { get; set; }
public int OperaterType { get; set; }
public string sMessage { get; set; }
public ActionLoggerInfo(int userId, string unitCode, int menuId, int operaterType,string smessage)
{
this.UserID = userId;
this.UnitCode = unitCode;
this.MenuID = menuId;
this.OperaterType = operaterType;
this.sMessage = smessage;
}
}


第三步:创建Custom转换器ActionConverter

/*命名空间引用*/
using log4net;
using log4net.Layout;
using log4net.Layout.Pattern;
using log4net.Core;

/*代码*/
public class ActionConverter : PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
{
var actionInfo = loggingEvent.MessageObject as ActionLoggerInfo;

if (actionInfo == null)
{
writer.Write("");
}
else
{
switch (this.Option.ToLower())
{
case "userid":
writer.Write(actionInfo.UserID);
break;
case "unitcode":
writer.Write(actionInfo.UnitCode);
break;
case "menuid":
writer.Write(actionInfo.MenuID);
break;
case "operatertype":
writer.Write(actionInfo.OperaterType);
break;
case "smessage":
writer.Write(actionInfo.sMessage);
break;
default:
writer.Write("");
break;
}
}
}
}


第四步:创建ActionLayoutPattern

/*命名空间引用*/
using log4net;
using log4net.Layout;
using log4net.Layout.Pattern;
using log4net.Core;

/*代码*/
public class ActionLayoutPattern : PatternLayout
{
public ActionLayoutPattern()
{
this.AddConverter("actionInfo", typeof(ActionConverter));
}
}


第五步:配置log4net.config

<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="DATABASE=AT_GGJPlat3;SERVER=192.168.**.***;UID=**;PWD=***;Connect Timeout=15;" />
<commandText value="INSERT INTO *****Log([dtDate],[sThread],[sLevel],[sLogger],[sMessage],[sException],[UserID],[UnitCode],[MenuID],[OperaterType])
VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@userid,@unitcode,@menuid,@operatertype)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="100" />
<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="500" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="3000" />
<layout type="ProvincePlat.CommonClass.Logger.ActionLayoutPattern">
<conversionPattern value="%actionInfo{smessage}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
<parameter>
<parameterName value="@userid" />
<dbType value="Int32"/>
<layout type="ProvincePlat.CommonClass.Logger.ActionLayoutPattern">
<conversionPattern value="%actionInfo{userid}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@unitcode" />
<dbType value="String" />
<size value="10" />
<layout type="ProvincePlat.CommonClass.Logger.ActionLayoutPattern">
<conversionPattern value="%actionInfo{unitcode}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@menuid" />
<dbType value="Int32"/>
<layout type="ProvincePlat.CommonClass.Logger.ActionLayoutPattern">
<conversionPattern value="%actionInfo{menuid}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@operatertype" />
<dbType value="Int32"/>
<layout type="ProvincePlat.CommonClass.Logger.ActionLayoutPattern">
<conversionPattern value="%actionInfo{operatertype}"/>
</layout>
</parameter>
</appender>


第六步:创建Log日志帮助类,LogUtil

public class LogUtil
{
public LogUtil() { }
private static ActionLoggerInfo _message = null;
private static log4net.ILog _log;
public static log4net.ILog Log
{
get
{
if (_log == null)
{
_log = LogManager.GetLogger("OperateLogger");
}
return _log;
}
}
public static void Debug()
{
if (Log.IsDebugEnabled)
{
Log.Debug(_message);
}
}
public static void Error()
{
if (Log.IsErrorEnabled)
{
Log.Error(_message);
}
}
public static void Fatal()
{
if (Log.IsFatalEnabled)
{
Log.Fatal(_message);
}
}
public static void Info()
{
if (Log.IsInfoEnabled)
{
Log.Info(_message);
}
}
public static void Warn()
{
if (Log.IsWarnEnabled)
{
Log.Warn(_message);
}
}

public static void SaveMessage(int userId, string unitCode, int menuId, int operaterType,string smessage,int level)
{
_message = new ActionLoggerInfo(userId, unitCode, menuId, operaterType, smessage);
switch (level)
{
case 1: Info(); break;
case 2: Warn(); break;
case 3: Error(); break;
case 4: Fatal(); break;
default: break;
}
}
}


第七步:在具体页面上调用SaveMessage方法,写入日志
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: