Here’s a concise summary of Java’s built‑in logging API (java.util.logging), which is part of the standard JDK and requires no external libraries.
java.util.logging Overview
The java.util.logging package provides a lightweight, built‑in logging framework for Java applications.
Its main purpose is to record messages for debugging, monitoring, and auditing.
Core Classes & Interfaces
Class / Interface | Purpose |
|---|---|
Logger | Main entry point for logging messages. Supports different log levels and hierarchical naming. |
Level | Defines standard logging levels ( SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST, OFF, ALL). |
Handler | Abstract base for output destinations (e.g., console, file, socket). |
ConsoleHandler | Sends log output to the console ( System.err by default). |
FileHandler | Writes log messages to files (supports rotation). |
Formatter | Formats log records into text. |
SimpleFormatter | Default human‑readable text format. |
XMLFormatter | Outputs logs in XML format. |
LogRecord | Encapsulates a single log event (message, level, timestamp, etc.). |
LogManager | Manages global logging configuration and logger instances. |
Filter | Allows filtering of log records before they are published. |
Basic Usage Example
import java.util.logging.*;
public class LoggingExample {
private static final Logger logger = Logger.getLogger(LoggingExample.class.getName());
public static void main(String[] args) {
// Set log level
logger.setLevel(Level.INFO);
// Log messages at different levels
logger.severe("Severe message");
logger.warning("Warning message");
logger.info("Info message");
logger.fine("Fine message (won't show unless level is set lower)");
}
}Key Features
- Built‑in: No external dependencies.
- Configurable via code or
logging.propertiesfile. - Multiple outputs: Console, file, network.
- Hierarchical loggers: Loggers inherit settings from parent loggers.
- Custom handlers & formatters supported.
here’s a complete, runnable Java example that logs to both console and file with a custom formatter.
It uses only the standard java.util.logging package, so no extra libraries are needed.
Java Logging Example (Console + File with Custom Format)
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;import java.util.logging.*;
// Custom formatter for log messages
class MyCustomFormatter extends Formatter {
private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
@Override public String format(LogRecord record) {
String timestamp = new SimpleDateFormat(DATE_FORMAT).format(new Date(record.getMillis()));
return String.format("[%s] [%s] %s - %s%n",
timestamp,
record.getLevel().getName(),
record.getLoggerName(),
record.getMessage()
);
}
}
public class LoggingDemo {
private static final Logger logger = Logger.getLogger(LoggingDemo.class.getName());
public static void main(String[] args) {
try {
setupLogger();
// Example log messages
logger.severe("This is a SEVERE message");
logger.warning("This is a WARNING message");
logger.info("This is an INFO message");
logger.fine("This is a FINE message (won't show unless level is set lower)");
} catch (IOException e) {
System.err.println("Failed to set up logger: " + e.getMessage());
}
}
private static void setupLogger() throws IOException {
// Remove default console handler from root logger
LogManager.getLogManager().reset();
// Set logger level
logger.setLevel(Level.ALL);
// Create custom formatter
Formatter formatter = new MyCustomFormatter();
// Console handler
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.INFO);
// Show INFO and above in console
consoleHandler.setFormatter(formatter);
// File handler (append mode, limit 1MB, 3 rotating files)
FileHandler fileHandler = new FileHandler("app.log", 1024 * 1024, 3, true);
fileHandler.setLevel(Level.ALL);
// Log everything to file
fileHandler.setFormatter(formatter);
// Add handlers to logger
logger.addHandler(consoleHandler);
logger.addHandler(fileHandler);
}
}How It Works
- Custom Formatter (
MyCustomFormatter)- Formats logs as:
[2025-12-17 14:35:12] [INFO] LoggingDemo - This is an INFO message
- Formats logs as:
- ConsoleHandler
- Outputs logs to the console (
System.errby default). - Configured to show only
INFOand above.
- Outputs logs to the console (
- FileHandler
- Writes logs to
app.logwith rotation (max 1MB per file, keep 3 files). - Logs all levels.
- Writes logs to
- LogManager Reset
- Removes default handlers so we can fully control output.
Example Output
Console:
[2025-12-17 14:35:12] [SEVERE] LoggingDemo - This is a SEVERE message
[2025-12-17 14:35:12] [WARNING] LoggingDemo - This is a WARNING message
[2025-12-17 14:35:12] [INFO] LoggingDemo - This is an INFO messageFile (app.log):
[2025-12-17 14:35:12] [SEVERE] LoggingDemo - This is a SEVERE message
[2025-12-17 14:35:12] [WARNING] LoggingDemo - This is a WARNING message
[2025-12-17 14:35:12] [INFO] LoggingDemo - This is an INFO message
[2025-12-17 14:35:12] [FINE] LoggingDemo - This is a FINE message (won't show unless level is set lower)