Как я могу использовать log4net в WF4?


Я создал простое консольное приложение WF4 и настроил log4net так же, как и другие мои приложения. Однако, когда я запускаю консоль и использую Объект ILog внутри WF4 (я фактически передаю его в рабочий процесс), никакая информация не представлена с помощью моего ColoredConsoleAppender. Что я делаю не так?

2 2

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!");