2014-09-29 64 views
0

我正在使用OracleAppender在Oracle 11g表中記錄消息。但它沒有記錄任何東西。我也使用EventLogAppender和RollingFileAppender,這些工作正常並且記錄消息。但OracleAppender不起作用。針對Oracle的appender log4net的配置部分看起來是這樣的:爲什麼log4Net不能記錄到Oracle 11g?

<connectionType value="Oracle.DataAccess.Client.OracleConnection, Oracle.DataAccess, Version=4.113.3.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    <connectionString value="DATA SOURCE= servername:portname/DBNAME; USER ID= user-id; PASSWORD= password;" /> 
    <!--Below is the hardcoded insert for testing purpose--> 
    <commandText value="Insert into MSG_LOG (LOG_ID, COMPONENT_NAME, LOG_DETAILS, LOG_PARAMETER_LIST, LOG_TYPE, REQUEST_ID, QUEUE_ID, OTHER_ID, LOG_USER_ID, LOG_DATE) 
         VALUES (335, '', '', '', 'test', '','', '', 'test', NULL)" /> 

我這個掙扎了一段時間了,所以想詢問的。你是否能夠看到我可能無法看到的明顯問題?

非常感謝。

回答

5

您應該啓用內部lo​​g4net的日誌,看看有什麼是錯的,讓log4net的日誌記錄從常見問題:

有兩種不同的方式,使在log4net的內部調試。 這些在下面列出。首選的方法是在應用程序的配置文件中指定 log4net.Internal.Debug選項。

•內部調試也可以通過設置 應用的配置文件中的值( 不是log4net的配置文件中,除非log4net的配置數據被嵌入在應用程序的配置文件 )啓用。 log4net.Internal.Debug應用程序設置必須設置爲 ,值爲true。例如:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <appSettings> 
     <add key="log4net.Internal.Debug" value="true"/> 
    </appSettings> 
</configuration> 

此設置立即在啓動時讀取的將導致發射的所有內部 調試消息。

•要以編程方式啓用log4net的內部調試,您需要將log4net.Util.LogLog.InternalDebugging屬性設置爲true,以將 設置爲true。顯然 越早設置越多的調試產生。

內部調試消息被寫入到控制檯和系統診斷.Trace系統中 。如果應用程序沒有 控制檯,那麼記錄的消息將會丟失。請注意, 應用程序可以通過設置 System.Console.Out來重定向控制檯流。跟蹤系統將默認發送消息 到附加的調試器(其中消息將出現在輸出 窗口中)。如果進程沒有附加調試器,則將消息發送到系統調試器。諸如http://www.sysinternals.com的調試視圖 等實用程序可用於捕獲這些消息。

由於log4net內部調試消息被寫入 System.Diagnostics.Trace系統,因此可以將這些 消息重定向到本地文件。您可以通過將 以下內容添加到應用程序中來定義跟蹤偵聽器。配置文件:

<configuration> 
    ... 

    <system.diagnostics> 
     <trace autoflush="true"> 
      <listeners> 
       <add 
        name="textWriterTraceListener" 
        type="System.Diagnostics.TextWriterTraceListener" 
        initializeData="C:\tmp\log4net.txt" /> 
      </listeners> 
     </trace> 
    </system.diagnostics> 

    ... 
</configuration> 

確保運行你的應用程序的進程有權 寫入該文件。

0

我知道這篇文章有點老了,但我只想在這裏添加一個我自己的經驗的帳戶,如果其他人在將來遇到它的話。

沒有任何Google搜索建議的解決方案能幫我解決問題。所以我決定下載log4net源代碼,並將該項目添加到我的解決方案中,以便讓我逐步完成代碼。

在某些時候,AdoNetAppender會評估它的緩衝區屬性,並且在讀取之後有一個註釋(釋義)「......如果緩衝區爲1,則立即登錄...」。所以我檢查了我自己的緩衝區大小,它的值爲100.將值更改爲1解決了我的問題。

此外,根據log4net documentation,默認值爲512,根據您提供的示例配置,您的緩衝區大小未明確設置,因此可能是默認值。

希望這會有所幫助!

TL; DR:設置AdoNetAppender緩衝區的大小爲1,如下所示:

<appender name="DBAppender" type="log4net.Appender.AdoNetAppender"> 
    <bufferSize value="1"/> 
    <!-- rest of configuration... --> 
</appender> 
0

緩衝區大小刷新插入到磁盤和提交。否則會有延遲,並且消息將不會立即顯示,具體取決於記錄頻率