WedX - журнал о программировании и компьютерных науках

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

Я использую log4net, чтобы записывать сообщение журнала в файл журнала.

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

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

<log4net>
    <appender name="R1" type="log4net.Appender.RollingFileAppender">
      <file value="C:\Logs\MyService.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>
05.02.2009

Ответы:


1

По предложению Руне я реализовал базовый 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);
        }
    }
}
05.02.2009
  • +1 за ответ выше. Я был бы осторожен, если log4net также настроен для записи в TraceAppender. Я на самом деле не тестировал это, но вы можете оказаться в ситуации, когда Trace записывает в log4net, а log4net записывает в Trace, что приводит к бесконечному циклу. Например, учитывая приведенный выше пример, вы могли бы смягчить это, не включив TraceAppender в приложения для регистратора 'System.Diagnostics.Redirection'. 21.04.2011
  • Поскольку это прослушиватель трассировки, вы должны реализовать блоки try / catch в методах записи, чтобы гарантировать, что попытка записи никогда не приведет к сбою узла. Я отправил правки кода, которые исправляют конструкцию объекта и делают код более читабельным и менее вероятным. 24.01.2012
  • @JYL Вот обновленная ссылка на это сообщение в блоге. Однако похоже, что некоторые вещи могли потеряться во время переезда. XML-код в этом сообщении теперь неверен, и ссылка на Log4netTraceListener не работает. Надеюсь, автор воскресит код. 02.01.2014
  • Есть ли встроенный прослушиватель в log4net, который может прослушивать событие трассировки? 04.06.2015
  • Взгляните на исходный код класса log4net.Util.LogLog. По умолчанию это регистрируется в Trace, и @Jimit в основном прав - вы окажетесь в тупике, если произойдет ошибка приложения. В вашей реализации TraceListener я бы обязательно установил log4net.Util.LogLog.EmitInternalMessages = false в конструкторе вашей реализации и, возможно, обработал бы событие LogLog.LogReceived и зарегистрировал эти сообщения другим способом. Печально то, что некоторые ошибки приложения не будут регистрироваться из-за этого параметра. Источник - ваш друг здесь. 19.08.2015
  • @Jimit: в своем комментарии вы описываете мою проблему в связанном вопросе stackoverflow.com/questions/63242160/ Но, к сожалению, я не понимаю вашего предложения: ... вы могли бы смягчить это, не включив TraceAppender в приложения для Logger 'System.Diagnostics.Redirection '. 04.08.2020

  • 2

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

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

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

    05.02.2009

    3

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

    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 по-прежнему будет создавать проблемы, описанные в комментариях выше.

    08.06.2016

    4

    Спасибо,

    Я пошел с немного похудевшим ответом Дирка.

    public class Log4netTraceListener : System.Diagnostics.TraceListener
    {
        private readonly log4net.ILog _log;
    
        public Log4netTraceListener()
            : this(log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType))
        {
    
        }
    
        public Log4netTraceListener(log4net.ILog log)
        {
            _log = log;
        }
    
        public override void Write(string message) => _log?.Debug(message);
    
        public override void WriteLine(string message) => _log?.Debug(message);
    }
    
    03.02.2019
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]