原文:c#用log4Net将日志写入到Oracle数据库,并写入到文件中

版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

1.从官网下载log4net包,安装到项目中;

2.配置文件log4net.config/app.config

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <configSections>
  4. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  5. </configSections>
  6. <startup>
  7. <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  8. </startup>
  9. <system.data>
  10. <DbProviderFactories>
  11. <remove invariant="MySql.Data.MySqlClient"/>
  12. <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
  13. </DbProviderFactories>
  14. </system.data>
  15. <appSettings>
  16. <add key="log4net.Internal.Debug" value="true "/>
  17. <add key="DbProvider" value="System.Data.SqlClient"/>
  18. </appSettings>
  19. <log4net>
  20. <appender name="AdoNetMysql" type="log4net.Appender.AdoNetAppender,log4net">
  21. <bufferSize value="2"/>
  22. <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/>
  23. <param name="ConnectionString" value="Server=DESKTOP-QJVL170;Uid=root;Pwd=zws_321;Database=bjdata_zs;Connect Timeout=120; character set=utf8;Use Affected Rows=true;"/>
  24. <commandText value="INSERT INTO mylog(id,log_datetime,log_thread,log_level,log_logger,log_message) VALUES (null,@log_date, @thread, @log_level, @logger, @message)"/>
  25. <parameter>
  26. <parameterName value="@log_date"/>
  27. <dbType value="DateTime"/>
  28. <layout type="log4net.Layout.PatternLayout" value="%d{yyyy-MM-dd HH:mm:ss}"/>
  29. </parameter>
  30. <parameter>
  31. <parameterName value="@thread"/>
  32. <dbType value="String"/>
  33. <layout type="log4net.Layout.PatternLayout" value="%thread">
  34. </layout>
  35. </parameter>
  36. <parameter>
  37. <parameterName value="@log_level"/>
  38. <dbType value="String"/>
  39. <layout type="log4net.Layout.PatternLayout" value="%log_level">
  40. </layout>
  41. </parameter>
  42. <parameter>
  43. <parameterName value="@logger"/>
  44. <dbType value="String"/>
  45. <layout type="log4net.Layout.PatternLayout" value="%logger">
  46. </layout>
  47. </parameter>
  48. <parameter>
  49. <parameterName value="@message"/>
  50. <dbType value="String"/>
  51. <layout type="log4net.Layout.PatternLayout" value="%message">
  52. </layout>
  53. </parameter>
  54. <filter type="log4net.Filter.LevelRangeFilter">
  55. <levelMin value="Info" />
  56. <levelMax value="Fatal" />
  57. </filter>
  58. </appender>
  59. <appender name="ADONetAppender_Oracle" type="log4net.Appender.ADONetAppender">
  60. <!--日志缓存写入条数 设置为0时只要有一条就立刻写到数据库-->
  61. <bufferSize value="0" />
  62. <!--日志数据库连接串-->
  63. <!--<connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />-->
  64. <connectionType value="Oracle.ManagedDataAccess.Client.OracleConnection, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  65. <!--<connectionString value="Data Source=//59.110.46.189:1521/TestOracle;User ID=TestUser;Password=TestUser;" />-->
  66. <connectionString value="User ID=TestUser;Password=TestUser;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =59.110.46.189)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =TestOracle )))"/>
  67. <!--<connectionString value="Data Source=TestOracle;User ID=TestUser;Password=TestUser;SERVER=59.110.46.189;" />-->
  68. <!--日志数据库脚本-->
  69. <!--<commandText value="INSERT INTO BJ_LogDetails (LogDate,LogThread,LogLevel,LogLogger,LogActionClick,LogMessage,UserName,UserIP) VALUES ('20180112', '3', 'info', '567657', 'delete', :LOG_MESSAGE,'zs','127.0.0.1')" />-->
  70. <commandText value="INSERT INTO BJ_LOGDETAILS (LogDate,LogThread,LogLevel,LogLogger,LogActionClick,LogMessage,OPERAND) VALUES (:LogDate,:LogThread,:LogLevel,:LogLogger,:ActionsClick,:Message,:Operand)" />
  71. <!--日志时间LogDate -->
  72. <parameter>
  73. <parameterName value="@log_date" />
  74. <dbType value="DateTime" />
  75. <layout type="log4net.Layout.RawTimeStampLayout" />
  76. </parameter>
  77. <!--线程号-->
  78. <parameter>
  79. <parameterName value="@thread" />
  80. <dbType value="String" />
  81. <size value="100" />
  82. <layout type="log4net.Layout.PatternLayout">
  83. <conversionPattern value="%t" />
  84. </layout>
  85. </parameter>
  86. <!--日志类型LogLevel -->
  87. <parameter>
  88. <parameterName value="@log_level" />
  89. <dbType value="String" />
  90. <size value="200" />
  91. <layout type="log4net.Layout.PatternLayout">
  92. <conversionPattern value="%p" />
  93. </layout>
  94. </parameter>
  95. <!--日志名称-->
  96. <parameter>
  97. <parameterName value="@logger" />
  98. <dbType value="String" />
  99. <size value="500" />
  100. <layout type="log4net.Layout.PatternLayout">
  101. <conversionPattern value="%logger" />
  102. </layout>
  103. </parameter>
  104. <parameter>
  105. <parameterName value="@ActionsClick" />
  106. <dbType value="String" />
  107. <size value="4000" />
  108. <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog" >
  109. <conversionPattern value = "%property{ActionsClick}"/>
  110. </layout>
  111. </parameter>
  112. <parameter>
  113. <parameterName value="@Message" />
  114. <dbType value="String" />
  115. <size value="2000" />
  116. <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
  117. <conversionPattern value="%property{Message}" />
  118. </layout>
  119. </parameter>
  120. <!--操作对象-->
  121. <parameter>
  122. <parameterName value="@Operand" />
  123. <dbType value="String" />
  124. <size value="300" />
  125. <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
  126. <conversionPattern value="%property{Operand}" />
  127. </layout>
  128. </parameter>
  129. </appender>
  130. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
  131. <!--定义文件存放位置-->
  132. <file value="log\\"/>
  133. <appendToFile value="true"/>
  134. <rollingStyle value="Date"/>
  135. <datePattern value="yyyyMM\\yyyyMMdd'.txt'"/>
  136. <staticLogFileName value="false"/>
  137. <param name="MaxSizeRollBackups" value="100"/>
  138. <layout type="log4net.Layout.PatternLayout">
  139. <conversionPattern value="==== %date [%thread] %-5level ==== : %newline%message%newline%newline" />
  140. </layout>
  141. </appender>
  142. <!--配置到数据库-->
  143. <appender name="ADONetApp" type="log4net.Appender.ADONetAppender,log4net">
  144. <!--BufferSize为缓冲区大小-->
  145. <bufferSize value="10" />
  146. <!--<param name="BufferSize" value="2" />-->
  147. <!--引用-->
  148. <param name="ConnectionType" value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data"/>
  149. <!--连接字符串-->
  150. <param name="ConnectionString" value="Server=DESKTOP-QJVL170;Uid=root;Pwd=zws_321;Database=bjdata_zs;Allow Zero Datetime=True;character set=utf8;"/>
  151. <!--插入语句-->
  152. <commandText value="INSERT INTO sys_error_log(Message) VALUES ('sdfd')" />
  153. <!--记录时间-->
  154. <!--<parameter>
  155. <parameterName value="@log_date" />
  156. <dbType value="DateTime" />
  157. <layout type="log4net.Layout.RawTimeStampLayout" />
  158. </parameter>-->
  159. <!--线程号-->
  160. <!--消息-->
  161. <parameter>
  162. <parameterName value="@Message" />
  163. <dbType value="String" />
  164. <size value="2000" />
  165. <layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
  166. <conversionPattern value="%property{Message}" />
  167. </layout>
  168. </parameter>
  169. </appender>
  170. <root>
  171. <level value="ALL"/>
  172. <appender-ref ref="RollingLogFileAppender"/>
  173. <appender-ref ref="ADONetAppender_Oracle"/>
  174. <!--记录到什么介质中-->
  175. </root>
  176. <!--使用反射方法同时写两文件和数据库-->
  177. <logger name="writLogger">
  178. <level value="ALL"/>
  179. <appender-ref ref="RollingLogFileAppender"/>
  180. <appender-ref ref="ADONetAppender_Oracle"/>
  181. </logger>
  182. </log4net>
  183. <connectionStrings>
  184. <add name="OraConnString1" connectionString="User ID=TestUser;Password=TestUser;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =59.110.46.189)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =TestOracle )))"/>
  185. <add name="OracleTarget" connectionString="User ID=TESTUSER;Password=TestUser;Data Source=(DESCRIPTION = (ADDRESS_LIST= (ADDRESS = (PROTOCOL = TCP)(HOST =59.110.46.189)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME =BJWARE )))"/>
  186. </connectionStrings>
  187. </configuration>

3.c#代码的调用:

  1. public partial class Form1 : Form
  2. {
  3. public Form1()
  4. {
  5. InitializeComponent();
  6. log4net.Config.XmlConfigurator.Configure();
  7. }
  8. private void button1_Click(object sender, EventArgs e)
  9. {
  10. ILog log1 = LogManager.GetLogger("writLogger");
  11. ILog log11 = LogManager.GetLogger("writLogger");
  12. log11.Info(new LogInfo("1","wgh","s","登陆"));
  13. log1.Info(new LogMessage(1, (int)TGLog.ActionType.Other, "测试数据"));
  14. }
  15. private void Form1_Load(object sender, EventArgs e)
  16. {
  17. }
  18. }

4.数据库表结构如下:

  1. CREATE TABLE "TESTUSER"."BJ_LOGDETAILS"
  2. ( "LOGID" NUMBER,
  3. "LOGDATE" DATE,
  4. "LOGTHREAD" NVARCHAR2(100),
  5. "LOGLEVEL" NVARCHAR2(200),
  6. "LOGLOGGER" NVARCHAR2(500),
  7. "LOGMESSAGE" NVARCHAR2(2000),
  8. "LOGACTIONCLICK" NVARCHAR2(400),
  9. "OPERAND" NVARCHAR2(400)
  10. )

PS:1.配置文件中,不需要的参数必须注释或者删除,否则写入不到数据库中;

2.确保链接字符串,SQL语句的正确率;

3.确保oracle数据库版本正确,确保log4net包版本正确;

4.调试阶段,可以跟踪ILog中的参数是否全部为true;

如有错误,希望指出;共同进步!

c#用log4Net将日志写入到Oracle数据库,并写入到文件中的更多相关文章

  1. Oracle数据库date类型与Java中Date的联系与转化

    以下是对Java中的日期对象与Oracle中的日期之间的区别与联系做点说明,以期对大家有所帮助.new Date():分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒),就是系统当前 ...

  2. Oracle数据库克隆后temp文件因路径变化无法找到问题

    Oracle数据库克隆后temp文件因路径变化无法找到出现如下报错Errors in filexxxx.trc:ORA-01157: cannot identify/lock data file xx ...

  3. 转载-Oracle 数据库导入导出 dmp文件

    首先询问对方数据库的表空间名称和大小,然后在你的oracle中建立相应表空间,最后使用命令导入.导出数据.补充:1.要新建一个数据库: Oracle数据导入导出imp/exp就相当于oracle数据还 ...

  4. 如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量

    概述: 本地化是系统或软件运行的语言和文化环境.设置NLS_LANG环境参数是规定Oracle数据库软件本地化行为最简单的方式. NLS_LANG参数不但指定了客户端应用程序和Oracle数据库所使用 ...

  5. Oracle 数据库字典 sys.obj$ 表中关于type#的解释

    sys.obj$ 表是oracle 数据库字典表中的对象基础表,所有对象都在该表中有记录,其中type#字段表明对象类型,比如有一个表 test ,则该对象在sys.obj$ 中存在一条记录,name ...

  6. Elasticsearch准实时索引实现(数据写入到es分片并存储到文件中的过程)

    溢写到文件系统缓存 当数据写入到ES分片时,会首先写入到内存中,然后通过内存的buffer生成一个segment,并刷到文件系统缓存中,数据可以被检索(注意不是直接刷到磁盘) ES中默认1秒,refr ...

  7. Oracle 数据库导入导出 dmp文件

    转自: http://hi.baidu.com/ooofcu/blog/item/ec5d1f9580d41f007af48077.html 首先询问对方数据库的表空间名称和大小,然后在你的oracl ...

  8. Oracle数据库编程:在JDBC中应用Oracle

    9.在JDBC中应用Oracle: JDBC访问数据库基本步骤:          1.加载驱动          2.获取链接对象          3.创建SQL语句          4.提交S ...

  9. oracle数据库读取操作系统的物理文件-转载,待完善

    --源地址不详 --创建目录SQL> create directory dir_xls as '/home/oracle'; Directory created. --给用户授权SQL> ...

随机推荐

  1. awk基础学习

    2019-12-20 需要巧记,很多格式,学习难度:grep.sed.awk awk知识概述 1三剑客awk命令介绍2三剑客awk命令执行原理语法结构3三剑客awk命令实操练习查询替换信息排除(取反) ...

  2. 修改select的默认样式

    在我们用select的时候,通常因为他的默认样式比较丑而用自己样式,那首先要去掉他的默认样式 去掉select的边框和点击时的蓝色边框 select{border: none;outline: non ...

  3. 纯CSS手动滑动轮播图(隐藏滚动条)

    HTML: <div class="bigder"> <div class="big"> <dl> <dt>&l ...

  4. JSP 自动刷新

    JSP 自动刷新 想象一下,如果要直播比赛的比分,或股票市场的实时状态,或当前的外汇配给,该怎么实现呢?显然,要实现这种实时功能,您就不得不规律性地刷新页面.JSP提供了一种机制来使这种工作变得简单, ...

  5. VMware 15 安装 macOS 10.14优质教程链接集合

    https://www.jianshu.com/p/25d2d781bd98 https://mp.weixin.qq.com/s/91Qc7L7E0xbVYXUcReUb_w https://blo ...

  6. kvm中添加VNC密码

      #virsh edit 虚机名 <graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0' keymap='en-us'/ ...

  7. SecureCRT上传、下载文件 使用rz【上传】& sz【下载】命令

    首先安装:apt-get install lrzsz SecureCRT这款SSH客户端软件同时具备了终端仿真器和文件传输功能.比ftp命令方便多了,而且服务器不用再开FTP服务了.rz,sz是便是L ...

  8. python curl_get-pip.py Installing with get-pip.py

    w curl https://bootstrap.pypa.io/get-pip.py > curl_get-pip.pypython curl_get-pip.py https://pip.p ...

  9. 多线程threading初识二--多线程等待

    .join() :子线程等待主线程 下面程序运行流程: 主线程负责启动5个子线程,把每个线程放在threads list里,然后等待所有线程等待完毕后,再执行end_time = time.time( ...

  10. 常用的adb命令收集

    测试app常会用到一些adb命令,当然使用adb命令,需要配好jdk.sdk环境,不然不能使用的 1.adb help ----帮助信息 2.adb device ----手机的id查看 3.adb ...