Как я могу использовать log4net в WF4? - PullRequest
2 голосов
/ 03 июня 2010

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

Ответы [ 2 ]

3 голосов
/ 25 июля 2010

Создайте расширение для вашего рабочего процесса, которое ваши действия могут получить из контекста.

var wf = new WorkflowApplication(myActivity);
var log = new MyLogForNetExtensionLol();
wf.Extensions.Add(log);

затем в рамках действия:

var log = context.GetExtension<ILog>();
log.Write("Worked!");
3 голосов
/ 06 июня 2010

Выходные данные трассировки рабочего процесса записываются в прослушиватели трассировки, и, насколько мне известно, 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>
...