代码之家  ›  专栏  ›  技术社区  ›  Dmitri Nesteruk

如何在WF4中使用log4net?

  •  2
  • Dmitri Nesteruk  · 技术社区  · 15 年前

    我创建了一个简单的WF4控制台应用程序,并将log4net设置为与其他应用程序相同。但是,当我启动控制台并使用 ILog WF4中的对象(实际上我将其传递到工作流中),使用我的 ColoredConsoleAppender . 我做错什么了?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Maurice    15 年前

    工作流跟踪输出被写入跟踪侦听器,据我所知,log4net默认情况下不记录写入跟踪侦听器的输出。我不是log4net的专家,所以可能有一种更简单的方法,但是创建一个只将所有数据传递到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);
        }
    

    接下来,您需要确保使用app.config中的以下代码将活动跟踪信息发送到此跟踪侦听器。

    <system.diagnostics>
      <sources>
        <source name="System.Activities"
                switchValue="Verbose">
          <listeners>
            <add name="Test"
                  type="WorkflowConsoleApplication17.Log4netTraceListener, WorkflowConsoleApplication17"/>
          </listeners>
        </source>
      </sources>
    </system.diagnostics>
    
        2
  •  3
  •   Will    14 年前

    Create an Extension 您的活动可以从上下文中获得的工作流。

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

    然后,在活动中:

    var log = context.GetExtension<ILog>();
    log.Write("Worked!");
    
    推荐文章