1.关于配置文件。
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  5. </configSections>
  6. <log4net>
  7. <root>
  8. <level value="ALL" />
  9. <appender-ref ref="rollingFile" />
  10. <appender-ref ref="ADONetAppender"/>
  11. </root>
  12. <logger name="Presin_log">
  13. <level value="ALL" />
  14. <appender-ref ref="PresinLoging" />
  15. </logger>
  16. <logger name="Oracle_DB">
  17. <level value="ALL" />
  18. <appender-ref ref="OracleDB" />
  19. </logger>
  20. <logger name="flowseting_log">
  21. <level value="ALL" />
  22. <appender-ref ref="flowsetingLoging" />
  23. </logger>
  24. <!--Presin日志-->
  25. <appender name="PresinLoging" type="log4net.Appender.RollingFileAppender,log4net" >
  26. <param name="File" value="Log\Presin\" />
  27. <param name="AppendToFile" value="true" />
  28. <param name="RollingStyle" value="Composite" />
  29. <param name="DatePattern" value="yyyy-MM-dd.'.txt'" />
  30. <param name="MaximumFileSize" value ="5MB"/>
  31. <param name="StaticLogFileName" value="false" />
  32. <layout type="log4net.Layout.PatternLayout,log4net">
  33. <conversionPattern value="%date %-5level %newline %logger - %message%newline %newline" />
  34. </layout>
  35. </appender>
  36. <appender name="OracleDB" type="log4net.Appender.AdoNetAppender,log4net" >
  37. <bufferSize value="20"/>
  38. <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  39. <connectionString value="Data Source=ORCl;User ID=sa;Password=sa;" />
  40. <commandText value="INSERT INTO LogDetails (LogDate,loglevel,loglogger,LogMessage,logfunctionname,logbusinessname) VALUES (:log_date,:log_level,:logger,:message,:FunctionName,:BusinessName)" />
  41. <parameter>
  42. <parameterName value=":log_date" />
  43. <dbType value="DateTime" />
  44. <layout type="log4net.Layout.PatternLayout">
  45. <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
  46. </layout>
  47. </parameter>
  48. <parameter>
  49. <parameterName value=":log_level" />
  50. <dbType value="String" />
  51. <size value="200" />
  52. <layout type="log4net.Layout.PatternLayout">
  53. <conversionPattern value="%p" />
  54. </layout>
  55. </parameter>
  56. <parameter>
  57. <parameterName value=":logger" />
  58. <dbType value="String" />
  59. <size value="200" />
  60. <layout type="log4net.Layout.PatternLayout">
  61. <conversionPattern value="%logger" />
  62. </layout>
  63. </parameter>
  64. <parameter>
  65. <parameterName value=":message" />
  66. <dbType value="String" />
  67. <size value="2000" />
  68. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  69. <conversionPattern value="%property{Message}" />
  70. </layout>
  71. </parameter>
  72. <parameter>
  73. <parameterName value=":FunctionName" />
  74. <dbType value="String" />
  75. <size value="200" />
  76. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  77. <conversionPattern value="%property{FunctionName}" />
  78. </layout>
  79. </parameter>
  80. <parameter>
  81. <parameterName value=":BusinessName" />
  82. <dbType value="String" />
  83. <size value="200" />
  84. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  85. <conversionPattern value="%property{BusinessName}" />
  86. </layout>
  87. </parameter>
  88. </appender>
  89. <!--flowseting日志-->
  90. <appender name="flowsetingLoging" type="log4net.Appender.RollingFileAppender,log4net" >
  91. <param name="File" value="Log\flowseting\" />
  92. <param name="AppendToFile" value="true" />
  93. <param name="RollingStyle" value="Date" />
  94. <param name="DatePattern" value="yyyyMMdd" />
  95. <param name="StaticLogFileName" value="true" />
  96. <layout type="log4net.Layout.PatternLayout,log4net">
  97. <conversionPattern value="%date %-5level %newline %logger - %message%newline %newline" />
  98. </layout>
  99. </appender>
  100. </log4net>
  101. </configuration>
a.在配置文件中,root节点下需要增加<appender-ref ref="ADONetAppender"/>代表允许将日志插入数据库中。
  1. <root>
  2. <level value="ALL" />
  3. <appender-ref ref="rollingFile" />
  4. <appender-ref ref="ADONetAppender"/>
  5. </root>
rollingFile是将日志写入文件中,在这里不做讨论。
ADONetAppender是将日志写入数据库中,然后log4Net会根据接下来的配置connectionType和connectionString判断插入何种数据库和哪个数据库
b.增加一个logname,方便进一步添加属性
  1. <logger name="Oracle_DB">
  2. <level value="ALL" />
  3. <appender-ref ref="OracleDB" />
  4. </logger>
c.进一步配置OracleDB
  1. <appender name="OracleDB" type="log4net.Appender.AdoNetAppender,log4net" >
  2. <bufferSize value="20"/>
  3. <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
  4. <connectionString value="Data Source=ORCl;User ID=sa;Password=sa;" />
  5. <commandText value="INSERT INTO LogDetails (LogDate,loglevel,loglogger,LogMessage,logfunctionname,logbusinessname) VALUES (:log_date,:log_level,:logger,:message,:FunctionName,:BusinessName)" />
  6. <parameter>
  7. <parameterName value=":log_date" />
  8. <dbType value="DateTime" />
  9. <layout type="log4net.Layout.PatternLayout">
  10. <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
  11. </layout>
  12. </parameter>
  13. <parameter>
  14. <parameterName value=":log_level" />
  15. <dbType value="String" />
  16. <size value="200" />
  17. <layout type="log4net.Layout.PatternLayout">
  18. <conversionPattern value="%p" />
  19. </layout>
  20. </parameter>
  21. <parameter>
  22. <parameterName value=":logger" />
  23. <dbType value="String" />
  24. <size value="200" />
  25. <layout type="log4net.Layout.PatternLayout">
  26. <conversionPattern value="%logger" />
  27. </layout>
  28. </parameter>
  29. <parameter>
  30. <parameterName value=":message" />
  31. <dbType value="String" />
  32. <size value="2000" />
  33. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  34. <conversionPattern value="%property{Message}" />
  35. </layout>
  36. </parameter>
  37. <parameter>
  38. <parameterName value=":FunctionName" />
  39. <dbType value="String" />
  40. <size value="200" />
  41. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  42. <conversionPattern value="%property{FunctionName}" />
  43. </layout>
  44. </parameter>
  45. <parameter>
  46. <parameterName value=":BusinessName" />
  47. <dbType value="String" />
  48. <size value="200" />
  49. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  50. <conversionPattern value="%property{BusinessName}" />
  51. </layout>
  52. </parameter>
  53. </appender>
其中需要注意的是:
(1).bufferSize,代表缓存的记录条数,设置为20,表示log4net会在有20条日志时调用数据库并插入。
(2).connectionType代表数据库类型,注意Version和PublicKeyToken一定要于自己系统调用的版本一致。oracle的2.0版本的System.Data.OracleClient一般是2.0.0.0和b77a5c561934e089
(3)commandText代表插入的语句,注意oracle的参数是:参数,而sqlserver是@参数,且此处一定要保证,sql语句正确,如数据库中无此表或表无此字段,log4Net都不会报错,但不会进行任何操作。
(4)通过parameter逐一将要插入数据库的参数进行赋值和格式化
如:日期格式化和赋值
  1. <parameter>
  2. <parameterName value=":log_date" />
  3. <dbType value="DateTime" />
  4. <layout type="log4net.Layout.PatternLayout">
  5. <conversionPattern value="%date{yyyy-MM-dd HH:mm:ss}" />
  6. </layout>
  7. </parameter>
字符串默认格式化和赋值
  1. <parameter>
  2. <parameterName value=":logger" />
  3. <dbType value="String" />
  4. <size value="200" />
  5. <layout type="log4net.Layout.PatternLayout">
  6. <conversionPattern value="%logger" />
  7. </layout>
  8. </parameter>
log4Net提供给我们的字段有:
log_date,log_level,logger,message等,其余的字段需要我们自定义
自定义字段格式化和赋值
  1. <parameter>
  2. <parameterName value=":FunctionName" />
  3. <dbType value="String" />
  4. <size value="200" />
  5. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  6. <conversionPattern value="%property{FunctionName}" />
  7. </layout>
  8. </parameter>
log4Net提供的字段,我们也可以通过自定义重载
  1. <parameter>
  2. <parameterName value=":message" />
  3. <dbType value="String" />
  4. <size value="2000" />
  5. <layout type="MapgisEgovLog4_WriteLog.MyLayout">
  6. <conversionPattern value="%property{Message}" />
  7. </layout>
  8. </parameter>
注意:layout Type中填写的是og4net的格式化类以及其命名空间。
conversionPattern中是使用扩展的格式化类中注册的格式化方法。
 
扩展格式化需要一些后台代码支持
 
  1. /// <summary>
  2. /// 包含了所有的自定字段属性
  3. /// </summary>
  4. public class LogContent
  5. {
  6. public LogContent(string sFunctionName, string sLogMessasge,string sLogBusinessName)
  7. {
  8. FunctionName = sFunctionName;
  9. Message = sLogMessasge;
  10. BusinessName = sLogBusinessName;
  11. }
  12.  
  13. /// <summary>
  14. /// 方法名称
  15. /// </summary>
  16. public string FunctionName { get; set; }
  17.  
  18. /// <summary>
  19. /// 日志描述信息
  20. /// </summary>
  21. public string Message { get; set; }
  22.  
  23. /// <summary>
  24. /// 业务名称
  25. /// </summary>
  26. public string BusinessName { get; set; }
  27. }
  28.  
  29. public class MyLayout : PatternLayout
  30. {
  31. public MyLayout()
  32. {
  33. this.AddConverter("property", typeof(LogInfoPatternConverter));
  34. }
  35. }
  36.  
  37. public class LogInfoPatternConverter : PatternLayoutConverter
  38. {
  39.  
  40. protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
  41. {
  42. if (Option != null)
  43. {
  44. WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
  45. }
  46. else
  47. {
  48. WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
  49. }
  50. }
  51. /// <summary>
  52. /// 通过反射获取传入的日志对象的某个属性的值
  53. /// </summary>
  54. /// <param name="property"></param>
  55. /// <returns></returns>
  56.  
  57. private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
  58. {
  59. object propertyValue = string.Empty;
  60. PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
  61. if (propertyInfo != null)
  62. propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
  63. return propertyValue;
  64. }
  65. }
其中:
d.自定义字段的类
  1. public class LogContent
  2. {
  3. public LogContent(string sFunctionName, string sLogMessasge,string sLogBusinessName)
  4. {
  5. FunctionName = sFunctionName;
  6. Message = sLogMessasge;
  7. BusinessName = sLogBusinessName;
  8. }
  9.  
  10. /// <summary>
  11. /// 方法名称
  12. /// </summary>
  13. public string FunctionName { get; set; }
  14.  
  15. /// <summary>
  16. /// 日志描述信息
  17. /// </summary>
  18. public string Message { get; set; }
  19.  
  20. /// <summary>
  21. /// 业务名称
  22. /// </summary>
  23. public string BusinessName { get; set; }
  24. }
e.扩展log4net的格式化方法
  1. public class MyLayout : PatternLayout
  2. {
  3. public MyLayout()
  4. {
  5. this.AddConverter("property", typeof(LogInfoPatternConverter));
  6. }
  7. }
f.通过反射的方法获取LogContent中定义的字段
  1. public class LogInfoPatternConverter : PatternLayoutConverter
  2. {
  3.  
  4. protected override void Convert(TextWriter writer, LoggingEvent loggingEvent)
  5. {
  6. if (Option != null)
  7. {
  8. WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
  9. }
  10. else
  11. {
  12. WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
  13. }
  14. }
  15. /// <summary>
  16. /// 通过反射获取传入的日志对象的某个属性的值
  17. /// </summary>
  18. /// <param name="property"></param>
  19. /// <returns></returns>
  20.  
  21. private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
  22. {
  23. object propertyValue = string.Empty;
  24. PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
  25. if (propertyInfo != null)
  26. propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
  27. return propertyValue;
  28. }
  29. }

调用示例

  1. log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(strPath + "配置文件.xml"));
  2. ILog log = LogManager.GetLogger("Oracle_DB");
  3. log.Info(new LogContent("Button1_Click", "测试成功","测试"));

参考:

http://blog.csdn.net/kongwei521/article/details/52242319

 

关于使用Log4Net将日志插入oracle数据库中的更多相关文章

  1. .net core 中使用Log4net输出日志到Mysql数据库中

    .net core 中使用Log4net输出日志到数据库中去 1.使用Nuget安装log4net 和 mysql.data 2.设置log4net 的配置文件 log4net.config 可以设置 ...

  2. 知方可补不足~利用LogParser将IIS日志插入到数据库

    回到目录 LogParser是微软开发的一个日志分析工具,它是命令行格式的,我们通过这个工具,可以对日志文件进行操作,对于一个几百兆的log文件,使用记事本打开是件很残酷的事,所以,很多情况下,我们都 ...

  3. Oracle 数据库中日期时间的插入操作

    Oracle 中如何插入日期时间类型的数据,首先为了演示, 新建数据表如下 create table t( mydate date); 插入日期时间 SQL> insert into t val ...

  4. 向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据

    向Oracle数据库中插入数据出错: 经过排查,因为Update数据时没有出错,所以OracleHelper没有问题: 看异常信息提示:无效的变量和数据,应该是SQL语句的问题,调试时所传的实例Use ...

  5. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  6. 利用LogParser将IIS日志插入到数据库

    利用LogParser将IIS日志插入到数据库 上面的博文是定制一个计划任务来将log日志定时的导入数据库      下面这篇博文是用cmd指令将日志导入到一张sql表中,是一次性操作   Log P ...

  7. SQL语句往Oracle数据库中插入日期型数据(to_date的用法)

    Oracle 在操作数据库上相比于其他的 T-sql 有微小的差别,但是在插入时间类型的数据是必须要注意他的 to_date 方法,具体的情况如下: --SQL语句往Oracle数据库中插入日期型数据 ...

  8. Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别

    [转]   SYS.SYSTEM.DBSNMP. Oracle 数据库中 SYS.SYSTEM.DBSNMP.SYSMAN 四用户的区别 用户: SYS 用户: SYS,默认密码为 CHANGE_ON ...

  9. Oracle数据库中实现mysql数据库中auto-increment功能

    在Mysql数据库中,想要实现一条数据的自增一功能(即插入此数据时填写null即可,系统自动+1),可直接在所在列使用语句auto-increment. id int primary key auto ...

随机推荐

  1. MongoDb安装--yum安装

    本帖最后由 草包 于 2017-5-2 09:57 编辑 [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 ...

  2. 自动化运维工具——puppet详解(一)

    一.puppet 介绍 1.puppet是什么 puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期: 供应(provisioning).配置(configur ...

  3. springCloud Hystrix 断路由

    第一步加入依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId& ...

  4. 初识java这个小姑娘(三)

    说烂了的面向对象 我要说的面向对象,其实是一个我自己都觉的有点恶心的东西. 它是java语言入门如此初级的一个概念.作为一个老鸟,你可以吐口水给我,我可以把它们擦干,但作为总结还得说一说. 因为对于一 ...

  5. java学习笔记之StringBuilder

    StringBuilder总结 StringBuilder概述: StringBuilder是一个线程不安全的类,他在字符串连接方面性能尤其出色 StringBuilder类的构造方法: 1.空参数构 ...

  6. API Gateway - KONG 安装与配置

    简介 Kong,是由Mashape公司开源的,基于Nginx的API gateway 特点 可扩展,支持分布式 模块化 功能:授权.日志.ip限制.限流.api 统计分析(存在商业插件Galileo等 ...

  7. 》》豆瓣API

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  8. 诡异的 &quot;password取回&quot; 邮件问题

    大部分系统中都有"找回password"的功能,我们的平台也做了此功能,用户可通过 短信,邮件 找回password. 当中对于邮件找回password的方式遇到奇特的问题.记录下 ...

  9. 为了提高性能,怎样动态载入JS文件

    超级表格是一款多人协作的在线表格.程序相当复杂,用到十几个JS文件. 可是有些文件是在打开某些类型的表格时才须要载入. 比如,仅仅有当打开甘特图表格时,才须要载入gantetu.js文件. 那么问题来 ...

  10. javascript中的事件Event

    一.事件流 1.事件流:描述的是从页面中接受事件的顺序 IE的事件流是事件冒泡流,Netscape的事件流是事件捕获流. 2.事件冒泡 IE的事件流叫做事件冒泡(event bubbing),即事件开 ...