Debugging 当连接字符串为';时,Log4Net XmlConfigurator.Configure()挂起;不对。Log4Net中的Bug?

Debugging 当连接字符串为';时,Log4Net XmlConfigurator.Configure()挂起;不对。Log4Net中的Bug?,debugging,log4net,log4net-configuration,Debugging,Log4net,Log4net Configuration,我花了很长时间才找到一个Log4Net配置问题,其中数据库连接字符串不正确,因为在代码中调用XmlConfigurator.Configure()时,它没有抛出异常,而是挂起了 如果我意识到它立即挂起在特定的代码行上,那么很容易快速找到它,但是我调用了一个wcf服务,该服务使用了使用log4net的行为,当然它是在开发环境中正确配置的,而不是在登台环境中,因此跟踪时间更长 它只是挂起,而不是抛出一个登录不工作的异常,这真的让我很烦恼。这是log4net中的某种错误吗?不,这不是错误,而是: lo

我花了很长时间才找到一个Log4Net配置问题,其中数据库连接字符串不正确,因为在代码中调用XmlConfigurator.Configure()时,它没有抛出异常,而是挂起了

如果我意识到它立即挂起在特定的代码行上,那么很容易快速找到它,但是我调用了一个wcf服务,该服务使用了使用log4net的行为,当然它是在开发环境中正确配置的,而不是在登台环境中,因此跟踪时间更长


它只是挂起,而不是抛出一个登录不工作的异常,这真的让我很烦恼。这是log4net中的某种错误吗?

不,这不是错误,而是:

log4net是一个尽力而为且故障停止的日志系统

通过failstop,我们的意思是log4net不会抛出意外的错误 运行时的异常可能导致应用程序崩溃。 如果出于任何原因,log4net抛出未捕获的异常,请发送 发送到log4net的电子邮件-users@lists.sourceforge.net邮件列表。 未捕获的异常被视为需要立即处理的严重错误 注意

如果要检查配置是否有效,请执行以下操作:

为了防止log4net的静默故障,log4net支持 评估是否已配置,并评估生成的消息 自1.2.11起启动时。检查log4net是否已启动,以及 如果配置正确,可以检查属性 log4net.Repository.ILoggerRepository.Configured并枚举 配置消息如下:

if(!log4net.LogManager.GetRepository().Configured)
{
//未配置log4net
foreach(日志中的log4net.Util.LogLog消息
log4net.LogManager.GetRepository()
.配置消息

.cast除非有人带来水晶球,否则您将需要提供更多信息。配置文件和用于拨打电话的代码,可能还有服务实现等。@Tim False。请参阅下面的答案。:)谢谢。+1的解释,但有些事情我还是不明白。造成死锁怎么比抛出未捕获的异常“更好”呢?至少我可以在自己的应用程序中忽略未捕获的异常,它不会打破它。但我什么都做不了(合理可行)关于死锁。在我看来,这实际上比未捕获的异常更糟糕,不是吗?我开始标记这个答案,因为它是这里唯一的一个,但我就是不能。如果“未捕获的异常被当作需要立即关注的严重错误处理”正如您所说,那么导致死锁应该被视为是一个10倍以上的严重问题。您在问题中说问题是“数据库连接字符串不正确”。这怎么会导致死锁?您是在问为什么XmlConfigurator.Configure()当连接字符串不正确时会导致死锁吗?我显然无法回答这个问题,因为我没有编写Log4Net。虽然术语“死锁”并不特定于数据库操作,但我使用这个术语的方式比我应该使用的要宽松一些。我的意思是,我的代码等待Log4Net方法返回,而它永远不会返回。我不是说n确认正在发生任何数据库操作。
if(!log4net.LogManager.GetRepository().Configured)
{
    // log4net not configured
    foreach(log4net.Util.LogLog message in 
             log4net.LogManager.GetRepository()
                    .ConfigurationMessages
                    .Cast<log4net.Util.LogLog())
    {
        // evaluate configuration message
    }
}