我该如何接管在log4net中写入异常

时间:2019-05-07 15:30:47

标签: log4net ikvm

我们有一个大型Java应用程序,可以使用IKVM转换为.NET。其中的所有log4j调用都调用我们创建的log4j包装器,该包装器调用log4net。通常情况下,效果很好。

但是我们有一个问题-日志记录没有给出堆栈跟踪或InnerException。我相信问题是.NET Exception.ToString()提供了所有这些信息,而Java Throwable.toString()本质上就是Exception.Message。

因此,在log4net调用Exception.ToString()的地方,我需要将其替换为继承自java.lang.Throwable的任何异常以创建字符串。我该怎么办?

1 个答案:

答案 0 :(得分:1)

在调用Exception.ToString()之前,Log4net会检查是否已为Exception 注册了自定义IObjectRenderer(对于任何其他类型也是如此)

为了获得自定义Exception的输出,您需要创建并注册自定义IObjectRenderer

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

namespace PFX
{
    public class MyExceptionRenderer : IObjectRenderer
    {
        public void RenderObject(RendererMap rendererMap, object obj, TextWriter writer)
        {
            Exception exception = obj as Exception;
            // Format the error message as pleased here.
            String error = exception.ToString().ToUpper();
            writer.Write(error);
        }
    }
}

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

<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>

下面的代码

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
相关问题