我创建了一个简单的 WF4 控制台应用程序,并将 log4net 设置为与我的其他应用程序相同。但是,当我启动控制台并使用ILog
WF4 中的对象(我实际上将它传递到工作流中)时,使用我的ColoredConsoleAppender
. 我究竟做错了什么?
问问题
2000 次
2 回答
3
工作流跟踪输出被写入跟踪侦听器,据我所知,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>
于 2010-06-06T09:40:22.880 回答
3
为您的活动可以从上下文中获取的工作流创建一个扩展。
var wf = new WorkflowApplication(myActivity);
var log = new MyLogForNetExtensionLol();
wf.Extensions.Add(log);
然后,在活动中:
var log = context.GetExtension<ILog>();
log.Write("Worked!");
于 2010-07-25T19:26:56.213 回答