Como faço para obter um método auxiliar em uma classe de utilitário para usar o logger de chamadores no log4net?
Pergunta
Eu tenho um executável que, dependendo do interruptor de linha de comando fornecido, parece algo como:
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
}
}
}
DetalhadoDiskspaceRoporter.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
}
}
}
Ajudantes.cs
namespace DiskSpaceReporting
{
public class Helpers
{
private static IEventIDLog log = ???
public static string CreateMessage(Guid messageID)
{
log.Info(9876, "Starting");
//...do work
}
}
}
Na minha configuração log4Net, tenho dois madeireiros separados, um para cada um dos sumáriosdiskspaceRoporter e detalhadodiskspacereporter porque seus requisitos de registro são diferentes:
<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>
SummaryDiskSpaceRoporter e DetalheDedDiskSpaceRoporter chamam um método auxiliar em uma classe chamada ajudante. Eu quero colocar alguns registros nos métodos da classe auxiliar.
Então ... a questão é: como obtenho os ajudantes.createmessage () Método para usar o mesmo logger que seu chamador?
ou seja
SummaryDiskspaceRoporter.run () -> Use Diskspacereporting.summaryDiskspaceRoporter Logger detalhadaDedDiskspaceRoporter.run () -> Use DisksPaceReporting.DetailedDiskSpaceRoporter Logger.
Saúde Kev
Solução
Estou brincando com essa pergunta há algum tempo e, infelizmente, tenho que desistir por um tempo e voltar a fazer um trabalho "real". No momento, o que eu inventei é o seguinte:
Opções 1: Passe o madeireiro em
Esta não é uma ótima opção, mas deve funcionar bem se você não se importar em acoplar o seu ajudante a um madeireiro. Basta permitir que seu método CreateMessage tome um iEventIdLog. Você pode usá -lo para fazer login no correto passado no logger.
public static string CreateMessage(Guid messageID, IEventIDLog log)
{
log.Info(9876, "Starting");
//...do work
}
Não é exatamente brilhante, mas deve funcionar!
Opções 2: Use a pilha de chamadas
Utilize a pilha de chamadas para encontrar o código de chamada e, a partir disso
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
}
Ainda não é brilhante, pois precisamos tocar a pilha de chamadas e o que acontece se o código de chamada não tiver um logger.
Opção 3: Use log4net
Esta é a opção que queremos usar, inferno é o que a pergunta quer como resposta, Mas eu ainda não trabalhei ainda. :) Olhando através do log4net, encontramos coisas legais como a aula de hierarquia que nos permite obter o logger da raiz.
Logger logger1 = ((log4net.Repository.Hierarchy.Hierarchy) log4net.LogManager.GetRepository()).Root;
Portanto, tenho certeza de que existe uma maneira de obter o Logger um nível do Método CreateMessage, agora apenas para encontrá -lo. :)