Documentation Index
Fetch the complete documentation index at: https://docs.conduktor.io/llms.txt
Use this file to discover all available pages before exploring further.
Gateway uses log4j2 for structured logging. By default it writes JSON logs to stdout, which makes it compatible with most log aggregation platforms (Datadog, Loki, Splunk, ELK).
You can tune logging behavior in two ways:
- Environment variables — adjust log levels for specific packages without redeploying a config file
- Config file — full control over appenders, patterns, and per-logger levels
The default config reads these env vars. Set any of them in your deployment to adjust levels without touching the config file:
| Variable | Default | Controls |
|---|
LOG4J2_ROOT_LEVEL | info | Root log level for all loggers |
LOG4J2_APPENDER_LAYOUT | pattern | Output format: pattern (human-readable) or json |
LOG4J2_TIME_FORMAT | yyyy-MM-dd'T'HH:mm:ss.SSSZ | Timestamp format in log output |
LOG4J2_IO_CONDUKTOR_LEVEL | info | All Conduktor application logs |
LOG4J2_IO_CONDUKTOR_PROXY_AUTHORIZATION_LEVEL | info | Authorization decision logs |
LOG4J2_IO_CONDUKTOR_PROXY_NETWORK_LEVEL | info | Proxy network connection logs |
LOG4J2_IO_CONDUKTOR_PROXY_REBUILDER_COMPONENTS_LEVEL | info | Proxy rebuilder component logs |
LOG4J2_IO_CONDUKTOR_PROXY_SERVICE_LEVEL | info | Proxy service logs |
LOG4J2_IO_CONDUKTOR_UPSTREAM_THREAD_LEVEL | warn | Upstream broker thread logs |
LOG4J2_ORG_APACHE_KAFKA_LEVEL | warn | Kafka client library logs |
LOG4J2_IO_KCACHE_LEVEL | warn | KCache library logs |
LOG4J2_IO_VERTX_LEVEL | warn | Vert.x framework logs |
LOG4J2_IO_CONFLUENT_LEVEL | warn | Confluent library logs |
LOG4J2_IO_NETTY_LEVEL | error | Netty network framework logs |
LOG4J2_IO_MICROMETER_LEVEL | error | Micrometer metrics framework logs |
LOG4J2_COM_FORTANIX_LEVEL | off | Fortanix SDK logs (suppressed by default) |
To switch to JSON output for log aggregation, set LOG4J2_APPENDER_LAYOUT=json.
Use a config file
To further customize your logging at an individual logger-level, you can use a custom log4j configuration file.
First, bind your custom log4j configuration file to the /app/resources/log4j2.xml path in the container.
Here’s the default configuration file:
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn" shutdownHook="disable">
<Properties>
<Property name="LOG4J2_TIME_FORMAT">yyyy-MM-dd'T'HH:mm:ss.SSSZ</Property>
<Property name="LOG4J2_APPENDER_LAYOUT">pattern</Property>
<Property name="LOG4J2_ROOT_LEVEL">info</Property>
<Property name="LOG4J2_ORG_APACHE_KAFKA_LEVEL">warn</Property>
<Property name="LOG4J2_IO_KCACHE_LEVEL">warn</Property>
<Property name="LOG4J2_IO_VERTX_LEVEL">warn</Property>
<Property name="LOG4J2_IO_NETTY_LEVEL">error</Property>
<Property name="LOG4J2_IO_CONDUKTOR_LEVEL">info</Property>
<Property name="LOG4J2_IO_CONDUKTOR_PROXY_AUTHORIZATION_LEVEL">info</Property>
<Property name="LOG4J2_IO_CONDUKTOR_PROXY_REBUILDER_COMPONENTS_LEVEL">info</Property>
<Property name="LOG4J2_IO_CONDUKTOR_PROXY_SERVICE_LEVEL">info</Property>
<Property name="LOG4J2_IO_CONDUKTOR_PROXY_NETWORK_LEVEL">info</Property>
<Property name="LOG4J2_IO_CONDUKTOR_UPSTREAM_THREAD_LEVEL">warn</Property>
<Property name="LOG4J2_IO_MICROMETER_LEVEL">error</Property>
<Property name="LOG4J2_IO_CONFLUENT_LEVEL">warn</Property>
<Property name="LOG4J2_COM_FORTANIX_LEVEL">off</Property>
</Properties>
<appenders>
<Console name="json" target="SYSTEM_OUT">
<JsonLayout complete="false" compact="true" eventEol="true" properties="true"
objectMessageAsJsonObject="true">
<KeyValuePair key="timestamp" value="$${date:${env:LOG4J2_TIME_FORMAT}}"/>
</JsonLayout>
</Console>
<Console name="pattern" target="SYSTEM_OUT">
<PatternLayout pattern="%d{${env:LOG4J2_TIME_FORMAT}} [%red{%10.25t}] [%green{%-5p}] [%blue{%c{1}:%L}] - %m%n"/>
</Console>
</appenders>
<loggers>
<logger name="org.apache.kafka" level="${env:LOG4J2_ORG_APACHE_KAFKA_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.kcache" level="${env:LOG4J2_IO_KCACHE_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.vertx" level="${env:LOG4J2_IO_VERTX_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.netty" level="${env:LOG4J2_IO_NETTY_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.conduktor" level="${env:LOG4J2_IO_CONDUKTOR_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.conduktor.proxy.authorization" level="${env:LOG4J2_IO_CONDUKTOR_PROXY_AUTHORIZATION_LEVEL}"
additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.conduktor.proxy.rebuilder.components"
level="${env:LOG4J2_IO_CONDUKTOR_PROXY_REBUILDER_COMPONENTS_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.conduktor.proxy.service" level="${env:LOG4J2_IO_CONDUKTOR_PROXY_SERVICE_LEVEL}"
additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.conduktor.proxy.thread.UpstreamThread" level="${env:LOG4J2_IO_CONDUKTOR_UPSTREAM_THREAD_LEVEL}"
additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.conduktor.proxy.network" level="${env:LOG4J2_IO_CONDUKTOR_PROXY_NETWORK_LEVEL}"
additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.micrometer" level="${env:LOG4J2_IO_MICROMETER_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="org.hibernate.validator.internal.util" level="ERROR" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<logger name="io.confluent" level="${env:LOG4J2_IO_CONFLUENT_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<!-- Suppress Fortanix SDK logs -->
<logger name="com.fortanix" level="${env:LOG4J2_COM_FORTANIX_LEVEL}" additivity="false">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</logger>
<AsyncRoot level="${env:LOG4J2_ROOT_LEVEL}">
<appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
</AsyncRoot>
</loggers>
</configuration>