2014-09-29 4 views
0

Я использую OracleAppender для регистрации сообщений в таблице Oracle 11g. Но он ничего не записывает. Я также использую EventLogAppender и RollingFileAppender, которые отлично работают и регистрируют сообщения. Но OracleAppender не работает. Конфигурационный раздел Log4Net для Oracle Appender выглядит следующим образом:Почему 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

Вы должны включить внутреннюю регистрацию log4net, чтобы увидеть, что это неправильно, включить ведение журнала log4net из FAQ:

Есть 2 различных способа включения внутренней отладки в 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. Очевидно, , чем скорее это будет установлено, тем больше будет отладки.

Внутренние сообщения для отладки записываются на консоль и в систему System.Diagnostics.Trace . Если приложение не имеет консоли , сообщения, зарегистрированные там, будут потеряны. Обратите внимание, что приложение может перенаправить консольный поток, установив System.Console.Out. Система Trace по умолчанию отправит сообщение прикрепленному отладчику (где сообщения появятся в окне вывода ). Если в процессе нет подключенного отладчика, сообщения отправляются в системный отладчик. Утилита вроде DebugView от 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; ДР: Набор AdoNetAppender размер буфера до 1 следующим образом:

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

Размер буфера промывает вставки на диск и совершает. В противном случае есть латентность, и сообщения не будут отображаться немедленно в зависимости от частоты регистрации