log4net - ведение журнала для dll, вызываемой через COM-взаимодействие

Я написал .NET DLL, которая вызывается из другого приложения с помощью COM-взаимодействия. Я хотел бы использовать log4net, но мне нужно указать расположение файла журнала во время выполнения из другого приложения.

Я всегда использовал log4net как можно проще для проекта WinForms, но поскольку проект DLL не имеет app.config, а у моего вызывающего приложения его также нет (это даже не .NET), я попытался немного почитать о том, как работает log4net, и попытался установить его вообще без использования файла .config.

Я добрался до стадии, когда он компилируется, и вроде как соответствует моему крошечному пониманию log4net, но он не записывается в файл журнала.

Вот что у меня есть на данный момент. Может ли кто-нибудь указать на мои вопиющие ошибки / заблуждения или подсказать мне лучший способ входа в систему из моей 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");
    }

Спасибо!


person Colin Pickard    schedule 11.09.2009    source источник


Ответы (3)


Редактировать- Обновить. Перечитайте вопрос. Похоже, вам просто нужно вызвать перегруженную версию this (передавая подробную информацию о файле конфигурации) - вы просто хотите настроить ведение журнала из COM DLL?

В шутку я загуглил log4com и нашел это. Я не использовал его, но, возможно, стоит посмотреть!

person RichardOD    schedule 11.09.2009
comment
Какая ужасная мысль! :) У моего вызывающего приложения есть собственное ведение журнала, и эта DLL предназначена не только для ведения журнала, я думал о том, что не передавал подробную информацию обратно в родительское приложение для ведения журнала, было экономией в трафике COM, который, как я читал, был медленным, и немного устойчивости на случай, если произошел какой-то сбой, и родительское приложение не могло его зарегистрировать. Я новичок в мире COM ... я думаю, это может быть не обязательно. Если я не могу заставить это работать, я получу свою DLL, чтобы сообщить обо всем вызывающему приложению, а затем зарегистрировать это там. - person Colin Pickard; 11.09.2009
comment
Я перечитал ваш вопрос и, кажется, теперь понял то, о чем вы спрашиваете. - person RichardOD; 11.09.2009
comment
Есть ли способ изменить место назначения файла журнала с помощью этого метода? Я могу запутаться. - person Colin Pickard; 11.09.2009
comment
Я нашел свой окончательный ответ, посмотрев на различные перегрузки XmlConfigurator.Configure и BasicConfigurator.Configure, поэтому я дам вам согласие на это, поскольку вы направили меня в правильном направлении. Спасибо! - person Colin Pickard; 11.09.2009
comment
Хорошо, что вы разобрались - похоже, вы исправили это до того, как я увидел свой предыдущий комментарий. - person RichardOD; 11.09.2009

Думаю, ответ был такой: мне вообще не нужен был новый репозиторий. Я просто слишком усложнял дело. Эта прорезанная версия, похоже, работает нормально:

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");
    }
person Colin Pickard    schedule 11.09.2009

Попробуйте явно установить уровень DEBUG как в Logger, так и в Appender.

person Vinay Sajip    schedule 11.09.2009
comment
Хм ... В лог еще вроде ничего не пишет - person Colin Pickard; 11.09.2009