Logger.severe: примеры (JAVA)
Logger.severe(String msg): voidОписание метода Logger.severe()
Метод Logger.severe() из пакета java.util.logging предназначен для записи сообщений уровня Level.SEVERE. Этот уровень обозначает серьезные ошибки, которые могут привести к невозможности продолжения работы приложения или к потере данных.
Сигнатура метода: public void severe(String msg).
Аргументы и возвращаемое значение:
- msg (String) - текст сообщения, может быть
null. Сообщение помещается вLogRecordс уровнемSEVEREи передается всем назначенным обработчикам (Handlers) логгера и его родителей. - Возвращаемое значение отсутствует (void). Метод не возвращает результат и не возбуждает исключений при нормальном использовании; возможно поведение логирования (например, отсутствие вывода) при некорректной конфигурации логгера или обработчиков.
Поведение и особенности:
- Запись производится только если уровень логгера и уровень обработчиков позволяют публикацию сообщений
SEVERE. Фильтры (Filter) также могут блокировать запись. - Для логирования исключений предпочтительнее использовать перегрузку
logger.log(Level.SEVERE, String, Throwable), так какsevere()принимает только строку. - Формат и место вывода зависят от конфигурации Logger, Handler и Formatter (например, консоль, файл, системный журнал).
- Метод добавляет информацию о времени, имени логгера и уровне в соответствии с используемым Formatter'ом.
Короткие примеры использования
Ниже приводится несколько минимальных примеров с кодом и примерным выводом при стандартной конфигурации java.util.logging (SimpleFormatter).
1) Базовый пример записи сообщения уровня SEVERE
import java.util.logging.Logger;
public class App {
private static final Logger logger = Logger.getLogger(App.class.getName());
public static void main(String[] args) {
logger.severe("Критическая ошибка: конфигурация отсутствует");
}
}
Примерный вывод: Apr 22, 2026 10:00:00 AM App main SEVERE: Критическая ошибка: конфигурация отсутствует
2) Сообщение null
import java.util.logging.Logger;
public class AppNull {
private static final Logger logger = Logger.getLogger("my.logger");
public static void main(String[] args) {
logger.severe(null);
}
}
Примерный вывод: Apr 22, 2026 10:01:00 AM my.logger main SEVERE: null
3) Фильтрация по уровню: если уровень логгера выше SEVERE, вывод отсутствует
import java.util.logging.Level;
import java.util.logging.Logger;
public class FilterExample {
private static final Logger logger = Logger.getLogger(FilterExample.class.getName());
public static void main(String[] args) {
logger.setLevel(Level.OFF); // полностью отключить
logger.severe("Это сообщение не появится при уровне OFF");
}
}
Примерный вывод: (ничего не выводится)
Похожие возможности в Java
В рамках Java доступны другие методы и подходы, которые в ряде случаев более удобны:
Logger.log(Level.SEVERE, String)- эквивалент по уровню, но более гибкий: поддерживает перегрузки с параметрами иThrowable.Logger.log(Level.SEVERE, String, Object[] params)- позволяет использовать параметризованные сообщения черезjava.text.MessageFormat.Logger.log(Level.SEVERE, String, Throwable)- для записи стека исключения вместе с сообщением; предпочтительнее при логировании исключений.System.err.println- простая альтернатива без уровней и форматирования; подходит для быстрых отладочных сообщений, но не для централизованного логирования.- Сторонние библиотеки (SLF4J + Logback, Log4j) - предлагают более богатую функциональность, шаблоны конфигурирования и лучшую производительность при высоких нагрузках.
Выбор зависит от потребностей: для простых приложений стандартный Logger достаточен, для сложных - предпочтительнее использовать SLF4J/Logback или Log4j с лучшей поддержкой асинхронности и настраиваемых аппендеров.
Аналоги в других языках и их особенности
Краткие примеры альтернатив в популярных языках и отличия от Java-подхода.
PHP
// error_log
error_log("Критическая ошибка: база недоступна");
Результат: сообщение отправляется в системный журнал или указанный в конфигурации файл.
JavaScript (Node.js / браузер)
// В браузере
console.error('Критическая ошибка');
// В Node.js
console.error('Критическая ошибка');
Результат: вывод в консоль с пометкой об ошибке; в браузере отображается в DevTools.
Python
import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)
logger.error('Критическая ошибка')
Результат: ERROR:__main__:Критическая ошибка
C# (.NET)
// Microsoft.Extensions.Logging
logger.LogCritical("Критическая ошибка");
// Простая альтернатива
Console.Error.WriteLine("Критическая ошибка");
Результат: вывод в поток ошибок или в провайдеры логирования, настроенные в приложении.
Go
import "log"
log.Fatal("Критическая ошибка") // вывод и вызов os.Exit(1)
Результат: сообщение в stderr и завершение процесса.
Kotlin
// Используется Java Logger или kotlin-logging
private val logger = java.util.logging.Logger.getLogger("app")
logger.severe("Критическая ошибка")
Результат: аналогично Java.
Lua
io.stderr:write('Критическая ошибка\n')
Результат: вывод в стандартный поток ошибок.
Отличия от Java: в большинстве языков есть простые функции для вывода ошибок, но Java предоставляет встроенную систему уровней, обработчиков и форматтеров, что даёт больше контроля без сторонних библиотек.
Типичные ошибки при использовании
Ниже перечислены распространенные ошибки и сценарии, при которых логирование не даёт ожидаемого результата.
- Ожидание вывода при некорректной конфигурации: если логгер или его родительский логгер имеют уровень выше
SEVERE(например,OFF), сообщения не появятся. - Отсутствие обработчиков: при удалении или неверной настройке Handler'ов сообщения могут не достигать нужного вывода (файла, консоли).
- Использование
severe()для передачи исключения без стека: метод принимает только строку; стек не будет выведен. Пример неправильного подхода:
import java.util.logging.Logger;
public class WrongException {
private static final Logger logger = Logger.getLogger("x");
public static void main(String[] args) {
try {
throw new RuntimeException("oops");
} catch (Exception e) {
logger.severe("Ошибка: " + e); // печатает только e.toString(), без стека
}
}
}
Примерный вывод: SEVERE: Ошибка: java.lang.RuntimeException: oops
Правильнее использовать logger.log(Level.SEVERE, "msg", e), чтобы получить полный стек.
- Неправильная сериализация или много объёмных данных в сообщении - снижение производительности при высокочастотном логировании.
Изменения в последних версиях Java
Метод Logger.severe функционально стабилен и не претерпевал значительных изменений в недавних релизах. Основные изменения, влияющие на поведение логирования в целом, связаны с платформой:
- Java 9 и выше - введение модульной системы повлияло на видимость некоторых внутренних компонентов, но публичный API
java.util.loggingостался доступным. - Мелкие правки в стандартных форматтеров и обработчиках могут менять форматируемый вывод по умолчанию между версиями JVM.
Для совместимости рекомендуется явно настраивать логгирование через logging.properties или программно, а не полагаться полностью на поведение по умолчанию.
Расширенные и редкие варианты применения
Ниже приведены более сложные случаи использования: настройка Handler для файла, форматирование, запись исключений и фильтрация.
1) Запись SEVERE в файл с кастомным Formatter
import java.io.IOException;
import java.util.logging.*;
public class FileLogging {
private static final Logger logger = Logger.getLogger(FileLogging.class.getName());
public static void main(String[] args) throws IOException {
logger.setUseParentHandlers(false);
FileHandler fh = new FileHandler("app.log", true);
fh.setFormatter(new SimpleFormatter());
fh.setLevel(Level.ALL);
logger.addHandler(fh);
logger.severe("Критическая ошибка, записанная в файл");
}
}
Результат: сообщение с уровнем SEVERE и временем записывается в файл app.log в формате SimpleFormatter.
2) Логирование исключения с полным стеком
import java.util.logging.Level;
import java.util.logging.Logger;
public class ExceptionLog {
private static final Logger logger = Logger.getLogger(ExceptionLog.class.getName());
public static void main(String[] args) {
try {
throw new IllegalStateException("Ошибка состояния");
} catch (Exception e) {
logger.log(Level.SEVERE, "Поймано исключение", e);
}
}
}
Примерный вывод:
Apr 22, 2026 10:10:00 AM ExceptionLog main
SEVERE: Поймано исключение
java.lang.IllegalStateException: Ошибка состояния
at ExceptionLog.main(ExceptionLog.java:8)
...
3) Фильтрация сообщений, оставляя только SEVERE
import java.util.logging.*;
public class FilterByLevel {
public static void main(String[] args) {
Logger logger = Logger.getLogger("filter.demo");
logger.setUseParentHandlers(true);
logger.setLevel(Level.ALL);
logger.addHandler(new ConsoleHandler());
logger.setFilter(record -> record.getLevel().intValue() >= Level.SEVERE.intValue());
logger.info("Информационное сообщение");
logger.severe("Только это сообщение будет видно");
}
}
Примерный вывод: SEVERE: Только это сообщение будет видно
4) Мост к SLF4J или Log4j (промежуточная архитектура)
// Пример идеи: использование jul-to-slf4j bridge
// В конфигурации добавляется jul-to-slf4j, после чего вызовы Logger.severe
// перенаправляются в реализацию SLF4J (например, Logback).
// Код приложения при этом остаётся без изменений.
Результат: сообщения уровня SEVERE окажутся в конфигурируемой системе логирования SLF4J/Logback с её форматами и апендерами.
5) Логирование локализованных сообщений через ResourceBundle
import java.util.logging.Logger;
import java.util.logging.Level;
public class Localized {
private static final Logger logger = Logger.getLogger("my.local",
"com.example.messages"); // messages.properties
public static void main(String[] args) {
logger.log(Level.SEVERE, "error.config_missing");
}
}
Результат: сообщение будет взято из пакета ресурсных файлов согласно локали и выведено как SEVERE сообщение.
В продакшене комбинируются фильтры, уровни, кастомные обработчики и форматтеры для получения требуемого поведения при записи критических сообщений. При логировании исключений и важных событий предпочтение обычно отдается методам, которые сохраняют стек и дополнительные параметры.