Pergunta

Eu escrevi uma DLL .NET, que é chamada de outro aplicativo usando o COM Interop. Eu gostaria de usar o log4net, mas preciso especificar o local do arquivo de log no tempo de execução do outro aplicativo.

Eu sempre usei o Log4Net da maneira mais simples possível para o projeto WinForms, mas como um projeto de DLL não possui um app.config, e meu aplicativo de chamada também não possui um (não é nem .NET), eu tenho Tentei ler um pouco sobre como o log4net funciona e tentou defini -lo sem usar um arquivo .config.

Eu o coloquei no estágio em que ele compila e meio que está em conformidade com o meu pequeno entendimento do log4net, mas não escreve no arquivo de log.

Aqui está o que eu tenho até agora, alguém pode apontar meus erros/equívocos flagrantes, ou então me dizer uma maneira melhor de registrar minha DLL?

    private log4net.Core.ILogger _ilogger;
    private ILog _logger;

    public void Initialize(String LogFileName)
    {
        log4net.Repository.ILoggerRepository Repo = null;
        try {
            Repo = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly().FullName);

        } catch (log4net.Core.LogException) {
            //ignore, domain not yet created
        }

        if (Repo == null) {
            Repo = log4net.LogManager.CreateRepository(Assembly.GetExecutingAssembly().FullName);

            log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();
            appender.Layout = new log4net.Layout.PatternLayout("%d - %m%n");
            appender.File = LogFileName;
            appender.MaxSizeRollBackups = 10;
            appender.MaximumFileSize = "100MB";
            appender.AppendToFile = true;
            appender.Threshold = log4net.Core.Level.Debug; //NEW: set level to Debug
            appender.ActivateOptions();

            Repo.Threshold = log4net.Core.Level.Debug; //NEW: set level to Debug

            log4net.Config.BasicConfigurator.Configure(Repo, appender);
        }

       // This doesn't seem to create the interface I need for logging
        _ilogger = Repo.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);

       // This doesn't seem to write to the log file for some reason.
        _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
        _logger.Debug("Application started");
    }

Obrigado!

Foi útil?

Solução

Editar- atualização. Releia a pergunta. Parece que você só precisa chame a versão sobrecarregada deste (Passando em detalhes de um arquivo de configuração)- você basicamente deseja configurar o log de dentro da DLL?

Brincando, eu no Google Log4com e Encontrei isso. Eu não usei, mas pode valer a pena dar uma olhada!

Outras dicas

Eu acho que a resposta era que não precisava do novo repositório. Eu estava apenas tornando a situação muito complicada. Esta versão dizimada parece funcionar bem:

public void Initialize(String LogFileName)
    {
        log4net.Appender.RollingFileAppender appender = new log4net.Appender.RollingFileAppender();
        appender.Layout = new log4net.Layout.PatternLayout("%d - %m%n");
        appender.File = LogFileName;
        appender.MaxSizeRollBackups = 10;
        appender.MaximumFileSize = "100MB";
        appender.AppendToFile = true;
        appender.Threshold = log4net.Core.Level.Debug;
        appender.ActivateOptions();
        log4net.Config.BasicConfigurator.Configure(appender);

        _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.FullName);
        _logger.Debug("Application started");
    }

Tente definir explicitamente o nível para depurar seu logger e Appender.

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