Comment obtenir une méthode d'assistance dans une classe d'utilitaires pour utiliser son consignateur d'appels dans log4net?

StackOverflow https://stackoverflow.com/questions/228578

  •  04-07-2019
  •  | 
  •  

Question

J'ai un exécutable qui, selon le commutateur de ligne de commande fourni, ressemble à quelque chose comme:

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 configuration log4net, j'ai deux enregistreurs distincts, un pour chaque SummaryDiskSpaceReporter et DetailedDiskSpaceReporter car leurs exigences de journalisation 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 tous deux une méthode d'assistance dans une classe appelée Helpers. Je veux mettre un peu de connexion dans les méthodes de classe helper.

Alors ... la question est de savoir comment faire en sorte que la méthode Helpers.CreateMessage () utilise le même enregistreur que son appelant?

i.e.

  

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

A bientôt Kev

Était-ce utile?

La solution

Je joue avec cette question depuis un certain temps et je dois malheureusement abandonner un moment pour revenir à la tâche "réelle". travail. Pour le moment, voici ce que je propose:

Options 1: transmettez l'enregistreur à

Ce n'est pas une bonne option, mais devrait bien fonctionner si vous ne voulez pas relier votre assistant à un enregistreur. Permettez simplement à votre méthode CreateMessage de prendre un IEventIDLog. Vous pouvez ensuite l'utiliser pour vous connecter au bon log passé dans le logger.

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

Pas vraiment brillant, mais ça devrait marcher!

Options 2: utiliser la pile d'appels


Servez-vous de la pile d’appels pour trouver le code d’appel, puis recherchez le type et obtenez l’enregistreur souhaité à partir 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 que se passe-t-il si le code de l'appelant n'a pas d'enregistreur.

Option 3: utiliser log4net

C’est l’option que nous voulons utiliser, mais c’est ce que la question veut comme réponse, mais je n’ai pas encore trouvé la solution pour le moment . :) En parcourant log4net, nous trouvons des choses intéressantes comme la classe Hierarchy qui nous permet d’obtenir le logger racine.

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

Donc, je suis sûr qu’il existe un moyen d’obtenir un niveau supérieur de l’enregistreur à partir de la méthode CreateMessage, il suffit maintenant de le trouver. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top