[id="logging-concepts"]
= Logging concepts

Before configuring logging, you should understand what Log4J _loggers_, _log levels_, and _appenders_ are.

[discrete]
== Loggers

Each log message produced by the application is sent to a specific _logger_
(for example, `io.debezium.connector.mysql`).
Loggers are arranged in hierarchies.
For example, the `io.debezium.connector.mysql` logger is the child of the `io.debezium.connector` logger,
which is the child of the `io.debezium` logger.
At the top of the hierarchy,
the _root logger_ defines the default logger configuration for all of the loggers beneath it.

[discrete]
== Log levels

Every log message produced by the application will also have a specific _log level_:

1. `ERROR` - errors, exceptions, and other significant problems
2. `WARN` - _potential_ problems and issues
3. `INFO` - status and general activity (usually low-volume)
4. `DEBUG` - more detailed activity that would be useful in diagnosing unexpected behavior
5. `TRACE` - very verbose and detailed activity (usually very high-volume)

[discrete]
== Appenders

An _appender_ is essentially a destination where log messages will be written.
Each appender controls the format of its log messages,
giving you even more control over what the log messages look like.

To configure logging, you specify the desired level for each logger and the appender(s) where those log messages should be written. Since loggers are hierarchical, the configuration for the root logger serves as a default for all of the loggers below it, although you can override any child (or descendant) logger.
