Wie erhalte ich eine Hilfsmethode in einer Dienstprogrammklasse, um den Logger ihrer Aufrufer in log4net zu verwenden?

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

  •  04-07-2019
  •  | 
  •  

Frage

Ich habe eine ausführbare Datei, die je nach bereitgestelltem Befehlszeilenschalter etwa so aussieht:

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
                }



            }
        }
    }
}

ZusammenfassungDiskSpaceReporter.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
        }
    }
}

DetailliertDiskSpaceReporter.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
        }
    }
}

In meiner log4net-Konfiguration habe ich zwei separate Logger, jeweils einen für den SummaryDiskSpaceReporter und den DetailDiskSpaceReporter, da ihre Protokollierungsanforderungen unterschiedlich sind:

<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>

Sowohl „SummaryDiskSpaceReporter“ als auch „DetailedDiskSpaceReporter“ rufen eine Hilfsmethode in einer Klasse namens „Helper“ auf.Ich möchte etwas Protokollierung in die Methoden der Hilfsklasse integrieren.

Die Frage ist also: Wie bringe ich die Methode Helpers.CreateMessage() dazu, denselben Logger wie ihr Aufrufer zu verwenden?

d.h.

SummaryDiSkSpacereporter.run () -> Verwenden Sie diskSpacePerporting.summaryDiskSpaceReporter Logger detailledDiSkSpacereporter.run () -> diskSpacereporting.detailedDikspacereporter -Logger.

Prost Kev

War es hilfreich?

Lösung

Ich spiele schon seit geraumer Zeit mit dieser Frage und muss leider für eine Weile aufgeben und mich wieder der „richtigen“ Arbeit widmen.Im Moment ist mir folgendes eingefallen:

Optionen 1: Geben Sie den Logger weiter

Dies ist keine gute Option, sollte aber gut funktionieren, wenn es Ihnen nichts ausmacht, Ihren Helfer an einen Logger zu koppeln.Erlauben Sie Ihrer CreateMessage-Methode einfach, ein IEventIDLog zu übernehmen.Sie können dies dann verwenden, um sich im korrekten übergebenen Logger zu protokollieren.

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

Nicht gerade glänzend, aber es sollte funktionieren!

Optionen 2: Verwenden Sie den Aufrufstapel

Nutzen Sie den Aufrufstapel, um den aufrufenden Code zu finden und daraus den Typ zu finden und den gewünschten Logger von diesem Typ zu erhalten

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
}

Immer noch nicht glänzend, da wir den Aufrufstapel berühren müssen und was passiert, wenn der aufrufende Code keinen Logger hat.

Option 3: Verwenden Sie log4net

Dies ist die Option, die wir nutzen wollen, zum Teufel ist es das, was die Frage als Antwort haben möchte. aber ich habe es noch nicht herausgefunden noch.:) Beim Durchsuchen von log4net finden wir coole Dinge wie die Hierarchy-Klasse, die es uns ermöglicht, den Root-Logger zu erhalten.

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

Ich bin mir also sicher, dass es eine Möglichkeit gibt, den Logger eine Ebene höher als die CreateMessage-Methode zu bringen, jetzt nur noch, um ihn zu finden.:) :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top