Domanda

Ho scritto una DLL .NET che viene chiamata da un'altra applicazione usando l'interoperabilità COM. Vorrei usare log4net, ma devo specificare la posizione del file di registro in fase di runtime dall'altra applicazione.

Ho sempre usato log4net nel modo più semplice possibile per il progetto WinForms, ma poiché un progetto DLL non ha un app.config e anche la mia applicazione chiamante non ne ha uno (non è nemmeno .NET), Ho provato a leggere un po 'su come funziona log4net e ho tentato di impostarlo senza utilizzare un file .config.

L'ho portato nella fase in cui si compila e in qualche modo si conforma alla mia piccola comprensione di log4net, ma non scrive nel file di registro.

Ecco quello che ho finora, qualcuno può sottolineare i miei errori / idee sbagliate evidenti, oppure dirmi un modo migliore di accedere dalla mia 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");
    }

Grazie!

È stato utile?

Soluzione

Modifica-Aggiorna. Rileggi la domanda. Sembra che devi solo chiamare la versione sovraccarica di questo (passando i dettagli di un file di configurazione) - fondamentalmente vuoi solo configurare la registrazione dalla DLL COM?

Scherzosamente ho google'd log4com e l'ho trovato . Non l'ho usato ma potrebbe valerne la pena guarda!

Altri suggerimenti

Penso che la risposta sia stata che non avevo bisogno del nuovo repository. Stavo solo complicando le cose. Questa versione decimata sembra funzionare bene:

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");
    }

Prova a impostare esplicitamente il livello su DEBUG sia sul tuo Logger che sul tuo Appender.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top