Как я могу использовать log4net в WF4?
Я создал простое консольное приложение WF4 и настроил log4net так же, как и другие мои приложения. Однако, когда я запускаю консоль и использую Объект ILog
внутри WF4 (я фактически передаю его в рабочий процесс), никакая информация не представлена с помощью моего ColoredConsoleAppender
. Что я делаю не так?
2 ответа:
Выходные данные трассировки рабочего процесса записываются в прослушиватели трассировки, и, насколько мне известно, log4net не регистрирует выходные данные, записанные в прослушиватель трассировки по умолчанию. Я не эксперт по log4net, поэтому может быть более простой способ, но создать TraceListener, который просто передает все данные в log4net, не сложно, следующий код отлично работал в быстром тесте.
public class Log4netTraceListener : TraceListener { private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data) { base.TraceData(eventCache, source, eventType, id, data); } public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, object data) { var logger = LogManager.GetLogger(source); switch (eventType) { case TraceEventType.Critical: logger.Fatal(data); break; case TraceEventType.Error: logger.Error(data); break; case TraceEventType.Information: logger.Info(data); break; case TraceEventType.Verbose: logger.Debug(data); break; case TraceEventType.Warning: logger.Warn(data); break; default: base.TraceData(eventCache, source, eventType, id, data); break; } } public override void Write(string message) { _log.Info(message); } public override void WriteLine(string message) { _log.Info(message); }
Далее вам нужно убедиться, что информация о трассировке активности отправляется в этот TraceListener, используя следующий код в вас апп.конфиг.
<system.diagnostics> <sources> <source name="System.Activities" switchValue="Verbose"> <listeners> <add name="Test" type="WorkflowConsoleApplication17.Log4netTraceListener, WorkflowConsoleApplication17"/> </listeners> </source> </sources> </system.diagnostics>
Создайте расширение для рабочего процесса, которое ваши действия могут получить из контекста.
var wf = new WorkflowApplication(myActivity); var log = new MyLogForNetExtensionLol(); wf.Extensions.Add(log);
Затем, в рамках деятельности:
var log = context.GetExtension<ILog>(); log.Write("Worked!");