Журнал
Журнал (лог) — записи о том, что происходило в приложении: кто создал статью, какой запрос упал и почему. На сервере это главный способ понять, что случилось ночью. 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 подставит значения, только если строка действительно будет записана.