2

提供されたコマンドラインスイッチに応じて、次のような実行可能ファイルがあります。

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 のそれぞれに 1 つずつ、2 つの個別のロガーがあります。

<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 ロガーを使用します。

乾杯ケブ

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 メソッドから 1 レベル上のロガーを取得する方法があると確信しています。:)

于 2008-10-23T06:41:43.253 に答える