Как настроить slf4j и logback для записи логов одного класса в отдельный файл?

Вопросы и ответы

У меня есть один класс на 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 для вашего класса, а также убедиться, что он правильно настроен и добавлен к логгеру. Давайте пошагово разберем, как это сделать.

  1. Измените конфигурацию Logback в YAML: Обязательно укажите общий уровень логирования и параметры для основного логгера. Вы можете добавить новый логгер для вашего специального класса, указывая, что он будет использовать определенный FileAppender.

  2. Код для класса: Вам нужно будет создать экземпляр логгера и добавить к нему 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
  1. Код в классе: В вашем классе 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");
    }
}
  1. Настройка фильтров: Если вы хотите фильтровать логи по уровню (например, оставив только WARN и ERROR для файла), можно воспользоваться следующим подходом в конфигурации YAML для нового аппендера:
    - type: file
      name: specialFileAppender
      threshold: WARN  # Только сообщения WARN и выше
  1. Проверка: Убедитесь, что ваш класс YourSpecialClass действительно используется в проекте, и методы вызываются. Лог файлы должны записываться в /tmp/specialclass.log.

Теперь вы можете запускать ваше приложение, и все логи из класса YourSpecialClass должны записываться в отдельный файл. Если вы всё настроили правильно, и |логика вызовов корректна, логи должны отображаться как в консоли, так и в вашем специальном лог-файле.

Оцените материал
Добавить комментарий

Капча загружается...