【问题标题】:How do I get a helper method in a utility class to use its callers logger in log4net?如何在实用程序类中获取辅助方法以在 log4net 中使用其调用者记录器?
【发布时间】:2008-10-23 04:48:10
【问题描述】:

我有一个可执行文件,根据提供的命令行开关,它看起来像:

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

在我的 log4net 配置中,我有两个单独的记录器,每个记录器用于 SummaryDiskSpaceReporter 和DetailedDiskSpaceReporter,因为它们的记录要求不同:

<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 和DetailedDiskSpaceReporter 都调用Helpers 类中的帮助器方法。我想在辅助类方法中加入一些日志记录。

所以...问题是,如何让 Helpers.CreateMessage() 方法使用与其调用者相同的记录器?

SummaryDiskSpaceReporter.Run() -> 使用 DiskSpaceReporting.SummaryDiskSpaceReporter 记录器DetailedDiskSpaceReporter.Run() -> 使用 DiskSpaceReporting.DetailedDiskSpaceReporter 记录器。

干杯 凯夫

【问题讨论】:

    标签: logging log4net


    【解决方案1】:

    我一直在玩这个问题很长一段时间,不幸的是不得不放弃一段时间并重新开始做“真正的”工作。目前我想出的如下:

    选项 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,我们发现了一些很酷的东西,比如允许我们获取根记录器的 Hierarchy 类。

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

    所以我确信有一种方法可以让记录器比 CreateMessage 方法更上一层楼,现在只是为了找到它。 :)

    【讨论】:

    • 嘿,感谢您的回复....我考虑过选项 1 和 2,但必须有办法让 log4net 像以前一样免费这样做。
    猜你喜欢
    • 2020-04-16
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多