Skip to main content
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

Configure with environment variables

The default config reads these env vars. Set any of them in your deployment to adjust levels without touching the config file:
VariableDefaultControls
LOG4J2_ROOT_LEVELinfoRoot log level for all loggers
LOG4J2_APPENDER_LAYOUTpatternOutput format: pattern (human-readable) or json
LOG4J2_IO_CONDUKTOR_LEVELinfoAll Conduktor application logs
LOG4J2_ORG_APACHE_KAFKA_LEVELwarnKafka client library logs
LOG4J2_IO_VERTX_LEVELwarnVert.x framework logs
LOG4J2_IO_NETTY_LEVELerrorNetty network framework logs
LOG4J2_IO_CONDUKTOR_PROXY_AUTHORIZATION_LEVELinfoAuthorization decision logs
LOG4J2_IO_CONDUKTOR_PROXY_NETWORK_LEVELinfoProxy network connection logs
LOG4J2_IO_CONDUKTOR_UPSTREAM_THREAD_LEVELwarnUpstream broker thread logs
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">

    <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>
    </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>

        <AsyncRoot level="${env:LOG4J2_ROOT_LEVEL}">
            <appender-ref ref="${env:LOG4J2_APPENDER_LAYOUT}"/>
        </AsyncRoot>
    </loggers>
</configuration>