【问题标题】:How can I use log4net in WF4?如何在 WF4 中使用 log4net?
【发布时间】:2010-06-03 19:40:32
【问题描述】:

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

【问题讨论】:

  • 您有与 log4net 一起使用的 .Net 4 应用程序吗?根据此处的一些问题,您会认为 .Net 4 可能存在一般问题...
  • 是的,我有多个使用 log4net 的 .Net 4 应用程序(例如 Windows 服务)。

标签: log4net workflow-foundation workflow-foundation-4 consoleappender


【解决方案1】:

工作流跟踪输出被写入跟踪侦听器,据我所知,log4net 默认情况下不会记录写入跟踪侦听器的输出。我不是 log4net 方面的专家,所以可能有更简单的方法,但创建一个仅将所有数据传递到 log4net 的 TraceListener 并不难,以下代码在快速测试中运行良好。

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>

【讨论】:

  • 谢谢!但我面临的问题是我在工作流程中使用了ILog,并且输出没有出现在我的控制台中。
  • 如果您在工作流中加载记录器,您需要指定要使用的程序集。类似于:log4net.LogManager.GetLogger(System.Reflection.Assembly.GetEntryAssembly(), "System.Activities")。如果您只指定一个名称,它会尝试加载动态程序集的配置,但不会找到任何东西。
【解决方案2】:

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

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

那么,在活动中:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多