Как я могу использовать 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!");
Другие вопросы по тегам