Pregunta

Escribí una DLL de .NET a la que se llama desde otra aplicación usando interoperabilidad COM. Me gustaría usar log4net, pero necesito especificar la ubicación del archivo de registro en tiempo de ejecución desde la otra aplicación.

Siempre he usado log4net de la forma más sencilla posible para el proyecto WinForms, pero como un proyecto DLL no tiene una aplicación .config, y mi aplicación de llamada tampoco tiene una (ni siquiera es .NET), Intenté leer un poco sobre cómo funciona log4net e intenté configurarlo sin usar un archivo .config en absoluto.

Llegué a la etapa en la que se compila, y de alguna manera se ajusta a mi pequeña comprensión de log4net, pero no escribe en el archivo de registro.

Esto es lo que tengo hasta ahora, ¿alguien puede señalar mis errores / ideas erróneas, o me puede decir una mejor manera de iniciar sesión desde mi 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");
    }

¡Gracias!

¿Fue útil?

Solución

Editar- Actualizar. Vuelva a leer la pregunta. Parece que solo necesitas llamar a la versión sobrecargada de esto (pasando los detalles de un archivo de configuración): ¿básicamente desea configurar el registro desde la DLL COM?

En broma, busqué en google log4com y encontré esto . No lo he usado pero podría valer la pena mira!

Otros consejos

Creo que la respuesta fue que no necesitaba el nuevo repositorio. Estaba haciendo las cosas demasiado complicadas. Esta versión diezmada parece funcionar bien:

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

Intente establecer explícitamente el nivel en DEBUG en su registrador y en Appender.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top