Я использую 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
с, и они работают идеально, я меняю сообщение или добавляю несколькодругие сообщения.Это БД, которая вызывает у меня головную боль, когда я меняю сообщение или добавляю еще несколько сообщений в журнал.