// This assembly is included in the following assemblies:
//
// assembly-deployment-configuration-kafka.adoc

[id='con-kafka-logging-{context}']
= Kafka loggers

Kafka has its own configurable loggers:

* `log4j.logger.org.I0Itec.zkclient.ZkClient`
* `log4j.logger.org.apache.zookeeper`
* `log4j.logger.kafka`
* `log4j.logger.org.apache.kafka`
* `log4j.logger.kafka.request.logger`
* `log4j.logger.kafka.network.Processor`
* `log4j.logger.kafka.server.KafkaApis`
* `log4j.logger.kafka.network.RequestChannel$`
* `log4j.logger.kafka.controller`
* `log4j.logger.kafka.log.LogCleaner`
* `log4j.logger.state.change.logger`
* `log4j.logger.kafka.authorizer.logger`

ZooKeeper also has a configurable logger:

* `zookeeper.root.logger`

Kafka and ZooKeeper use the Apache `log4j` logger implementation.

Operators use the Apache `log4j2` logger implementation, so the logging configuration is described inside the ConfigMap using `log4j2.properties`.
For more information, see xref:con-entity-operator-logging-{context}[].

Use the `logging` property to configure loggers and logger levels.

You can set the log levels by specifying the logger and level directly (inline) or use a custom (external) ConfigMap.
If a ConfigMap is used, you set `logging.name` property to the name of the ConfigMap containing the external logging configuration. Inside the ConfigMap, the logging configuration is described using `log4j.properties`.

Here we see examples of `inline` and `external` logging.

.Inline logging
[source,yaml,subs="+quotes,attributes"]
----
apiVersion: {KafkaApiVersion}
kind: Kafka
spec:
  # ...
  kafka:
    # ...
    logging:
      type: inline
      loggers:
        kafka.root.logger.level: "INFO"
  # ...
  zookeeper:
    # ...
    logging:
      type: inline
      loggers:
        zookeeper.root.logger: "INFO"
  # ...
  entityOperator:
    # ...
    topicOperator:
      # ...
      logging:
        type: inline
        loggers:
          rootLogger.level: INFO
    # ...
    userOperator:
      # ...
      logging:
        type: inline
        loggers:
          rootLogger.level: INFO
    # ...
----

.External logging
[source,yaml,subs="+quotes,attributes"]
----
apiVersion: {KafkaApiVersion}
kind: Kafka
spec:
  # ...
  logging:
    type: external
    name: customConfigMap
  # ...
----

Changes to both external and inline logging levels will be applied to Kafka brokers without a restart.

.Additional resources

* Garbage collector (GC) logging can also be enabled (or disabled). For more information on garbage collection, see xref:ref-jvm-options-deployment-configuration-kafka[]
* For more information about log levels, see {ApacheLoggers}.
