Как я могу использовать 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 с помощью следующего кода в вашем app.config.
<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!");