2

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

程序.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
                }



            }
        }
    }
}

摘要DiskSpaceReporter.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
        }
    }
}

详细的DiskSpaceReporter.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
        }
    }
}

助手.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() 方法使用与其调用者相同的记录器?

IE

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

干杯凯夫

4

1 回答 1

2

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

选项 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 方法上一层楼,现在只是为了找到它。:)

于 2008-10-23T06:41:43.253 回答