Ответ 1
<bufferSize value="100" />
Говорят, что он сохранит 100 журналов в памяти до, записанных в БД. Может быть, почему вы ничего не видите в БД?
У меня есть настройка log4net и настроена для вставки в таблицу sql server 2005. Моя таблица называется Log. Когда я вызываю метод log4net, он не вводит никаких данных в базу данных журнала в SQL-сервере. Я не получаю никаких ошибок из кода клиента С#. Нужно ли добавлять пользователя в таблицу журналов в 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);
}
<bufferSize value="100" />
Говорят, что он сохранит 100 журналов в памяти до, записанных в БД. Может быть, почему вы ничего не видите в БД?
У меня нет никакого понимания вашей проблемы, просто посмотрев на вашу конфигурацию, но вы можете попробовать добавить это в свои настройки приложения, чтобы узнать, может ли log4net сказать вам, что происходит не так:
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
Смотрите раздел под названием "Как включить внутреннюю отладку log4net?" для описания того, как записывать внутреннее ведение журнала log4net.
У меня была та же проблема. В моем случае мне пришлось удалить использование вставки [Исключение] и @exception.
Итак, мне пришлось изменить свой журнал. Мне в основном пришлось создать хороший дамп моего исключения и передать его в параметр сообщения.
Я надеюсь, что это поможет
Если вы специально не установили пользователя в строке подключения, Log4Net попытается выполнить регистрацию с любой учетной записью пользователя, связанной с процессом (рабочий процесс ASP.NET, если это так). Log4Net также не будет генерировать исключения, если вы не можете выполнить запись. Вы можете включить отладку, чтобы узнать, в чем проблема.