Почему вход в log4net.ILog добавляется в несколько журналов? - PullRequest
0 голосов
/ 05 сентября 2018

Я разрабатываю плагин для стороннего приложения, и для каждого «запуска» этого плагина я хочу эксклюзивный файл журнала.

Я построил следующий класс.

public class LogFileRepository
{
    private readonly Common.Configuration.Settings _configSettings;
    private const string InstanceName = "AutomationPlugin.Logging";
    private readonly ILoggerRepository _repository;


    public LogFileRepository (Common.Configuration.Settings configSettings)
    {
        _configSettings = configSettings;

        var repositoryName = $"{InstanceName}.Repository";
        _repository = LoggerManager.CreateRepository(repositoryName);
    }


    public ILog GetLog(string name)
    {
        var logger = LogManager.Exists(_repository.Name, name);
        if (logger != null)
        {
            return logger;
        }

        var filter = new LevelMatchFilter {LevelToMatch = Level.All};
        filter.ActivateOptions();
        var appender = new RollingFileAppender
                       {
                           AppendToFile = false,
                           DatePattern = "yyyy-MM-dd",
                           File = String.Format(_configSettings.Paths.LogFileTemplate, name),
                           ImmediateFlush = true,
                           Layout = new PatternLayout("%n%date{ABSOLUTE} | %-7p | %m"),
                           LockingModel = new FileAppender.MinimalLock(),
                           MaxSizeRollBackups = 1,
                           Name = $"{InstanceName}.{name}.Appender",
                           PreserveLogFileNameExtension = false,
                           RollingStyle = RollingFileAppender.RollingMode.Once
                       };
        appender.AddFilter(filter);
        appender.ActivateOptions();

        BasicConfigurator.Configure(_repository, appender);

        return LogManager.GetLogger(_repository.Name, name);
    }
}

То, что я намеревался , эта функция должна сделать для метода GetLog, возвращающего файл журнала (с указанным именем), если LogManager уже имеет его; если файл журнала не существует, он должен создать экземпляр и вернуть его.

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

Почему? Есть ли в * 1019 что-то, что я, казалось бы, неправильно понял / неправильно настроил? Я хочу эксклюзивный файл журнала для каждого параметра name.

1 Ответ

0 голосов
/ 07 сентября 2018

Предполагая, что вы создали _repository с использованием LogManager.CreateRepository(), это фактически создает Hierarchy, а когда вы настраиваете его с новым аппендером через BasicConfigurator.Configure(_repository, appender);, это добавляет аппендер в коллекцию Root иерархии Иерархии.

Все регистраторы, которые затем создаются из репозитория, являются дочерними регистраторами «Root» и настроены так, чтобы быть «аддитивными» в том смысле, что они добавляются ко всем добавителям, определенным непосредственно для них, и любым их родительским регистраторам. вплоть до Корня. В вашем случае сами регистраторы не имеют своих собственных дополнений, поэтому просто выбирают добавочные объекты из корня, который в вашем случае содержит всех вспомогательных элементов. В результате все сообщения регистрируются в каждом файле.

То, что вы хотите сделать, это присоединить appender к определенному логгеру и отключить аддитивность, чтобы он не регистрировался в appandder выше в иерархии. Кажется, не существует «хорошего» способа сделать это, но в моем тестировании работало следующее:

...
appender.AddFilter(filter);
appender.ActivateOptions();

// Add the appender directly to the logger and prevent it picking up parent appenders
if (LoggerManager.GetLogger(_repository.Name, name) is Logger loggerImpl)
{
    loggerImpl.Additivity = false;
    loggerImpl.AddAppender(appender);
}

BasicConfigurator.Configure(_repository, appender);
return LogManager.GetLogger(_repository.Name, name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...