Log4net保存自定義字段到數據庫,此處以oracle數據庫爲例sql
一、下載log4net,添加log4net引用。 數據庫
二、建立數據庫express
CREATE TABLE TASKDB.WORKFLOWLOGS
(
LOG_ID NUMBER NOT NULL,
LOG_USERID VARCHAR2(100 BYTE),
LOG_OPERATERTYPE VARCHAR2(100 BYTE),
LOG_MESSAGE VARCHAR2(4000 BYTE),
LOG_DATE DATE,
LOG_LEVEL VARCHAR2(255 BYTE),
LOG_IDENTITY VARCHAR2(255 BYTE),
LOG_EXCEPTION VARCHAR2(4000 BYTE),
LOG_LOGGER VARCHAR2(255 BYTE),
LOG_SOURCE VARCHAR2(1000 BYTE)
)oracle
三、添加自定義字段的實體類 app
namespace Log4NetToDatabase { /// <summary> /// 包含了全部的自定字段屬性 /// </summary> public class LogContent : IRequiresSessionState { public LogContent(string _UserId, string _OperaterType, string _Message) { UserId = _UserId; OperaterType = _OperaterType; Message = _Message; } public string UserId { get; set; } public string OperaterType { get; set; } public string Message { get; set; } } }
四、添加參數轉換器類,每一個字段一個轉化類ide
namespace Log4NetToDatabase { public class Log4NetConvert { internal sealed class UserIdPatternConverter : PatternLayoutConverter { override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) { LogContent content = loggingEvent.MessageObject as LogContent; if (content != null) { writer.Write(content.UserId); } } } internal sealed class OperaterTypePatternConverter : PatternLayoutConverter { override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) { LogContent content = loggingEvent.MessageObject as LogContent; if (content != null) { writer.Write(content.OperaterType); } } } internal sealed class MessagePatternConverter : PatternLayoutConverter { override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) { LogContent content = loggingEvent.MessageObject as LogContent; if (content != null) { writer.Write(content.Message); } } } } }
五、添加自定義layout類sqlserver
namespace Log4NetToDatabase { public class CustomLayout : PatternLayout { public CustomLayout() { //this.AddConverter("property", typeof(Log4NetConvert)); this.AddConverter("UserId", typeof(Log4NetConvert.UserIdPatternConverter)); this.AddConverter("OperaterType", typeof(Log4NetConvert.OperaterTypePatternConverter)); this.AddConverter("Message", typeof(Log4NetConvert.MessagePatternConverter)); } } }
6 、添加配置信息ui
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <!--日誌記錄器--> <logger name="OperationLog" additivity="false"> <level value="ALL"/> <!--設置使用的數據庫記錄器--> <appender-ref ref="AdoNetAppender_Operation"/> </logger> <!--數據庫記錄器--> <appender name="AdoNetAppender_Operation" type="log4net.Appender.AdoNetAppender"> <!--sqlserver日誌數據庫鏈接串--> <!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <connectionString value="Data Source=.\sqlexpress;initial catalog=kuiyu.net;User ID=sa;Password=1" providerName="System.Data.SqlClient"/>--> <!--oracle日誌數據庫鏈接串--> <connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/> <connectionString value="Data Source=//localhost:1521/orcl;User ID=xxxxdb;Password=xxxxdb;"/> <!--日誌數據庫腳本--> <commandText value="INSERT INTO WORKFLOWLOGS (LOG_ID,LOG_USERID,LOG_OPERATERTYPE, LOG_MESSAGE, LOG_DATE, LOG_LEVEL, LOG_IDENTITY, LOG_EXCEPTION, LOG_LOGGER, LOG_SOURCE) VALUES (WORKFLOWLOGS_SEQ.nextval, :UserId,:OperaterType, :Message,:log_date, :log_level, :log_identity,:log_exception, :logger, :source )" /> <bufferSize value="1"/> <!--自定義成員 --> <parameter> <parameterName value=":UserId" /> <dbType value="String" /> <size value="1000" /> <layout type="Log4NetToDatabase.CustomLayout"> <conversionPattern value="%UserId" /> </layout> </parameter> <parameter> <parameterName value=":OperaterType" /> <dbType value="String" /> <size value="1000" /> <layout type="Log4NetToDatabase.CustomLayout"> <conversionPattern value="%OperaterType" /> </layout> </parameter> <parameter> <parameterName value=":Message" /> <dbType value="String" /> <size value="4000" /> <layout type="Log4NetToDatabase.CustomLayout"> <conversionPattern value="%Message" /> </layout> </parameter> <parameter> <parameterName value=":log_date" /> <dbType value="DateTime" /> <layout type="log4net.Layout.RawTimeStampLayout"> </layout> </parameter> <parameter> <parameterName value=":log_level" /> <dbType value="String" /> <size value="10" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%level" /> </layout> </parameter> <parameter> <parameterName value=":log_identity" /> <dbType value="String" /> <size value="100" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%identity" /> </layout> </parameter> <parameter> <parameterName value=":log_exception" /> <dbType value="String" /> <size value="4000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%exception" /> </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=":source" /> <dbType value="String" /> <size value="1000" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%file:%line" /> </layout> </parameter> </appender> </log4net> </configuration>
七、調用寫入日誌this
ILog log = log4net.LogManager.GetLogger("OperationLog"); log.Info(new LogContent(dt_user.Rows[0]["userid"].ToString(), "登陸", "登錄系統"));
添加自定義字段的實體類spa
添加參數轉換器類
添加自定義layout類
添加配置信息
調用寫入日誌
若對您有用,請贊助個棒棒糖~