Как регистрировать сообщения трассировки с помощью 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>
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