【问题标题】:catching log4net exceptions捕获 log4net 异常
【发布时间】:2012-01-23 17:21:41
【问题描述】:

我需要捕获 log4net 异常(它自己的异常不是它记录的应用程序异常)。我希望有办法这样做:

Try
    _logger.Info(response)
Catch ex As Exception
    Excepciones.HandleException(ex, "PolicyCore")
End Try

我已经实现了这段代码,编译中没有错误,但我强制 log4net 出现错误(指向配置文件中不存在的数据库)并且没有任何内容被抛出。
我已经尝试过监听器方法:

 <appSettings>
        <add key="log4net.Internal.Debug" value="true" />
    </appSettings>
    <system.diagnostics>
       <trace autoflush="true" indentsize="4" >
         <listeners>
           <add name="textWriterTraceListener" 
               type="System.Diagnostics.TextWriterTraceListener"
               initializeData="C:\\temp\\log4net.txt" />
           <remove name="Default" />
         </listeners>
       </trace>
    </system.diagnostics>

它正在将错误写入 log4net.txt,我的意思是强制的。

最后一种方法有几个缺点:它不会将每个错误都附加到文件中,如果错误相同则不会写入它,我无法让侦听器将每个错误都写入该文件,只有一个(我不知道如何完全配置跟踪侦听器,可能是这样)。因此,它不会将日期和时间附加到对我来说是必需品的每一行。最后我不能给它结构(xml)。

即使监听器工作我需要使用 try/catch 方法,因为我正在使用 Enterprise 库中的 ExceptionHandling 来记录我的应用程序中的错误。

任何遇到过问题和/或有解决方案的人?

【问题讨论】:

    标签: vb.net exception-handling log4net enterprise-library tracelistener


    【解决方案1】:

    Log4net 旨在不抛出任何异常。这似乎是一个好主意,因为如果您的应用程序因为无法记录而失败,那确实会非常糟糕。因此,如果您需要记录某些消息并且需要确保这有效,那么您不应该使用日志框架,而是将其作为“业务逻辑”的一部分来实现。

    您提到异常只记录一次。我认为这不是真的:Log4net 通常会禁用不起作用的附加程序,因此只有一个例外。例如,可以将 AdoNetAppender 配置为数据库的 re-connect,以防发生故障,在这种情况下您会多次看到相同的异常。

    【讨论】:

    • 我不知道 log4net 禁用的附加程序不起作用。这就是为什么我看不到该附加程序的一个以上错误的原因。我正在尝试这种方法,因为我们正在实施的应用程序可能用作合法密钥,因此它需要记录所有内容,包括 log4net 错误,以防应用程序失败。将跟踪中的错误保存到企业库异常处理中似乎非常复杂。我将按原样使用它:一个日志框架。 BL 将处理所有必要的逻辑。非常感谢。
    • @Stefan "Log4net 被设计成不会抛出任何异常" 那么如果日志记录失败我们如何找到失败的原因呢?
    • 可以开启“内部调试”。您可以在 log4net 常见问题解答中找到相关信息:logging.apache.org/log4net/release/faq.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2010-09-28
    • 2017-08-18
    • 2014-12-10
    • 2018-03-01
    相关资源
    最近更新 更多