AdoNetAppender перестает работать после внесения изменений - PullRequest
1 голос
/ 07 июля 2010

Я использую log4net и настроил свой XML-файл для входа в базу данных с помощью AdoNetAppender, и, кажется, все работает правильно, когда я создаю приложение и все настраиваю.И я могу успешно войти в базу данных.Но когда я изменяю сообщение в своем коде, оно перестает регистрироваться в базе данных.

Вот моя конфигурация:

<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
  <bufferSize value="0" />
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <connectionString value="Server=USER-PC;Integrated Security=SSPI;Initial Catalog=mydb;Trusted_Connection=true;"/>
  <commandText value="INSERT INTO Log1 ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
  <parameter>
    <parameterName value="@log_date"/>
    <dbType value="DateTime"/>
    <layout type="log4net.Layout.RawTimeStampLayout"/>
  </parameter>
  <parameter>
    <parameterName value="@thread"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
      <converter>
        <name value="hex_thread" />
        <type value="MyWebApplication.HexPatternConverter" />
      </converter>
      <conversionPattern value="%hex_thread" />
    </layout>
    </parameter>
  <parameter>
    <parameterName value="@log_level"/>
    <dbType value="String"/>
    <size value="50"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%level"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@logger"/>
    <dbType value="String"/>
    <size value="255"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%logger"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message"/>
    <dbType value="String"/>
    <size value="4000"/>
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message"/>
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@exception"/>
    <dbType value="String"/>
    <size value="2000"/>
    <layout type="log4net.Layout.ExceptionLayout"/>
  </parameter>
</appender>

Я нашел его в Интернете и сделал небольшую модификацию, чтобы соответствовать моему приложению,Я думаю, что это может быть потому, что мы вставляем в таблицу Log1 до получения параметров. МОЖЕТ, я действительно не знаю, потому что я новичок в мире XML, и я очень мало знаю об этом.

Если мой код

 private static readonly ILog dblog = LogManager.GetLogger("ADONetAppender");
 dblog.Info("logging to db");

, он работает в первый раз, а затем я изменяю сообщение следующим образом

dblog.Info("I AM LOGGING TO DB"); 
dblog.Info("me again");

, оно не будет работать вообще, мойс файловыми приложениями все в порядке, они могут принять изменение сообщения, но мой AdoNetAppender отказывается от этого.Почему это происходит?

Отредактировано, чтобы добавить:

Мои функции очень просты У меня есть этот класс для ведения журнала:

using System; 
using System.Collections.Generic; 
using System.Linq; using System.Web;using log4net; 
using log4net.Config; using log4net.Core;
using log4net.Layout; using System.Text; 
using System.IO; 
using log4net.Layout.Pattern; 

namespace myWebApplication 
{

public sealed class HexPatternConverter : PatternLayoutConverter
{
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
    {
        long id;
        if (long.TryParse(loggingEvent.ThreadName, out id))
        {
            writer.Write(id.ToString("X"));
        }
        else
        {
            writer.Write(loggingEvent.ThreadName);
        }
    }
}

public class myClass
{
    private static readonly ILog secondlog = LogManager.GetLogger("methodB");
    private static readonly ILog thirdlog = LogManager.GetLogger("methodC");
    private static readonly ILog fourthlog = LogManager.GetLogger("methodD");
    private static readonly ILog fifthlog = LogManager.GetLogger("ADONetAppender");

    public static int methodA()
    {
        int a = 0;
        return a;
    }
    public static void methodB()
    {
        methodA();
        secondlog.Info("inside method B");
    }
    public static void methodC()
    {
        methodB();
        thirdlog.Info("inside method C");
    }

    public static void methodD()
    {
        methodC();
        fourthlog.Info("inside D");
        fifthlog.Info("this is db log");
        fifthlog.Info("this is me logging to the db");
    }
}

}

Журналы файлов в порядке, когда я делаю изменения, но мой журнал БД не записывается в базу данных, потому что, когда я пытаюсь извлечь данные из моей таблицы, изменений нет.Я не уверен, что я делаю неправильно.

Моя конфигурация логгера

<logger name="ADONetAppender">
<appender-ref ref="ADONetAppender"/>
</logger>
<logger name="methodB">
  <appender-ref ref="methodB"/>
</logger>
<logger name="methodC">
  <appender-ref ref="methodC"/>
</logger>
<logger name="methodD">
  <appender-ref ref="methodD"/>
</logger>
<root>     
</root>

Последние три - RollingFileAppender с, и они работают идеально, я меняю сообщение или добавляю несколькодругие сообщения.Это БД, которая вызывает у меня головную боль, когда я меняю сообщение или добавляю еще несколько сообщений в журнал.

Ответы [ 2 ]

0 голосов
/ 07 июля 2010

OOH, наконец, это сработало хорошо ... Есть некоторый код, который я включил в мой global.asax, которого не должно быть там, я верю.Я просто попытался восстановить код, и он работал хорошо.Теперь его мгновенно писать независимо от того, сколько изменений я делаю.

Вот код, я понятия не имею, что он делает, но я только что нашел его в Интернете.В моем случае это было не нужно

 log4net.Repository.Hierarchy.Hierarchy hier = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;

        if (hier != null)
        {
            //get ADONetAppender
            log4net.Appender.AdoNetAppender adoAppender =
              (log4net.Appender.AdoNetAppender)hier.GetLogger("ADONetAppender",
                hier.LoggerFactory).GetAppender("ADONetAppender");
            if (adoAppender != null)
            {
                adoAppender.ConnectionString =
                  System.Configuration.ConfigurationSettings.AppSettings["MyConnectionString"];
                adoAppender.ActivateOptions(); //refresh settings of appender
            }

        }

И после того, как я его убрал Проблема решена.

0 голосов
/ 07 июля 2010

Сначала: измените размер буфера на 1, а не на 0.

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

Если это сложно, протестируйте с очень простой функцией или двумя, затем сообщите нам, что происходит.

Отредактировано для добавления

Хорошо, я вижу ваш код, и теперь я вижу, что HexPatternConverter используется для форматирования одного столбца: поэтому, возможно, что-то идет не так, как, например, создание исключения. Я предлагаю вам попробовать запустить его без использования этого класса (просто записав столбец Thread в виде простой строки) и посмотреть, изменит ли это что-либо.

Кроме того, на тот случай, если вы не знали: если log4net столкнется с проблемой SQL, он молча завершится неудачей. Это кажется маловероятным в этом случае, потому что он пишет хотя бы пару записей, но все же.

Отредактировано для добавления

При изменении файла конфигурации IIS перезагружает все приложение, поэтому, возможно, у вас заканчиваются ресурсы. У вас есть другие базы данных? Это тоже останавливается? Возможно ли, что вы открываете соединения БД и забываете их закрыть? Это приведет к сбою в работе базы данных до перезапуска приложения.

Отредактировано для добавления

ConnectionString в файле конфигурации не открывает соединения, это просто место, которое ваша программа (или в данном случае log4net) знает, чтобы искать. Если вы не выполняете никаких действий с БД, кроме log4net, то, вероятно, это не проблема подключения.

Следующая вещь, которую стоит попробовать: есть ли у log4net эта проблема с текстовым файлом Appender?

...