进行更改后,AdonetAppender停止工作
-
02-10-2019 - |
题
我正在使用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 World的新手,我对此一无所知。
如果我的代码是
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
S和它们的工作正常,无论我更改了消息,还是添加了其他一些消息。当我更改消息或添加更多消息时,是DB让我头痛。
解决方案 2
哦,最后,它运行良好...我在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
}
}
在我删除问题后,问题解决了。
其他提示
首先:将缓冲区大小更改为1,而不是0。
第二:如果第一个日志消息正常,则配置文件很好。它可能是您的其余代码中,向我们展示更多。
如果很复杂,请使用一两个非常简单的功能进行测试,然后让我们知道会发生什么。
编辑要添加
好吧,我看到了您的代码,现在我看到了 HexPatternConverter
被用于格式化一列:因此,那里可能出现问题,例如抛出例外。我建议您尝试在不使用该类的情况下运行此操作(只需将线程列作为普通字符串),看看是否会更改任何内容。
另外,以防万一您不知道:如果log4net遇到了SQL问题,它将默默失败。在这种情况下,这似乎不太可能,因为它至少写了几张记录,但仍然如此。
编辑要添加
更改配置文件时,IIS会重新加载整个应用程序,因此也许您已经用完了资源。你有 其他 数据库活动?它也停止吗?您是否有可能打开DB连接并忘记关闭它们?这将导致数据库活动失败,直到应用重新启动为止。
编辑要添加
配置文件中的ConnectionsTring没有打开连接,它只是您的程序(或在这种情况下为Log4net)所知道的一个位置。如果您除了log4net外没有进行任何数据库活动,那么这可能不是连接问题。
接下来要尝试:Log4net是否有文本文件Appender有这个问题?