Как регистрировать сообщения трассировки с помощью log4net?



Я использую log4net для регистрации записи сообщения журнала в файл скользящего журнала.



теперь я бы также перенаправил все сообщения трассировки от System.Diagnostics.Trace в этот файл журнала. Как я могу это настроить? Я попытался найти что-нибудь об этом в документации log4net, но безуспешно. Возможно ли это вообще?



причина, по которой я хочу это сделать, заключается в том, что меня интересуют сообщения трассировки сторонней библиотеки.



<log4net>
<appender name="R1" type="log4net.Appender.RollingFileAppender">
<file value="C:LogsMyService.log" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="10" />
<datePattern value="yyyyMMdd" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
</log4net>
565   3  

3 ответов:

по предложению руны я реализовал базовый TraceListener, который выводит в log4net:

public class Log4netTraceListener : System.Diagnostics.TraceListener
{
    private readonly log4net.ILog _log;

    public Log4netTraceListener()
    {
        _log = log4net.LogManager.GetLogger("System.Diagnostics.Redirection");
    }

    public Log4netTraceListener(log4net.ILog log)
    {
        _log = log;
    }

    public override void Write(string message)
    {
        if (_log != null)
        {
            _log.Debug(message);
        }
    }

    public override void WriteLine(string message)
    {
        if (_log != null)
        {
            _log.Debug(message);
        }
    }
}

Я не знаю, поддерживает ли log4net это, но вы можете реализовать свой собственный прослушиватель трассировки, который сделал это.

TraceListener не имеет слишком много метод, который должен быть реализован, и все, что вам нужно сделать, это перенаправить значения в log4net, так что это должно быть легко сделать.

добавить пользовательский прослушиватель трассировки вы должны либо изменить ваши приложения.config / web.config или вы бы добавили его в код с помощью Trace.Listeners.Add(new Log4NetTraceListener());

в соответствии с ответами выше, здесь есть реализация (эта ссылка шелушится, но я нашел исходный код):

https://code.google.com/archive/p/cavity/

чтобы грубо решить проблему (описанную в комментариях к предыдущему ответу) внутренней трассировки log4net, исходящей из класса LogLog, я проверил, что этот класс является источником трассировки, проверяя кадр стека (что уже сделала эта реализация) и игнорируя те трассировка сообщений:

    public override void WriteLine(object o, string category)
    {
        // hack to prevent log4nets own diagnostic trace getting fed back
        var method = GetTracingStackFrame(new StackTrace()).GetMethod();
        var declaringType = method.DeclaringType;
        if (declaringType == typeof(LogLog))
        {
            return;
        }
        /* rest of method writes to log4net */
    }

использование TraceAppender все равно создаст проблемы, описанные в комментариях выше.

Comments

    Ничего не найдено.