유틸리티 클래스에서 헬퍼 메소드를 얻으려면 Log4Net에서 호출자 로거를 사용하려면 어떻게해야합니까?
문제
제공된 명령 줄 스위치에 따라 다음과 같은 것 같습니다.
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 메소드에서 로거를 한 레벨을 올릴 수있는 방법이 있다고 확신합니다. :)