Log4net дублирует запись в журнал - PullRequest
1 голос
/ 06 мая 2010

Я недавно переключил ведение журнала log4net с использования файлов конфигурации на настройку программным путем.Это привело к тому, что записи nhiberate повторялись 2, а иногда и 3 раза.Вот кодОн использует строку, которая выглядит примерно так: «logger1 | debug, logger2 | info»

    private void SetupLog4netLoggers()
    {
        IAppender appender = GetAppender();

        SetupRootLogger(appender);

        foreach (string logger in Loggers)
        {
            CommaStringList parts = new CommaStringList(logger, '|');
            if (parts.Count != 2)
                continue;

            AddLogger(parts[0], parts[1], appender);
        }

        log.Debug("Log4net has been setup");
    }

    private IAppender GetAppender()
    {
        RollingFileAppender appender = new RollingFileAppender();
        appender.File = LogFile;
        appender.AppendToFile = true;
        appender.MaximumFileSize = MaximumFileSize;
        appender.MaxSizeRollBackups = MaximumBackups;

        PatternLayout layout = new PatternLayout(PATTERN);
        layout.ActivateOptions();

        appender.Layout = layout;
        appender.ActivateOptions();

        return appender;
    }

    private void SetupRootLogger(IAppender appender)
    {
        Hierarchy hierarchy = (Hierarchy)LogManager.GetRepository();

        hierarchy.Root.RemoveAllAppenders();
        hierarchy.Root.AddAppender(appender);
        hierarchy.Root.Level = GetLevel(RootLevel);

        hierarchy.Configured = true;

        log.Debug("Root logger setup, level[" + RootLevel + "]");
    }

    private void AddLogger(string name, string level, IAppender appender)
    {
        Logger logger = LogManager.GetRepository().GetLogger(name)as Logger;
        if (logger == null)
            return;

        logger.Level = GetLevel(level);
        logger.Additivity = false;
        logger.RemoveAllAppenders();
        logger.AddAppender(appender);

        log.Debug("logger[" + name + "] added, level[" + level + "]");
    }

И вот пример того, что мы видим в наших журналах ...

2010-05-06 15:50:39,781 [1] DEBUG NHibernate.Impl.SessionImpl - running ISession.Dispose()
2010-05-06 15:50:39,781 [1] DEBUG NHibernate.Impl.SessionImpl - closing session
2010-05-06 15:50:39,781 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - running ISession.Dispose()
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - closing session
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - running ISession.Dispose()
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.Impl.SessionImpl - closing session
2010-05-06 15:50:39,796 [1] DEBUG NHibernate.AdoNet.AbstractBatcher - running BatcherImpl.Dispose(true)

Любые советы приветствуются.

Ответы [ 2 ]

0 голосов
/ 27 мая 2010

Я думаю, что ответ - на самом деле это не написание дубликатов. Без отладки кода NHibernate я не могу быть уверен, но я предполагаю, что он, вероятно, просто пишет его или делает то же самое неоднократно

Мы все равно вернемся к использованию конфигурационных файлов, поэтому нам нужно будет проверить, есть ли у меня возможные дубликаты.

0 голосов
/ 10 мая 2010

Я не совсем уверен, что происходит, но я бы попытался удалить следующие строки:

logger.Additivity = false;
logger.RemoveAllAppenders();
logger.AddAppender(appender);

Регистраторы должны в любом случае наследовать приложение от корневого приложения. Может быть, log4net смешивает что-то, когда вы добавляете appenders таким способом, хотя это не должно быть так ...

...