Назвіть різні підходи до того, щоб динамічно змінювати рівень журналу log4j, щоб мені не довелося перерозподіляти додаток. Чи будуть зміни в цих випадках постійними?
Назвіть різні підходи до того, щоб динамічно змінювати рівень журналу log4j, щоб мені не довелося перерозподіляти додаток. Чи будуть зміни в цих випадках постійними?
Відповіді:
Зміна рівня журналу проста; модифікація інших частин конфігурації буде представляти більш глибокий підхід.
LogManager.getRootLogger().setLevel(Level.DEBUG);
Зміни постійні через життєвий цикл Logger
. Після повторної ініціалізації конфігурація буде прочитана та використана, оскільки встановлення рівня під час виконання не зберігає змін рівня.
UPDATE: Якщо ви використовуєте Log4j-ви повинні видалити виклики в setLevel
відповідно до документацією , так як це може бути досягнуто з допомогою класів реалізації.
Виклики до logger.setLevel () або подібні методи не підтримуються в API. Програми повинні видалити їх. Еквівалентна функціональність надається у класах реалізації Log4j 2, але може залишати програму сприйнятливою до змін у внутрішніх протоколах Log4j 2.
LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);
Log4j може переглядати log4j.xml
файл за зміною конфігурації. Якщо ви зміните файл log4j, log4j автоматично оновить рівні журналу відповідно до ваших змін. Докладніше див. У документації org.apache.log4j.xml.DOMConfigurator.configureAndWatch(String,long
). Час очікування за замовчуванням між чеками - 60 секунд. Ці зміни будуть постійними, оскільки ви безпосередньо змінюєте файл конфігурації у файловій системі. Все, що вам потрібно зробити - це один раз викликати DOMConfigurator.configureAndWatch () один раз.
Увага: метод configureAndWatch небезпечний для використання в середовищах J2EE через витік нитки
Інший спосіб встановити рівень журналу (або перенастроювати загалом) log4j - це використовувати JMX. Log4j реєструє свої реєстратори як JMX MBeans. Використовуючи консолі MBeanServer серверів прикладних програм (або jconsole.exe JDK), ви можете налаштувати кожен окремий реєстратор. Ці зміни не є стійкими, і вони будуть скинуті до конфігурації, встановленої у файлі конфігурації після перезавантаження програми (сервера).
Як описано Аароном, ви можете встановити рівень журналу програмно. Ви можете реалізувати його у своїй програмі так, як ви хотіли б, щоб це сталося. Наприклад, у вас може бути графічний інтерфейс користувача, коли користувач або адміністратор змінює рівень журналу, а потім викликає setLevel()
методи в реєстраторі. Незалежно від того, чи будете ви зберігати налаштування десь чи ні.
Log4j2 можна налаштувати на оновлення конфігурації, скануючи файл log4j 2 .xml (або еквівалент) через задані інтервали. Просто додайте параметр " monitorInterval " у свій тег налаштування. Дивіться рядок 2 зразка файла log4j 2 .xml, який повідомляє log4j повторно сканувати його конфігурацію, якщо з останньої події журналу минуло більше 5 секунд.
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="warn" monitorInterval="5" name="tryItApp" packages="">
<Appenders>
<RollingFile name="MY_TRY_IT"
fileName="/var/log/tryIt.log"
filePattern="/var/log/tryIt-%i.log.gz">
<Policies>
<SizeBasedTriggeringPolicy size="25 MB"/>
</Policies>
...
</RollingFile>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="MY_TRY_IT"/>
</Root>
</Loggers>
</Configuration>
Існують додаткові кроки, щоб зробити цю роботу, якщо ви розгортаєтесь до екземпляра tomcat, всередині IDE або під час використання весняного завантаження. Це виглядає дещо поза рамками і, ймовірно, заслуговує окремого питання.
Ця відповідь не допоможе вам змінити рівень журналу динамічно. Вам потрібно перезапустити послугу, якщо ви добре перезапустили службу, будь ласка, скористайтеся наведеним нижче рішенням
Я зробив це, щоб змінити рівень журналу log4j, і він працював на мене, я не пересилав жодного документа. Я використовував це системне значення властивості, щоб встановити своє ім'я файлу журналу. Я використовував ту саму техніку, щоб встановити рівень журналу, і він працював
передав це як параметр JVM (я використовую Java 1.7)
На жаль, це не змінить динамічно рівень журналу, він вимагає перезавантаження служби
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
у файл log4j.properties я додав цей запис
log4j.rootLogger=${logging.level},file,stdout
я намагався
java -Dlogging.level=DEBUG -cp xxxxxx.jar xxxxx.java
java -Dlogging.level=INFO-cp xxxxxx.jar xxxxx.java
java -Dlogging.level=OFF -cp xxxxxx.jar xxxxx.java
Це все спрацювало. сподіваюся, що це допомагає!
У моїх файлах pom.xml у мене такі залежності
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>apache-log4j-extras</artifactId>
<version>1.2.17</version>
</dependency>
З log4j 1.x я вважаю, що найкращим способом є використання DOMConfigurator для подання одного заздалегідь заданого набору конфігурацій журналу XML (скажімо, для нормального використання та одного для налагодження).
Використовуючи їх, можна виконати щось подібне:
public static void reconfigurePredefined(String newLoggerConfigName) {
String name = newLoggerConfigName.toLowerCase();
if ("default".equals(name)) {
name = "log4j.xml";
} else {
name = "log4j-" + name + ".xml";
}
if (Log4jReconfigurator.class.getResource("/" + name) != null) {
String logConfigPath = Log4jReconfigurator.class.getResource("/" + name).getPath();
logger.warn("Using log4j configuration: " + logConfigPath);
try (InputStream defaultIs = Log4jReconfigurator.class.getResourceAsStream("/" + name)) {
new DOMConfigurator().doConfigure(defaultIs, LogManager.getLoggerRepository());
} catch (IOException e) {
logger.error("Failed to reconfigure log4j configuration, could not find file " + logConfigPath + " on the classpath", e);
} catch (FactoryConfigurationError e) {
logger.error("Failed to reconfigure log4j configuration, could not load file " + logConfigPath, e);
}
} else {
logger.error("Could not find log4j configuration file " + name + ".xml on classpath");
}
}
Просто зателефонуйте до цього за допомогою відповідного імені конфігурації та переконайтеся, що ви розмістили шаблони на класі.
Я успішно використовував цей метод, щоб зменшити багатослівність журналів "org.apache.http":
ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("org.apache.http");
logger.setLevel(Level.TRACE);
logger.setAdditive(false);
Для API log4j 2 ви можете використовувати
Logger logger = LogManager.getRootLogger();
Configurator.setAllLevels(logger.getName(), Level.getLevel(level));
Якщо ви хочете змінити рівень реєстрації всіх реєстраторів, скористайтеся методом нижче. Це перерахує всі реєстратори та змінить рівень журналу на заданий рівень. Переконайтеся, що у вашому файлі НЕ встановлено log4j.appender.loggerName.Threshold=DEBUG
властивості log4j.properties
.
public static void changeLogLevel(Level level) {
Enumeration<?> loggers = LogManager.getCurrentLoggers();
while(loggers.hasMoreElements()) {
Logger logger = (Logger) loggers.nextElement();
logger.setLevel(level);
}
}
Ви можете використовувати наступний фрагмент коду
((ch.qos.logback.classic.Logger)LoggerFactory.getLogger(packageName)).setLevel(ch.qos.logback.classic.Level.toLevel(logLevel));