Como faço para obter um método auxiliar em uma classe de utilitário para usar o logger de chamadores no log4net?

StackOverflow https://stackoverflow.com/questions/228578

  •  04-07-2019
  •  | 
  •  

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

Foi útil?

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. :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top