2016-11-03 3 views
0

У меня есть приложение Spring Boot, которое использует log4j2 для ведения журнала. Мне нужно настроить уровень ведения журнала во время выполнения, и я сделал это с помощью простого интерфейса RESTful, который принимает имя регистратора и уровень, в котором он должен быть установлен. Я также должен иметь возможность вносить постоянные изменения на уровень ведения журнала (только на некоторых регистраторах).Как разрешить пользователю делать постоянные изменения в уровнях журналов?

a) Есть ли способ сохранить мои изменения обратно в конфигурационный файл log4j, чтобы в следующий раз, когда приложение было поднято, уровни журналов там, где они были оставлены, в предыдущем запуске?

b) Есть ли способ прочитать список регистраторов, перечисленных в файле конфигурации?

Спасибо

+1

Вам нужно будет записать их в постоянное хранилище, например, в базу данных. – chrylis

+0

Ваша конфигурация обычно находится в вашем файле war/ear, поэтому вы не можете писать на нее. Контейнер не позволит вам. Так как @chrylis говорит, что вам нужно хранить его в постоянном хранилище, которое обычно доступно для контейнеризованных приложений. – markbernard

ответ

1

а) Если у вас есть файл конфигурации, каждый раз, когда сервер запускает его будет использоваться для настройки log4j2. Вы можете создать новый конфигурационный файл (вне контейнера) и использовать его для настройки log4j2 при запуске сервера:

File file = new File("/config/new/log4j2.xml");    
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);  
    ctx.setConfigLocation(file.toURI()); 

Или просто хранить новую информацию и изменять LOG4J Programatically

б) Попробуйте это:

public Collection<Logger> getLoggers() 

https://logging.apache.org/log4j/2.0/log4j-core/apidocs/org/apache/logging/log4j/core/LoggerContext.html#getLoggers()

Вот пример кода (выполняется при запуске приложения):

File file = new File(log4jConfigFilePath);  
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
    ctx.setConfigLocation(file.toURI()); 

    Collection<org.apache.logging.log4j.core.Logger> collection = ctx.getLoggers();  
    System.out.println(collection.size()); // returns 0 (No loggers instantiated) 

    Logger logger = LoggerFactory.getLogger("myLogger"); 

    collection = ctx.getLoggers();  
    System.out.println(collection.size()); // returns 1 (myLogger instantiated) 
+0

Спасибо @Marco. Мой файл конфигурации log4j2 находится вне контейнера. Следуя инструкциям, которые вы указали, я не получил список журналов, перечисленных/настроенных в файле конфигурации. Если я преодолю это препятствие, и я разрешаю программным путем изменять уровни журналов, есть ли способ сохранить/сохранить изменения обратно в файл конфигурации? Спасибо – spring5150

+0

getLoggers() возвращает текущие регистраторы, и каждый экземпляр должен принадлежать одному из ваших регистраторов, перечисленных в файле конфигурации. Конечно, если вы не создали какой-либо экземпляр с LoggerFactory.getLogger (loggerName), он вернет null. К сожалению, не существует способа сохранить изменения, сделанные программно, используя API log4j2. Единственный способ сохранить его - это создать новый файл конфигурации (или обновить текущий), используя API-интерфейс ввода-вывода java. –

+0

getLoggers() не возвращает регистраторы в файле конфигурации. Должен ли я полагаться на регулярный ввод/вывод файлов и разбор строк для чтения/разбора и определения этого? Спасибо – spring5150