Как я могу взять на себя запись исключения в log4net - PullRequest
0 голосов
/ 07 мая 2019

У нас есть большое Java-приложение, которое мы конвертируем в .NET с помощью IKVM. Все вызовы log4j в нем вызывают созданную нами оболочку log4j, которая вызывает log4net. В основном это прекрасно работает.

Но у нас есть одна проблема - регистрация не дает трассировки стека или InnerException (s). Я полагаю, что проблема в том, что .NET Exception.ToString () предоставляет всю эту информацию, в то время как Java Throwable.toString () в основном представляет собой Exception.Message.

Так что, когда log4net вызывает Exception.ToString (), мне нужно заменить его для любого исключения, которое наследуется от java.lang.Throwable для создания строки. Как я могу это сделать?

1 Ответ

1 голос
/ 08 мая 2019

Перед вызовом Exception.ToString(), Log4net проверяет, зарегистрирован ли пользовательский IObjectRenderer для Exception (как и для любого другого типа) .

Чтобы получить пользовательский вывод 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
...