У меня есть один класс на Java, который является многопоточным, и я хочу, чтобы он записывал логи в отдельный файл. Я использую Dropwizard, который использует logback и настроен в моем YAML-файле следующим образом:
logging:
# Уровень по умолчанию для всех логгеров. Может быть OFF, ERROR, WARN, INFO, DEBUG, TRACE или ALL.
level: INFO
# Уровни, специфичные для логгеров.
loggers:
# Устанавливает уровень для 'com.example.app' на DEBUG.
com.mycode: DEBUG
appenders:
- type: console
threshold: DEBUG
- type: file
threshold: INFO
logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
currentLogFilename: /tmp/fingage.log
archivedLogFilenamePattern: /tmp/project-%d{yyyy-MM-dd}-%i.log.gz
archivedFileCount: 7
timeZone: UTC
maxFileSize: 10MB
Внутри моего специального класса я пытался сделать что-то вроде:
// Получить экземпляр LoggerContext
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
// Создать новый FileAppender
FileAppender<ILoggingEvent> file = new FileAppender<ILoggingEvent>();
file.setName("FileLogger");
file.setFile("specialclass.log");
file.setContext(context);
file.setAppend(true);
// Фильтровать все, что ниже WARN
ThresholdFilter warningFilter = new ThresholdFilter();
warningFilter.setLevel("WARN");
warningFilter.setContext(context);
warningFilter.start();
file.addFilter(warningFilter);
// Кодировщик сообщений
PatternLayoutEncoder ple = new PatternLayoutEncoder();
ple.setContext(context);
ple.setPattern("%date %level [%thread] %logger{10} %msg%n");
ple.start();
file.setEncoder(ple);
file.start();
// Получить корневой логгер и добавить аппендер к нему
log = context.getLogger(MySpecialClass.class);
log.setLevel(Level.DEBUG);
log.addAppender(file);
log.info("Привет, специальный класс");
К сожалению, это, похоже, ничего не меняет, хотя я вижу пустой файл specialclass.log, и мое сообщение лога появляется только в КОНСОЛИ.
Ответ
Для настройки SLF4J и Logback, чтобы один класс записывал логи в отдельный файл, вам нужно сделать несколько вещей. Вам нужно будет создать специальный FileAppender
для вашего класса, а также убедиться, что он правильно настроен и добавлен к логгеру. Давайте пошагово разберем, как это сделать.
-
Измените конфигурацию Logback в YAML: Обязательно укажите общий уровень логирования и параметры для основного логгера. Вы можете добавить новый логгер для вашего специального класса, указывая, что он будет использовать определенный
FileAppender
. - Код для класса: Вам нужно будет создать экземпляр логгера и добавить к нему
FileAppender
, как вы пытались сделать. Однако есть несколько моментов, которые стоит проверить.
Вот полное решение:
logging:
level: INFO
loggers:
# Устанавливаем уровень для вашего специального класса
com.example.app.YourSpecialClass: DEBUG # Замените на реальный путь к вашему классу
appenders:
- type: console
threshold: DEBUG
- type: file
threshold: INFO
logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %X{code} %msg %n"
currentLogFilename: /tmp/fingage.log
archivedLogFilenamePattern: /tmp/project-%d{yyyy-MM-dd}-%i.log.gz
archivedFileCount: 7
timeZone: UTC
maxFileSize: 10MB
# Добавляем новый аппендер для вашего специального класса
- type: file
name: specialFileAppender
threshold: DEBUG
logFormat: "%-6level [%d{HH:mm:ss.SSS}] [%t] %logger{5} - %msg %n"
currentLogFilename: /tmp/specialclass.log
archivedLogFilenamePattern: /tmp/specialclass-%d{yyyy-MM-dd}-%i.log.gz
archivedFileCount: 7
timeZone: UTC
maxFileSize: 10MB
- Код в классе: В вашем классе
YourSpecialClass
, вы можете инициализировать логгер следующим образом:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class YourSpecialClass {
private static final Logger log = LoggerFactory.getLogger(YourSpecialClass.class);
public void someMethod() {
log.debug("Debug message from special class");
log.info("Info message from special class");
log.warn("Warn message from special class");
log.error("Error message from special class");
}
}
- Настройка фильтров: Если вы хотите фильтровать логи по уровню (например, оставив только WARN и ERROR для файла), можно воспользоваться следующим подходом в конфигурации YAML для нового аппендера:
- type: file
name: specialFileAppender
threshold: WARN # Только сообщения WARN и выше
- Проверка: Убедитесь, что ваш класс
YourSpecialClass
действительно используется в проекте, и методы вызываются. Лог файлы должны записываться в/tmp/specialclass.log
.
Теперь вы можете запускать ваше приложение, и все логи из класса YourSpecialClass
должны записываться в отдельный файл. Если вы всё настроили правильно, и |логика вызовов корректна, логи должны отображаться как в консоли, так и в вашем специальном лог-файле.