Настройка пути к резервной копии Appender программно
Я пытаюсь установить путь к программному обеспечению. ( RollingFileAppender с FixedWindowRollingPolicy, если быть точным)
Я делаю это, потому что хочу, чтобы мои пользователи задавали путь журнала в диалоговом окне настроек (Eclipse RCP)
Я пробовал что-то вроде этого, но я не изменяю путь журнала из того, что определено в файле конфигурации:
- Настройка RollingFileAppender в log4j
- Log4net катит ежедневное имя файла с датой в имени файла
- Как включить ведение журнала проводки для java HttpURLConnection трафика?
- Журналирование событий блокировки экрана
- Hibernate 5 java.lang.NoSuchMethodError org.jboss.logging.Logger.debugf
Logger logback_logger = (ch.qos.logback.classic.Logger)LoggerFactory .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); RollingFileAppender rfappender = (RollingFileAppender)logback_logger.getAppender("FILE"); rfappender.setFile(newFile); FixedWindowRollingPolicy rollingPolicy = (FixedWindowRollingPolicy)rfappender.getRollingPolicy(); rollingPolicy.setFileNamePattern(newPattern);
- Используйте канал hiearchy для Boost.Log для фильтрации серьезности и раковины
- Почему сообщения журнала Level.FINE не отображаются?
- Могу ли я регистрировать операции с файлами (создавать / изменять / удалять) в Windows?
- Logging, Aspect Oriented Programming и Injection Dependency Injection - Попытка понять все это
- Инъекция зависимостей и именованные логины
- Отключение выхода Log4J в Java
- Персональный кейлоггер
- Печать полного стека вызовов на printStackTrace ()?
После того, как вы программно настроили свой appender, вам нужно вызвать его метод start()
. Если у приложения есть подкомпоненты, start()
вызовите start()
в подкомпонентах. Затем вы добавляете приложение в регистратор по вашему выбору.
Вот пример:
import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.core.rolling.FixedWindowRollingPolicy; import ch.qos.logback.core.rolling.RollingFileAppender; import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy; import ch.qos.logback.core.util.StatusPrinter; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.LoggerContext; public class Main { public static void main(String[] args) { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); RollingFileAppender rfAppender = new RollingFileAppender(); rfAppender.setContext(loggerContext); rfAppender.setFile("testFile.log"); FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy(); rollingPolicy.setContext(loggerContext); // rolling policies need to know their parent // it's one of the rare cases, where a sub-component knows about its parent rollingPolicy.setParent(rfAppender); rollingPolicy.setFileNamePattern("testFile.%i.log.zip"); rollingPolicy.start(); SizeBasedTriggeringPolicy triggeringPolicy = new ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy(); triggeringPolicy.setMaxFileSize("5MB"); triggeringPolicy.start(); PatternLayoutEncoder encoder = new PatternLayoutEncoder(); encoder.setContext(loggerContext); encoder.setPattern("%-4relative [%thread] %-5level %logger{35} - %msg%n"); encoder.start(); rfAppender.setEncoder(encoder); rfAppender.setRollingPolicy(rollingPolicy); rfAppender.setTriggeringPolicy(triggeringPolicy); rfAppender.start(); // attach the rolling file appender to the logger of your choice Logger logbackLogger = loggerContext.getLogger("Main"); logbackLogger.addAppender(rfAppender); // OPTIONAL: print logback internal status messages StatusPrinter.print(loggerContext); // log something logbackLogger.debug("hello"); } }
Вышеприведенный код является программным выражением шагов, выполняемых конфигуратором XML журнала, т.е. Joran, когда он анализирует файл RollingFixedWindow.xml .
Использование свойств системы и перезагрузка файла конфигурации кажется более чистым:
измените файл logback.xml:
${log_path:-}myfile.log .... ${log_path:-}myfile.%i.log
Это установит местоположение по умолчанию в рабочий каталог. Затем используйте:
System.setProperty("log_path", my_log_path); //Reload: LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); ContextInitializer ci = new ContextInitializer(lc); lc.reset(); try { //I prefer autoConfig() over JoranConfigurator.doConfigure() so I wouldn't need to find the file myself. ci.autoConfig(); } catch (JoranException e) { // StatusPrinter will try to log this e.printStackTrace(); } StatusPrinter.printInCaseOfErrorsOrWarnings(lc);
Глядя на код журнала, я нашел обходное решение:
rollingPolicy.stop(); rfappender.stop(); rollingPolicy.start(); rfappender.start();
Это заставляет Logback использовать новые определения. Тем не менее, это все равно похоже на обходной путь.