Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Журнал

Журнал (лог) — записи о том, что происходило в приложении: кто создал статью, какой запрос упал и почему. На сервере это главный способ понять, что случилось ночью. Spring Boot уже настроил журнал: строки, которые вы видели при запуске, — это он. Осталось писать туда свои сообщения.

Свой логгер

// src/main/java/com/example/blog/PostService.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
@Service
@Transactional(readOnly = true)
public class PostService {
 
    private static final Logger log = LoggerFactory.getLogger(PostService.class);
 
    // ...
 
    @Transactional
    public PostResponse create(NewPostRequest request, String username) {
        User author = users.findByUsername(username)
                .orElseThrow(() -> new IllegalArgumentException("Неизвестный автор " + username));
        Post post = posts.save(new Post(request.title(), request.body(), author, Instant.now(clock)));
        log.info("Статья {} создана пользователем {}", post.getId(), username);
        return PostResponse.from(post);
    }
}

SLF4J — общий интерфейс для журналов в Java, а записывает строки библиотека Logback, которую подключил Spring Boot. Логгер заводят по одному на класс. Фигурные скобки {} в сообщении — места для аргументов, они подставляются по порядку.

Строка журнала

После создания статьи появится:

2026-10-04T12:12:09.089+03:00  INFO 21540 --- [blog] [http-nio-8080-exec-5] com.example.blog.PostService             : Статья 1 создана пользователем anna
ЧастьСмысл
2026-10-04T12:12:09.089+03:00Время
INFOУровень
21540Номер процесса
[blog]Имя приложения из spring.application.name
[http-nio-8080-exec-5]Поток: здесь — поток обработки HTTP-запроса
com.example.blog.PostServiceКласс, который написал строку

Уровни

УровеньДля чего
ERRORЧто-то сломалось, нужна реакция
WARNПодозрительно, но работа продолжается
INFOВажные события: запуск, создание статьи
DEBUGПодробности для отладки
TRACEСовсем подробно

По умолчанию выводится INFO и выше. Уровень меняют для пакета или класса:

# src/main/resources/application.yaml
logging:
  level:
    com.example.blog: debug
    org.hibernate.SQL: debug

Первая строка включает log.debug(...) в нашем коде, вторая показывает SQL Hibernate через журнал — на сервере это лучше, чем show-sql, который печатает мимо журнала.

Журнал в файл

На сервере строки должны сохраняться. Это одна настройка — поставим её в профиль prod:

# src/main/resources/application-prod.yaml
logging:
  file:
    name: logs/blog.log

Строки будут идти и в консоль, и в файл logs/blog.log. Когда файл дорастёт до 10 МБ, Spring Boot начнёт новый, а старые сожмёт в архив.

Ошибки с исключением

log.error("Не удалось импортировать статью {}", externalId, ex);

Если последним аргументом передать исключение, в журнал попадёт вся трассировка стека — без неё по журналу причину не найти.

Частая ошибка

Не пишите System.out.println и не склеивайте строку сами: log.debug("Статья " + post + " создана"). Первое не попадёт в файл журнала и не отключается уровнями. Второе собирает строку, даже когда DEBUG выключен, и тратит время зря. Используйте {} — SLF4J подставит значения, только если строка действительно будет записана.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.