log4net输出到oracle的艰难排错过程

问题很简单:使用log4net,把log插入到oracle。
初次接触大名鼎鼎的log4net,网上一搜,资料还真不少……看起来确实挺简单的,在配置文件里增加AdoNetAppender即可。可是实际一操作才发现水还是蛮深的。无头苍蝇般乱撞了3个小时,终于搞定,特此记录一下。

首先,基本操作:把baidu来的代码copy到自己建的工程里去。
1. 建一个console工程
2. 添加引用: log4net, System.Data.OracleClient
3. 添加App.config,内容大致如下(有错版):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  
  <log4net>
    <appender name="ADONetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      <connectionString value="Data Source=orcl;User Id=xxx;Password=xxx;" />
      <commandText value="INSERT INTO Users.My_Log ([Log_Message]) VALUES (@msg)" />
      <bufferSize value="1" />
      <parameter>
        <parameterName value="@msg" />
        <dbType value="String" />
        <size value="1024" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender_Oracle" />
    </root>
  </log4net>
</configuration>

4. 写测试代码GetLogger,输出等等
5. 手动CREATE TABLE

一切就绪,运行~~ NG
没有报错,DB里也没有加进数据。
于是只能继续百度,发现有很多说法,一一试过仍然没有任何反应。

我就郁闷了,这么牛B的log4net。你搞不定也就算了,为啥连一点debug信息都不给呢。又继续搜了下,发现我错了。
引用
log4net可以输出internal debug信息,只要在配置文件里加上(configuration根节点下):
  <appSettings>
    <add key="log4net.Internal.Debug" value="true "/>
  </appSettings>


有了debug信息就方便多了:
引用
第一条错误:
System.Data.OracleClient.OracleException: ORA-01036

参数不对。参数?那把@msg改成:msg试试。

Oh yeah,ORA-01036没有了,不过来了这个:
引用
System.Data.OracleClient.OracleException: ORA-00928

百度一下,说是可能在列名上加了引号。难道log4net会把[ ]换成引号?
于是去掉列[Log_Message]的中括号。

然后:
引用
System.Data.OracleClient.OracleException: ORA-00942

表不存在?嗯。。。那把表空间名Users去掉看看。

OK,搞定了!
最终版配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="System.Configuration.IgnoreSectionHandler" />
  </configSections>
  
  <appSettings>
    <add key="log4net.Internal.Debug" value="true "/>
  </appSettings>
  
  <log4net>
    <appender name="ADONetAppender_Oracle" type="log4net.Appender.AdoNetAppender">
      <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
      <connectionString value="Data Source=orcl;User Id=xxx;Password=xxx;" />
      <commandText value="INSERT INTO My_Log (Log_Message) VALUES (:msg)" />
      <bufferSize value="1" />
      <parameter>
        <parameterName value=":msg" />
        <dbType value="String" />
        <size value="1024" />
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message" />
        </layout>
      </parameter>
    </appender>

    <root>
      <level value="DEBUG" />
      <appender-ref ref="ADONetAppender_Oracle" />
    </root>
  </log4net>
</configuration>

猜你喜欢

转载自crayster.iteye.com/blog/1703609