2015-06-22 2 views
0

Мое приложение имеет центральное определение log4net в своем web.config, которое я читаю с помощью xmlConfigurator. Помимо этого центрального регистратора, мне нужно определить некоторые другие регистраторы, которые будут записываться в различные файлы журналов/БД. Определения для этих регистраторов находятся в моей БД в формате xml, и во время выполнения моя попытка - прочитать их из БД, записать их в поток, настроить их также с помощью XmlConfigurator и сохранить их в коллекции ILog (sb - StringBuilder, который содержит XML, logConfig.Type этого имени регистратора, как появляется в XML):Как настроить динамические логарифмы log4net?

byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString()); 
MemoryStream stream = new MemoryStream(byteArray); 
log4net.Config.XmlConfigurator.Configure(stream); 
ILog ilogRes = log4net.LogManager.GetLogger(logConfig.Type); 
stream.Close(); 
return ilogRes; 

ilogRes не приходит сконфигурировано как я ожидал (с appenders, определенной в сб), но в качестве центрального регистратора. Что я делаю не так?

UPDATE: Первоначальная проблема была в моем XML, после удаления избыточного элемента был создан новый регистратор с новым приложением. Теперь проблема заключается в том, что новый регистратор записывает оба приложения, предыдущий и новый, в то время как я хочу, чтобы новый регистратор записывал только с новым приложением. Есть ли способ сообщить LogManager.GetLogger (X) принести только appenders, которые были сконфигурированы вместе с appender X?

+0

конфигурации Log4Net не является аддитивным - то есть каждый раз, когда вы звоните Configure вам замените существующий репозиторий, вы не добавите его. Ваши варианты включают в себя сохранение всей конфигурации в базе данных, объединение двух источников во время выполнения или, возможно, объединение этих двух элементов путем сохранения шаблона в базе данных, которую вы заполняете значениями из конфигурации во время выполнения. – stuartd

+0

На самом деле, не аддитивное поведение - это именно то, что мне нужно, но почему-то не получается. Когда я реконфигурирую log4net (и ожидаю получить регистратор с новым приложением), я получаю регистратор с тем же приложением, которое было настроено ранее. – sinai

+0

Регистраторы кэшируются log4net - вызывают 'LogManager.ResetConfiguration()' перед перезагрузкой, так как это ["удаляет все приложения из всех регистраторов и устанавливает уровень всех некорневых регистраторов равными нулю"] (https: // logging. apache.org/log4net/release/sdk/log4net.LogManager.ResetConfiguration_overload_1.html) – stuartd

ответ

0

Я настроил каждый динамический регистратор в отдельном хранилище, таким образом регистратор содержал только appenders, которые были определены в текущей конфигурации:

byte[] byteArray = Encoding.UTF8.GetBytes(sb.ToString()); 
MemoryStream stream = new MemoryStream(byteArray); 
log4net.Repository.ILoggerRepository repository = log4net.LogManager.CreateRepository(logConfig.Type); 
log4net.Config.XmlConfigurator.Configure(repository, stream); 
ILog ilogRes = log4net.LogManager.GetLogger(repository.Name, logConfig.Type); 
Смежные вопросы