كيف يمكنني الحصول على طريقة مساعد في فئة الأدوات المساعدة لاستخدام مسجل المتصلين في log4net؟

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

  •  04-07-2019
  •  | 
  •  

سؤال

لديّ قابلة للتنفيذ تعتمد على مفتاح سطر الأوامر المرفق يبدو شيئًا مثل:

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

التفاصيل deskspacereporter.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
        }
    }
}

المساعدين

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

في تكوين log4net الخاص بي ، لديّ اثنين من سجلات تسجيلات منفصلة ، أحدهما لكل من summaryDiskSpacerePorter و DeledDisksPacerePorter لأن متطلبات التسجيل الخاصة بهم مختلفة:

<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 و DelopedDiskSpacereporter يدعون طريقة المساعد في فصل يسمى المساعدين. أريد أن أضع بعض الأشجار في أساليب فئة المساعد.

لذا ... والسؤال هو ، كيف يمكنني الحصول على مساعدين.

بمعنى آخر

SummaryDiskSpacerePorter.run () -> استخدام diskspacereporting.summarydiskspacereporter logger delieddiskspacereporter.run () -> استخدام diskspacereporting.detailedDiskSpacereporter logger.

هتاف كيف

هل كانت مفيدة؟

المحلول

لقد كنت ألعب مع هذا السؤال لبعض الوقت وللأسف يجب أن أستسلم لفترة من الوقت والعودة إلى القيام بعمل "حقيقي". في الوقت الحالي ما توصلت إليه هو كما يلي:

الخيارات 1: تمرير المسجل

هذا ليس خيارًا رائعًا ، ولكن يجب أن يعمل بشكل جيد إذا كنت لا تمانع في اقتران المساعد الخاص بك إلى مسجل. ما عليك سوى السماح طريقة CreateMessage بأخذ ieventidlog. يمكنك بعد ذلك استخدام هذا لتسجيل الدخول إلى المسجل الصحيح.

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

ليس لامعًا تمامًا ، ولكن يجب أن يعمل!

الخيارات 2: استخدم مكدس الاتصال

استفد من مكدس الاتصال للعثور على رمز الاتصال ومن هذا النوع ابحث عن النوع واحصل على المسجل الذي تريده من هذا النوع

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
}

لا يزال غير لامع لأننا بحاجة إلى لمس مكدس المكالمات وما يحدث إذا لم يكن رمز الاتصال يحتوي على مسجل.

الخيار 3: استخدام log4net

هذا هو الخيار الذي نريد استخدامه ، الجحيم هو ما يريده السؤال كإجابة ، لكنني لم أعمل بعد حتى الآن. :) النظر من خلال log4net نجد أشياء رائعة مثل فئة التسلسل الهرمي الذي يسمح لنا بالحصول على مسجل الجذر.

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

لذلك أنا متأكد من أن هناك طريقة للحصول على المسجل لأعلى مستوى من طريقة CreateMessage ، والآن فقط للعثور عليه. قون

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top