2008-10-23 8 views
2

J'ai un exécutable qui en fonction de la ligne de commande fourni commutateur ressemble à quelque chose comme:Comment obtenir une méthode d'assistance dans une classe d'utilitaires pour utiliser son enregistreur d'appel dans log4net?

Program.cs -

namespace DiskSpaceReporting 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if(args.Length == 1) 
      { 
       switch(args[0]) 
       { 
        case "-summarytotals": 
         SummaryDiskSpaceReporter.Run(); 
         break; 

        case "-detailed": 
         DetailedDiskSpaceReporter.Run(); 
         break; 
        //...other reporting types 
       } 



      } 
     } 
    } 
} 

SummaryDiskSpaceReporter.cs

namespace DiskSpaceReporting 
{ 
    public class SummaryDiskSpaceReporter 
    { 
     private static IEventIDLog log = EventIDLogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

     public static void Run() 
     { 
      log.Info(1234, "Starting"); 
      //...do work 
      string message = Helpers.CreateMessage(messageID); 
      //...do work 
     } 
    } 
} 

DetailedDiskSpaceReporter. cs

namespace DiskSpaceReporting 
{ 
    public class DetailedDiskSpaceReporter 
    { 
     private static IEventIDLog log = EventIDLogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

     public static void Run() 
     { 
      log.Info(1234, "Starting"); 
      //...do work 
      string message = Helpers.CreateMessage(messageID); 
      //...do work 
     } 
    } 
} 

Helpers.cs

namespace DiskSpaceReporting 
{ 
    public class Helpers 
    { 
     private static IEventIDLog log = ???    
     public static string CreateMessage(Guid messageID) 
     { 
      log.Info(9876, "Starting"); 
      //...do work 
     } 
    } 
} 

Dans ma config log4net J'ai deux enregistreurs distincts, l'un pour chacun des SummaryDiskSpaceReporter et DetailedDiskSpaceReporter parce que leurs besoins d'exploitation forestière sont différentes:

<root> 
    <level value="ALL" /> 
    <appender-ref ref="ConsoleLogAppender" /> 
    <appender-ref ref="EventLogAppender" /> 
</root> 

<logger name="DiskSpaceReporting.SummaryDiskSpaceReporter"> 
    <appender-ref ref="SummaryDiskSpaceReporterRollingFileAppender"/> 
</logger> 

<logger name="DiskSpaceReporting.DetailedDiskSpaceReporter"> 
    <appender-ref ref="DetailedDiskSpaceReporterRollingFileAppender"/> 
</logger> 

SummaryDiskSpaceReporter et DetailedDiskSpaceReporter appellent une méthode d'assistance dans une classe appelée Helpers. Je veux mettre un peu de journalisation dans les méthodes de classe d'aide. Donc, la question est, comment puis-je obtenir la méthode Helpers.CreateMessage() pour utiliser le même enregistreur que son appelant?

à-dire

SummaryDiskSpaceReporter.Run() -> utiliser DiskSpaceReporting.SummaryDiskSpaceReporter enregistreur DetailedDiskSpaceReporter.Run() -> utiliser enregistreur DiskSpaceReporting.DetailedDiskSpaceReporter .

Vive Kev

Répondre

2

Je joue avec cette question depuis un certain temps et qui ont malheureusement renoncer pendant un certain temps et revenir à faire un travail « réel ». Pour l'instant ce que je suis venu avec comme suit:

options 1: passer le bûcheron dans

Ce n'est pas une bonne option, mais devrait fonctionner correctement si vous ne me dérange pas coupler votre aide à un enregistreur. Autorisez simplement votre méthode CreateMessage à prendre un IEventIDLog. Vous pouvez ensuite l'utiliser pour vous connecter au bon enregistreur passé.

public static string CreateMessage(Guid messageID, IEventIDLog log) 
{ 
    log.Info(9876, "Starting"); 
    //...do work 
} 

Pas exactement brillant, mais il devrait fonctionner!

options 2: Utilisez la pile d'appel

Marque utilisation de la pile d'appels pour trouver le code d'appel et de ce trouver le type et obtenir l'enregistreur que vous voulez de ce type

public static string CreateMessage(Guid messageID) 
{ 
    StackFrame frame = new StackTrace().GetFrame(1); 
    IEventIDLog log = EventIDLogManager.GetLogger(frame.GetMethod().DeclaringType); 
    log.Info(9876, "Starting"); 
    //...do work 
} 

Toujours pas brillant car nous devons toucher la pile d'appels et ce qui se passe si le code appelant n'a pas de logger.

Option 3: utilisation log4net

Ceci est l'option que nous voulons utiliser, l'enfer est ce que la question veut que sa réponse, mais je l'ai pas encore travaillé dehors encore. :) En parcourant log4net, nous trouvons des choses sympas comme la classe Hierarchy qui nous permet d'obtenir le root logger.

Logger logger1 = ((log4net.Repository.Hierarchy.Hierarchy) log4net.LogManager.GetRepository()).Root; 

Je suis sûr qu'il ya un moyen d'obtenir l'enregistreur d'un niveau de méthode CreateMessage, maintenant juste pour le trouver. :)

+0

Salut merci pour la réponse .... J'ai pensé aux options 1 et 2, mais il doit y avoir un moyen d'obtenir log4net gratuitement pour ainsi dire. – Kev