Log4net не вставляется в базу данных? - PullRequest
20 голосов
/ 05 апреля 2011

Я настроил log4net и настроил его для вставки в таблицу sql server 2005.Моя таблица называется Log.Когда я вызываю метод log4net, он не вводит никаких данных в базу данных журнала на сервере sql.Я не получаю никаких ошибок из моего клиентского кода C #.Нужно ли добавлять пользователя в таблицу журнала в SQL?Сейчас я использую аутентификацию Windows.

<configSections>
  <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
 <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
   <bufferSize value="100" />
   <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
connectionString value="Data Source=V-FIN-SQL-D\SQL2005;Initial Catalog=DevMHAIC;Integrated Security=True;Connection Timeout=360" />
  <commandText value="INSERT INTO Log ([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="32" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%t" />
 </layout>
 </parameter>
   <parameter>
    <parameterName value="@log_level" />
    <dbType value="String" />
    <size value="512" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%p" />
    </layout>
  </parameter>
   <parameter>
    <parameterName value="@logger" />
    <dbType value="String" />
    <size value="512" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%c" />
    </layout>
  </parameter>
  <parameter>
    <parameterName value="@message" />
    <dbType value="String" />
    <size value="4000" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%m" />
    </layout>
  </parameter>
   <parameter>
    <parameterName value="@exception" />
    <dbType value="String" />
    <size value="2000" />
    <layout type="log4net.Layout.ExceptionLayout" />
  </parameter>
</appender>
<root>
  <level value="DEBUG" />
  <appender-ref ref="ADONetAppender" />
</root>
</log4net>

Вот мой sql-код для базы данных журналов:

CREATE TABLE [dbo].[Log](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Date] [datetime] NULL,
[Thread] [varchar](255) NULL,
[Level] [varchar](50) NULL,
[Logger] [varchar](255) NULL,
[Message] [varchar](4000) NULL,
[Exception] [varchar](2000) NULL
) ON [PRIMARY] 

Вот мой класс, который я использую для вызова log4net.

public class ErrorLog : ILog
{
    log4net.ILog _Log;

    /// <summary>
    /// Initializes a new instance of the <see cref="ErrorLog"/> class.
    /// </summary>
    /// <param name="log">The log.</param>
    public ErrorLog(log4net.ILog log) : this()
    {
        _Log = log;
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="ErrorLog"/> class.
    /// </summary>
    public ErrorLog()
    {
        _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        log4net.Config.XmlConfigurator.Configure(); 
    }

    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void informational(string message)
    {
        _Log.Info(message);
    }

    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void informational(string message, Exception innerException)
    {
        _Log.Info(message, innerException);
    }

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void debug(string message)
    {
        _Log.Debug(message);
    }

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void debug(string message, Exception innerException)
    {
        _Log.Debug(message, innerException);
    }

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void error(string message)
    {
        _Log.Error(message);
    }

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void error(string message, Exception innerException)
    {
        _Log.Error(message, innerException);
    }

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    public void warning(string message)
    {
        _Log.Warn(message);
    }

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    public void warning(string message, Exception innerException)
    {
        _Log.Warn(message, innerException);
    }
}

Вот мой интерфейс:

public interface ILog
{
    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void informational(string message);

    /// <summary>
    /// Informationals the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void informational(string message, Exception innerException);

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void debug(string message);

    /// <summary>
    /// Debugs the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void debug(string message, Exception innerException);

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void error(string message);

    /// <summary>
    /// Errors the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void error(string message, Exception innerException);

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    void warning(string message);

    /// <summary>
    /// Warnings the specified message.
    /// </summary>
    /// <param name="message">The message.</param>
    /// <param name="innerException">The innerException.</param>
    void warning(string message, Exception innerException);
}

Ответы [ 4 ]

51 голосов
/ 18 апреля 2011
<bufferSize value="100" />

Он говорит, что будет хранить 100 журналов в памяти , пока не будет записан в БД.Может быть, поэтому вы ничего не видите в БД?

10 голосов
/ 11 апреля 2011

На самом деле я не могу понять вашу проблему, просто взглянув на вашу конфигурацию, но вы можете попробовать добавить это в настройки вашего приложения, чтобы посмотреть, может ли log4net сказать вам, что происходит не так:

<appSettings>         
  <add key="log4net.Internal.Debug" value="true"/> 
</appSettings> 

См. Раздел под названием «Как включить внутреннюю отладку log4net?» для получения информации о том, как перехватить внутреннюю регистрацию log4net.

1 голос
/ 14 июня 2011

У меня была такая же проблема. В моем случае мне пришлось убрать использование [Exception] и @exception из вставки.

Итак, мне тоже пришлось сменить логирование. Мне пришлось создать хороший дамп моего исключения и передать его в параметр сообщения.

Надеюсь, это поможет

0 голосов
/ 17 апреля 2011

Если вы не указали пользователя в строке подключения, Log4Net будет пытаться войти в систему с любой учетной записью пользователя, назначенной процессу (рабочий процесс ASP.NET, если это так). Log4Net также не будет выдавать исключения, если вы не можете войти. Вы можете включить отладку, чтобы увидеть, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...