利用Log4Net将日志插入至oracle数据库!

前端之家收集整理的这篇文章主要介绍了利用Log4Net将日志插入至oracle数据库!前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_502_3@ 分类:@H_502_3@

log4net可以轻易的将信息日志写入文本,但是无论记录在哪里终究还是为了后期发现问题,维护所用。所以为了查询方便,可以将其配置输出数据库(Oracle)。@H_502_3@

一、插入系统默认字段@H_502_3@

首先建库,sql如下:@H_502_3@

[sql] @H_502_3@ view plain @H_502_3@copy@H_502_3@
@H_502_3@print@H_502_3@ ?
  1. --Createtable@H_502_3@@H_502_3@@H_502_3@
  2. create@H_502_3@@H_502_3@table@H_502_3@SYSTEMLOG@H_502_3@@H_502_3@
  3. (@H_502_3@
  4. log_idNUMBERnot@H_502_3@@H_502_3@null@H_502_3@,@H_502_3@@H_502_3@
  5. log_dateDATE@H_502_3@,@H_502_3@@H_502_3@
  6. log_levelVARCHAR2(255),@H_502_3@
  7. log_identityVARCHAR2(255),@H_502_3@
  8. log_messageVARCHAR2(4000),255); color:inherit; line-height:20px; font-size:18px; list-style-position:outside!important"> log_exceptionVARCHAR2(4000),92); line-height:20px; font-size:18px; list-style-position:outside!important"> log_loggerVARCHAR2(255),255); color:inherit; line-height:20px; font-size:18px; list-style-position:outside!important"> log_sourceVARCHAR2(1000),)--Createsequence@H_502_3@@H_502_3@@H_502_3@
  9. sequence@H_502_3@SYSTEMLOG_SEQ@H_502_3@@H_502_3@
  10. minvalue1@H_502_3@
  11. maxvalue999999999@H_502_3@
  12. startwith@H_502_3@8061@H_502_3@@H_502_3@
  13. incrementby@H_502_3@1@H_502_3@@H_502_3@
  14. cache20;@H_502_3@
以上所有字段(除了log_id)均为系统字段,字段的定义可以看配置文件,如下:@H_502_3@ @H_502_3@

[html] @H_502_3@ copy@H_502_3@
@H_502_3@?
    <?@H_502_3@xml@H_502_3@@H_502_3@version@H_502_3@=@H_502_3@"1.0"@H_502_3@@H_502_3@encoding@H_502_3@=@H_502_3@"utf-8"@H_502_3@@H_502_3@?>@H_502_3@@H_502_3@@H_502_3@
  1. <@H_502_3@configuration@H_502_3@>@H_502_3@@H_502_3@@H_502_3@
  2. log4net@H_502_3@>@H_502_3@@H_502_3@@H_502_3@
  3. configSections@H_502_3@section@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"log4net"@H_502_3@@H_502_3@type@H_502_3@=@H_502_3@"log4net.Config.Log4NetConfigurationSectionHandler,log4net"@H_502_3@@H_502_3@/>@H_502_3@@H_502_3@@H_502_3@
  4. </@H_502_3@appender@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"ADONetAppender"@H_502_3@@H_502_3@type@H_502_3@=@H_502_3@"log4net.Appender.ADONetAppender"@H_502_3@bufferSize@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"1"@H_502_3@@H_502_3@/>@H_502_3@@H_502_3@@H_502_3@
  5. connectionType@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"Oracle.DataAccess.Client.OracleConnection,Oracle.DataAccess,Version=2.111.7.20,Culture=neutral,PublicKeyToken=89b483f429c47342"@H_502_3@@H_502_3@connectionString@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"DataSource=//59.74.137.215:1521/GSGLAQYJ;UserID=GSGLAQYJ;Password=GSGLAQYJ;"@H_502_3@@H_502_3@commandText@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"INSERTINTOLOG4NET(LOG_ID,LOG_DATE,LOG_LEVEL,LOG_IDENTITY,LOG_MESSAGE,LOG_EXCEPTION,LOG_LOGGER,LOG_SOURCE)VALUES(LOG4NET_SEQ.nextval,:log_date,:log_level,:log_identity,:log_message,:log_exception,:logger,:source)"@H_502_3@@H_502_3@parameter@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":log_date"@H_502_3@@H_502_3@dbType@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"DateTime"@H_502_3@@H_502_3@layout@H_502_3@@H_502_3@type@H_502_3@=@H_502_3@"log4net.Layout.RawTimeStampLayout"@H_502_3@layout@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":log_level"@H_502_3@@H_502_3@dbType@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"String"@H_502_3@@H_502_3@size@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"10"@H_502_3@@H_502_3@layout@H_502_3@@H_502_3@type@H_502_3@=@H_502_3@"log4net.Layout.PatternLayout"@H_502_3@conversionPattern@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%level"@H_502_3@@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":log_identity"@H_502_3@@H_502_3@size@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"100"@H_502_3@@H_502_3@conversionPattern@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%identity"@H_502_3@@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":log_message"@H_502_3@@H_502_3@size@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"4000"@H_502_3@@H_502_3@conversionPattern@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%m"@H_502_3@@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":log_exception"@H_502_3@@H_502_3@conversionPattern@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%exception"@H_502_3@@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":logger"@H_502_3@@H_502_3@size@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"255"@H_502_3@@H_502_3@conversionPattern@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%logger"@H_502_3@@H_502_3@parameterName@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@":source"@H_502_3@@H_502_3@size@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"1000"@H_502_3@@H_502_3@conversionPattern@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%file:%line"@H_502_3@@H_502_3@appender@H_502_3@appender@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"InfoAppender"@H_502_3@@H_502_3@type@H_502_3@=@H_502_3@"log4net.Appender.RollingFileAppender"@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"File"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"Log\\LogInfo\\"@H_502_3@@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"AppendToFile"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"true"@H_502_3@@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"MaxFileSize"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"10240"@H_502_3@@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"MaxSizeRollBackups"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"100"@H_502_3@@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"StaticLogFileName"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"false"@H_502_3@@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"DatePattern"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"yyyyMMdd"@H_502_3@.log""@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"RollingStyle"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"Date"@H_502_3@@H_502_3@param@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"ConversionPattern"@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"%n日志时间:%d[%t]%n日志级别:%-5p%n日志类:%c[%x]%n%m%n"@H_502_3@@H_502_3@ @H_502_3@
  6. <!--logger@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"loginfo"@H_502_3@level@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"INFO"@H_502_3@@H_502_3@appender-ref@H_502_3@@H_502_3@ref@H_502_3@=@H_502_3@"InfoAppender"@H_502_3@@H_502_3@logger@H_502_3@>@H_502_3@--@H_502_3@root@H_502_3@level@H_502_3@@H_502_3@value@H_502_3@=@H_502_3@"All"@H_502_3@appender-ref@H_502_3@@H_502_3@ref@H_502_3@=@H_502_3@"ADONetAppender"@H_502_3@@H_502_3@>@H_502_3@@H_502_3@@H_502_3@


以上配置文件最主要的就是一下几行:@H_502_3@ @H_502_3@


1.Oracle.DataAccess.dll

就好比你自己写sql语句一样,无论那种数据库都得引一个XXXclient的库,后面的公钥要写对,查询一个dll的公开密钥可以先打开vs的命令工具,将dll放入命令工具的当前目录下,然后输入SN -T 回车即可获得公钥.

2.Oracle.DataAccess.Client.OracleConnection

这个就不用说了,肯定是连接数据库的字符串,网上好多格式都不对,这里我贴出了详细的格式

copy@H_502_3@
@H_502_3@/>
3.插入语句

copy@H_502_3@
@H_502_3@pre@H_502_3@@H_502_3@name@H_502_3@=@H_502_3@"code"@H_502_3@@H_502_3@class@H_502_3@=@H_502_3@"html"@H_502_3@>@H_502_3@ SYSTEMLOG(LOG_ID,LOG_SOURCE)VALUES@H_502_3@
  • (LOG4NET_SEQ.nextval,0); margin:0px; padding:0px; border:none; background-color:inherit; font-weight:bold">/>@H_502_3@pre@H_502_3@>@H_502_3@@H_502_3@@H_502_3@

  • 一定要注意变量的个数要一致,oracle变量默认以冒号开头。
    4.其他配置@H_502_3@@H_502_3@ @H_502_3@

    其他配置与写入文件的配置一样,可以参考上一篇,没有特别提出的都是在上篇的配置基础上继续进行的。@H_502_3@

    最后,调用代码如下:@H_502_3@

    [csharp] @H_502_3@ copy@H_502_3@
    @H_502_3@?
      class@H_502_3@Program@H_502_3@@H_502_3@
    1. {@H_502_3@
    2. private@H_502_3@@H_502_3@static@H_502_3@ILoglog=LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);@H_502_3@@H_502_3@
    3. @H_502_3@
    4. static@H_502_3@@H_502_3@void@H_502_3@Main(@H_502_3@string@H_502_3@[]args)@H_502_3@@H_502_3@
    5. log.Info("我"@H_502_3@);@H_502_3@@H_502_3@
    6. log.Warn("你"@H_502_3@);@H_502_3@@H_502_3@
    7. log.Debug("他"@H_502_3@);@H_502_3@@H_502_3@
    8. log.Error("她"@H_502_3@);@H_502_3@@H_502_3@
    9. log.Fatal("它"@H_502_3@);@H_502_3@@H_502_3@
    10. Console.ReadLine();@H_502_3@
    11. }@H_502_3@
    12. }@H_502_3@

    结果如下图:@H_502_3@ @H_502_3@



    注意事项:@H_502_3@

    项目需要log4net.dll,和其对应的.config和xml文件,并且需要引入上面的Oracle.DataAccess.dll,若没有oracle客户端,则就需要将pl/sql中的几个必备库拷贝至debug目录才能执行成功。所需库文件上传http://download.csdn.net/detail/kkkkkxiaofei/6436383@H_502_3@

    二、插入自定义字段@H_502_3@
    @H_502_3@

    sql如下:@H_502_3@



    插入自定义字段需要继承log4net里的基类,先看配置文件

    copy@H_502_3@
    @H_502_3@sectionname="log4net"type="System.Configuration.IgnoreSectionHandler,0); background-color:inherit; font-weight:bold">loggername="RollingLogFileAppender"levelvalue="ALL"appender-refref="RollingLogFileAppender"loggername="AdoNetAppender_Oracle"appender-refref="AdoNetAppender_Oracle"loggername="WarningDatail_Oracle"appender-refref="WarningDatail_Oracle"appendername="RollingLogFileAppender"type="log4net.Appender.RollingFileAppender" <!--日志的路径-->
  • filevalue="./GSGLAQYJLOG/ExecuteInfo.log"<!--是否覆盖,默认是追加true-->
  • appendToFilevalue="true"<!--按照文件的大小进行变换日志文件-->
  • rollingStylevalue="Size" <!--按照日期变换文件名称
  • rollingStylevalue="Date"datePatternvalue="yyyyMMdd-HHmm'.log'" --<!--设置无限备份=-1,最大备份数为1000-->
  • maxSizeRollBackupsvalue="-1"<!--每个文件的最大2M-->
  • maximumFileSizevalue="2MB"<!--日志文件名是否为静态-->
  • staticLogFileNamevalue="false"<!--输出文件格式-->
  • conversionPatternvalue="%d[%t]%-5p%c[%x]-%m[%r]%n" <!--輸出文件格式説明:
  • %d输出当前语句运行的时刻
  • %t当前语句所在的线程
  • %-数字:表示该项的最小长度,如果不够,则用空格填充
  • %p日志的当前优先级别,即DEBUG、INFO<、WARN…等
  • %m输出的日志消息,如ILog.Debug(…)>输出的一条消息
  • %n换行
  • %r運行的時間
  • %c当前日志对象的名称
  • <!--Log4net多线程写入-->
  • lockingModeltype="log4net.Appender.FileAppender+MinimalLock"<!--日志记录数据库-->
  • appendername="AdoNetAppender_Oracle"type="log4net.Appender.AdoNetAppender"bufferSizevalue="1" <!--<connectionTypevalue="System.Data.OracleClient.OracleConnection,System.Data.OracleClient,Version=4.0.30319.1,PublicKeyToken=b77a5c561934e089"/>-->
  • connectionStringvalue="DATASOURCE=//59.74.137.215:1521/GSGLAQYJ;USERID=GSGLAQYJ;PASSWORD=GSGLAQYJ"<!--<commandTextvalue="INSERTINTOLOG4NET(LOG_ID,:source)"/>-->
  • commandTextvalue="INSERTINTOSYSTEMLOG(LOG_ID,LOG_SOURCE,LOGINID,LOGINNAME,MENUNAME,ACTIONNAME,REMARK)VALUES
  • (SYSTEMLOG_SEQ.nextval,:source,:LoginID,:LoginName,:MenuName,:ActionName,:Remark)"layouttype="log4net.Layout.RawTimeStampLayout"<!--自定义属性-->
  • parameterNamevalue=":LoginID"layouttype="Log4netHandler.CustomLayout"conversionPatternvalue="%LoginID"parameterNamevalue=":LoginName"conversionPatternvalue="%LoginName"parameterNamevalue=":MenuName"conversionPatternvalue="%MenuName"parameterNamevalue=":ActionName"conversionPatternvalue="%ActionName"parameterNamevalue=":Remark"conversionPatternvalue="%Remark"appendername="WarningDatail_Oracle"type="log4net.Appender.AdoNetAppender"commandTextvalue="INSERTINTOSYSTEMLOG(LOG_ID,TERMINALNO,ORDERNO)VALUES(SYSTEMLOG_SEQ.nextval,:terminalno,:orderno)"<!--自定义属性:-->
  • parameterNamevalue=":terminalno"sizevalue="30"conversionPatternvalue="%TerminalNo"parameterNamevalue=":orderno"conversionPatternvalue="%OrderNo">
  • 配置文件定义了三个节点

    copy@H_502_3@
    @H_502_3@>
    每一个logger就相当一个root(上面插入系统字段时用的是root,两者都行),一个logger对应一个appender,分别是:

    写入文本的节点:

    copy@H_502_3@
    @H_502_3@>
    写入数据库的字段(一部分自定义字段):

    copy@H_502_3@
    @H_502_3@>
    写入数据库的字段(另一部分自定义字段)

    copy@H_502_3@
    @H_502_3@>
    其中自定义字段分两个节点是因为最后一个节点是在warn级别时才记录入库,而前者在info级别就入库了,这么做有利于分开处理。到时候插入库的时候也会发现插入前者时后者为空,而插入后者时前者也为空。

    自定义节点如下:

    以第一个节点为例,插入时的变量为:terminalno,在重写的类里,该变量是做为属性TerminalNo出现的,其实就是将类里的TerminalNo利用反射转换为oracle所能识别的变量:terminalno

    代码如下:

    1.实现该属性的类


    其他几个变量一样,都需要继承PatterLayoutConverter

    2.反射

    copy@H_502_3@
    @H_502_3@
    再看上面自定义属性时的配置文件,里面有一行
    copy@H_502_3@
    @H_502_3@>
    这时看到这个类想必就应该有所领悟了吧.

    3.封装节点

    4.调用

    copy@H_502_3@
    @H_502_3@ Log4netHandler.LogContentmsg=new@H_502_3@Log4netHandler.LogContent();@H_502_3@@H_502_3@
  • msg.LoginID="OutSocket_LoginID"@H_502_3@;@H_502_3@@H_502_3@
  • msg.LoginName="OutSocket_LoginName"@H_502_3@;@H_502_3@@H_502_3@
  • msg.MenuName="OutSocket_MenuName"@H_502_3@;@H_502_3@@H_502_3@
  • msg.ActionName="OutSocket_ActionName"@H_502_3@;@H_502_3@@H_502_3@
  • msg.Remark="12312"@H_502_3@;@H_502_3@@H_502_3@
  • msg.TerminalNo="空123"@H_502_3@;@H_502_3@@H_502_3@
  • msg.OrderNo="空2323"@H_502_3@;@H_502_3@@H_502_3@
  • Log4netHandler.OperaterLog.Login2Oracle().Info(msg);@H_502_3@
  • Log4netHandler.OperaterLog.Login2File().Info("12312"@H_502_3@);@H_502_3@@H_502_3@
  • Log4netHandler.OperaterLog.LoginWarning().Info(msg);@H_502_3@
  • Console.Read();@H_502_3@
  • }@H_502_3@
  • 5.结果如下@H_502_3@


    @H_502_3@


    如上面所说,插入第一部分自定义字段时后面两个为空,插入后面两个时前面也为空,这些都取决于封装的时候读取的节点。@H_502_3@最后要说明一下,整个调试过程十分恶心,无论是出现任何错误,用Log4Net调用oracle时都不报错,所以必须十分小心,记得把项目类型换成.net 4,不然会吐血的。再次吐槽CSDN的排版,蛋疼。。@H_502_3@

    猜你在找的Oracle相关文章