我们有一个大型Java应用程序,可以使用IKVM转换为.NET。其中的所有log4j调用都调用我们创建的log4j包装器,该包装器调用log4net。通常情况下,效果很好。
但是我们有一个问题-日志记录没有给出堆栈跟踪或InnerException。我相信问题是.NET Exception.ToString()提供了所有这些信息,而Java Throwable.toString()本质上就是Exception.Message。
因此,在log4net调用Exception.ToString()的地方,我需要将其替换为继承自java.lang.Throwable的任何异常以创建字符串。我该怎么办?
答案 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