如何在WF4中使用log4net?

如何在WF4中使用log4net?,log4net,workflow-foundation,workflow-foundation-4,consoleappender,Log4net,Workflow Foundation,Workflow Foundation 4,Consoleappender,我创建了一个简单的WF4控制台应用程序,并与我的其他应用程序一样设置了log4net。但是,当我启动控制台并使用WF4中的ILog对象时(我实际上将其传递到工作流中),使用我的彩色控制台pender不会显示任何信息。我做错了什么?工作流跟踪输出被写入跟踪侦听器,据我所知,默认情况下log4net不会记录写入跟踪侦听器的输出。我不是log4net方面的专家,所以可能有一种更简单的方法,但是创建一个TraceListener将所有数据传递给log4net并不难,下面的代码在快速测试中运行良好 pub

我创建了一个简单的WF4控制台应用程序,并与我的其他应用程序一样设置了log4net。但是,当我启动控制台并使用WF4中的
ILog
对象时(我实际上将其传递到工作流中),使用我的
彩色控制台pender
不会显示任何信息。我做错了什么?

工作流跟踪输出被写入跟踪侦听器,据我所知,默认情况下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);
    }
接下来,您需要确保使用app.config中的以下代码将活动跟踪信息发送到此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!");
var log=context.GetExtension();
log.Write(“工作!”);

您是否有可与log4net配合使用的.Net 4应用程序?基于这里的一些问题,您可能会认为.Net 4总体上可能存在问题…是的,我有多个使用log4net的.Net 4应用程序(例如windows服务)。谢谢!但我面临的问题是,我在工作流中使用了一个
ILog
,而输出没有显示在我的控制台中。如果在工作流中加载记录器,则需要指定要使用的程序集。类似于:log4net.LogManager.GetLogger(System.Reflection.Assembly.GetEntryAssembly(),“System.Activities”)。如果只指定名称,它将尝试加载动态程序集的配置,但找不到任何内容。