2

J'ai créé une application de console WF4 simple et configuré log4net de manière identique à mes autres applications. Cependant, lorsque je lance la console et que j'utilise l'objet ILog à l'intérieur de WF4 (je le passe dans le flux de travail), aucune information n'est présentée en utilisant mon ColoredConsoleAppender. Qu'est-ce que je fais mal?Comment utiliser log4net dans WF4?

+0

Avez-vous une application .Net 4 qui fonctionne avec log4net? Sur la base de certaines questions ici, vous pourriez penser qu'il pourrait y avoir des problèmes avec .Net 4 en général ... –

+2

Oui, j'ai plusieurs applications .Net 4 (par exemple, les services Windows) qui utilisent bien log4net. –

Répondre

3

La sortie de trace de workflow est écrite sur les écouteurs de suivi et, autant que je sache, log4net ne consigne pas la sortie écrite par défaut dans un écouteur de trace. Je ne suis pas un expert sur log4net donc il pourrait y avoir un moyen plus simple, mais la création d'un TraceListener qui passe juste toutes les données sur log4net n'est pas difficile, le code suivant a très bien fonctionné dans un test rapide.

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); 
    } 

Ensuite, vous devez vous assurer que les informations de suivi de l'activité est envoyée à ce TraceListener en utilisant le code suivant en vous app.config.

<system.diagnostics> 
    <sources> 
    <source name="System.Activities" 
      switchValue="Verbose"> 
     <listeners> 
     <add name="Test" 
       type="WorkflowConsoleApplication17.Log4netTraceListener, WorkflowConsoleApplication17"/> 
     </listeners> 
    </source> 
    </sources> 
</system.diagnostics> 
+0

Merci pour ça! Mais le problème auquel je suis confronté est que j'utilise un droit 'ILog' dans le flux de travail et que la sortie n'apparaît pas dans ma console. –

+0

Si vous chargez votre enregistreur dans un workflow, vous devez spécifier l'assembly à utiliser. Quelque chose comme: log4net.LogManager.GetLogger (System.Reflection.Assembly.GetEntryAssembly(), "System.Activities"). Si vous spécifiez seulement un nom, il essaiera de charger la configuration d'un assemblage dynamique et ne trouvera rien. – Maurice

3

Create an Extension pour votre flux de travail que vos activités peuvent obtenir à partir du contexte.

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

puis, au sein de l'activité:

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