유틸리티 클래스에서 헬퍼 메소드를 얻으려면 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
        }
    }
}

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

HELBERS.CS

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

내 log4net 구성에는 로깅 요구 사항이 다르기 때문에 SummaryDiskSpaceReporter 및 세부 사항 각각의 각각에 대해 하나는 두 개의 개별 로거가 있습니다.

<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와 DetailDiskSpaceReporter는 모두 Helpers라는 클래스에서 도우미 방법을 호출합니다. 헬퍼 클래스 방법에 로그를 넣고 싶습니다.

그래서 ... 질문은 호출자와 동일한 로거를 사용하기 위해 Helpers.createmessage () 메소드를 어떻게 얻습니까?

SummaryDiskSpaceReporter.run () -> DiskSpaceReporting을 사용합니다 .SumMaryDiskSpaceReporter Logger Detail () -> DiskSpaceReporting.DetailedDiskSpaceReporter Logger 사용.

건배 kev

도움이 되었습니까?

해결책

나는이 질문을 꽤 오랫동안 가지고 놀았으며 불행히도 잠시 포기하고 "실제"작업을해야합니다. 지금 내가 생각해 낸 것은 다음과 같습니다.

옵션 1 : 로거를 전달하십시오

이것은 훌륭한 옵션은 아니지만, 도우미를 로거에 연결하는 것이 마음에 들지 않으면 잘 작동해야합니다. CreateMessage 방법이 ieventIdlog를 사용하도록 허용하십시오. 그런 다음 이것을 사용하여 로거에 전달 된 올바른 상태로 로그인 할 수 있습니다.

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

정확히 반짝이지는 않지만 작동해야합니다!

Options 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 : : 옵션 3. log4net을 사용하십시오

이것이 우리가 사용하고 싶은 옵션입니다. 지옥은 질문이 그 답으로 원하는 것입니다. 그러나 나는 아직 그것을 해결하지 못했습니다 아직. :) log4net을 통해 우리는 루트 로거를 얻을 수있는 계층 구조 클래스와 같은 멋진 것들을 찾습니다.

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

따라서 CreateMessage 메소드에서 로거를 한 레벨을 올릴 수있는 방법이 있다고 확신합니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top