如何在log4net中编写异常

如何在log4net中编写异常,log4net,ikvm,Log4net,Ikvm,我们有一个大型Java应用程序,我们使用IKVM将其转换为.NET。其中的所有log4j调用都调用了我们创建的一个log4j包装器,该包装器调用log4net。大多数情况下,它工作得很好 但是我们有一个问题——日志记录没有给出堆栈跟踪或内部异常。我认为问题在于.NET Exception.ToString提供了所有这些信息,而Java Throwable.ToString基本上就是Exception.Message 因此,在log4net调用Exception.ToString的地方,我需要将其

我们有一个大型Java应用程序,我们使用IKVM将其转换为.NET。其中的所有log4j调用都调用了我们创建的一个log4j包装器,该包装器调用log4net。大多数情况下,它工作得很好

但是我们有一个问题——日志记录没有给出堆栈跟踪或内部异常。我认为问题在于.NET Exception.ToString提供了所有这些信息,而Java Throwable.ToString基本上就是Exception.Message

因此,在log4net调用Exception.ToString的地方,我需要将其替换为从java.lang.Throwable继承的任何异常,以创建字符串。如何执行此操作?

在调用Exception.ToString之前,Log4net会查看是否已为异常注册了自定义项,就像它为任何其他类型注册一样

为了获得自定义异常输出,需要创建并注册自定义IObjectRenderer

下面的一个将以大写形式输出异常。 您可以自由构建传递给writer.Write的任何错误消息字符串表示形式

在Log4net配置中注册MyExceptionRenderer,如下所示

<log4net>
    <appender name="consoleAppender" type="log4net.Appender.ConsoleAppender" >        
        <layout type="log4net.Layout.PatternLayout">            
            <conversionPattern value="%date | %logger | %level | %message | %exception%n" />
        </layout>
    </appender>
    <root>
        <level value="All" />        
        <appender-ref ref="consoleAppender" />
    </root>

    <renderer renderingClass="PFX.MyExceptionRenderer"
              renderedClass="System.Exception" />
</log4net>
将具有以下日志输出。 请注意,例外情况是完全大写的

2019-05-08 21:52:22,855 | AppLog | ERROR | An error occured. | SYSTEM.APPLICATIONEXCEPTION: OOOPS

此方法是否比中添加PatternLayoutConverter更好/更差/相同?我正在试图理解每一个都是如何工作的。@DavidThielen简而言之,IObjectRenderer确保对象的输出始终符合预期,在调用logger.DebugObject消息传入异常实例时也是如此,而对于PatternLayoutConverter,这仅在使用包含配置标记的PatternLayout时有效,如示例%throwable中所示。
var logger = LogManager.GetLogger("AppLog");
var exception = new ApplicationException("Ooops");
logger.Error("An error occured.", exception);
2019-05-08 21:52:22,855 | AppLog | ERROR | An error occured. | SYSTEM.APPLICATIONEXCEPTION: OOOPS