Logger.severe: примеры (JAVA)

Logger.severe: сведения и примеры
Раздел: Логирование
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

Пример java
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) Логирование исключения с полным стеком

Пример java
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

Пример java
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 (промежуточная архитектура)

Пример java
// Пример идеи: использование jul-to-slf4j bridge
// В конфигурации добавляется jul-to-slf4j, после чего вызовы Logger.severe
// перенаправляются в реализацию SLF4J (например, Logback).
// Код приложения при этом остаётся без изменений.
Результат: сообщения уровня SEVERE окажутся в конфигурируемой системе логирования SLF4J/Logback с её форматами и апендерами.

5) Логирование локализованных сообщений через ResourceBundle

Пример java
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 сообщение.

В продакшене комбинируются фильтры, уровни, кастомные обработчики и форматтеры для получения требуемого поведения при записи критических сообщений. При логировании исключений и важных событий предпочтение обычно отдается методам, которые сохраняют стек и дополнительные параметры.

джава Logger.severe function comments

En
Logger.severe Запись сообщения об ошибке