Apache Log4j Docker Support library that provides Docker container information lookup functionality for Log4j logging framework
npx @tessl/cli install tessl/maven-org-apache-logging-log4j--log4j-docker@2.25.0Apache Log4j Docker Support provides Docker container information lookup functionality for the Log4j logging framework. It enables applications running within Docker containers to access container metadata such as container ID, image information, and network settings through the DockerLookup plugin.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-docker</artifactId>
<version>2.25.1</version>
</dependency>Gradle:
implementation 'org.apache.logging.log4j:log4j-docker:2.25.1'import org.apache.logging.log4j.docker.DockerLookup;
import org.apache.logging.log4j.docker.model.Container;
import org.apache.logging.log4j.docker.model.Network;
import org.apache.logging.log4j.docker.model.NetworkSettings;
import org.apache.logging.log4j.docker.model.Mount;
import org.apache.logging.log4j.docker.model.PortDefinition;
import org.apache.logging.log4j.docker.model.IPAMConfig;The DockerLookup plugin automatically registers with Log4j and can be used in configuration files:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - [${docker:containerId}] %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>Set the DOCKER_URI environment variable or system property to the Docker daemon endpoint:
export DOCKER_URI=http://localhost:2375Or in Java:
System.setProperty("DOCKER_URI", "http://localhost:2375");The main plugin that provides Docker container information to Log4j patterns.
@Plugin(name = "docker", category = StrLookup.CATEGORY)
public class DockerLookup extends AbstractLookup {
public DockerLookup();
public String lookup(LogEvent ignored, String key);
}Supported Lookup Keys:
shortContainerId - Returns the first 12 characters of the container IDcontainerId - Returns the full container IDcontainerName - Returns the container name(s)shortImageId - Returns the first 12 characters of the image IDimageId - Returns the full image IDimageName - Returns the image nameUsage in Log4j configuration:
<PatternLayout pattern="%d - [${docker:shortContainerId}] [${docker:imageName}] %msg%n"/>The library provides comprehensive data models for Docker container information.
public class Container {
public String getId();
public void setId(String id);
public List<String> getNames();
public void setNames(List<String> names);
public String getImage();
public void setImage(String image);
public String getImageId();
public void setImageId(String imageId);
public String getCommand();
public void setCommand(String command);
public Long getCreated();
public void setCreated(Long created);
public List<PortDefinition> getPorts();
public void setPorts(List<PortDefinition> ports);
public Map<String, String> getLabels();
public void setLabels(Map<String, String> labels);
public String getState();
public void setState(String state);
public String getStatus();
public void setStatus(String status);
public HostConfig getHostConfig();
public void setHostConfig(HostConfig hostConfig);
public NetworkSettings getNetworkSettings();
public void setNetworkSettings(NetworkSettings networkSettings);
public List<Mount> getMounts();
public void setMounts(List<Mount> mounts);
}Access to Docker network settings and configuration.
public class NetworkSettings {
public Map<String, Network> getNetworks();
public void setNetworks(Map<String, Network> networks);
public String getBridge();
public void setBridge(String bridge);
public String getSandboxId();
public void setSandboxId(String sandboxId);
public boolean isHairpinMode();
public void setHairpinMode(boolean hairpinMode);
public String getLinkLocalIPv6Address();
public void setLinkLocalIPv6Address(String linkLocalIPv6Address);
public int getLinkLocalIPv6PrefixLen();
public void setLinkLocalIPv6PrefixLen(int linkLocalIPv6PrefixLen);
public Map<String, String> getPorts();
public void setPorts(Map<String, String> ports);
public String getSandboxKey();
public void setSandboxKey(String sandboxKey);
public String getSecondaryIPaddresses();
public void setSecondaryIPaddresses(String secondaryIPaddresses);
public String getEndpointId();
public void setEndpointId(String endpointId);
public String getGateway();
public void setGateway(String gateway);
public String getGlobalIPv6Address();
public void setGlobalIPv6Address(String globalIPv6Address);
public int getGlobalIPv6PrefixLen();
public void setGlobalIPv6PrefixLen(int globalIPv6PrefixLen);
public String getIpAddress();
public void setIpAddress(String ipAddress);
public int getIpPrefixLen();
public void setIpPrefixLen(int ipPrefixLen);
public String getIpv6Gateway();
public void setIpv6Gateway(String ipv6Gateway);
public String getMacAddress();
public void setMacAddress(String macAddress);
}public class Network {
public IPAMConfig getIpamConfig();
public void setIpamConfig(IPAMConfig ipamConfig);
public String getLinks();
public void setLinks(String links);
public String[] getAliases();
public void setAliases(String[] aliases);
public String getNetworkId();
public void setNetworkId(String networkId);
public String getEndpointId();
public void setEndpointId(String endpointId);
public String getGateway();
public void setGateway(String gateway);
public String getIpAddress();
public void setIpAddress(String ipAddress);
public Integer getIpPrefixLen();
public void setIpPrefixLen(Integer ipPrefixLen);
public String getIpv6Gateway();
public void setIpv6Gateway(String ipv6Gateway);
public String getGlobalIPv6Address();
public void setGlobalIPv6Address(String globalIPv6Address);
public Integer getGlobalIPv6PrefixLen();
public void setGlobalIPv6PrefixLen(Integer globalIPv6PrefixLen);
public String getMacAddress();
public void setMacAddress(String macAddress);
public String getDriverOpts();
public void setDriverOpts(String driverOpts);
}Access to Docker volume and bind mount details.
public class Mount {
public String getType();
public void setType(String type);
public String getName();
public void setName(String name);
public String getSource();
public void setSource(String source);
public String getDestination();
public void setDestination(String destination);
public String getDriver();
public void setDriver(String driver);
public String getMode();
public void setMode(String mode);
public Boolean getReadWrite();
public void setReadWrite(Boolean readWrite);
public String getPropagation();
public void setPropagation(String propagation);
}Access to Docker port mapping and networking details.
public class PortDefinition {
public String getIp();
public void setIp(String ip);
public Integer getPrivatePort();
public void setPrivatePort(Integer privatePort);
public Integer getPublicPort();
public void setPublicPort(Integer publicPort);
public String getType();
public void setType(String type);
}Docker host configuration settings are accessible through the Container class, but the HostConfig class itself has no public methods in the current implementation.
Access to Docker network IP address management configuration.
public class IPAMConfig {
public String getSubnet();
public void setSubnet(String subnet);
public String getIpRange();
public void setIpRange(String ipRange);
public String getGateway();
public void setGateway(String gateway);
public String getIpv4Address();
public void setIpv4Address(String ipv4Address);
}The DockerLookup plugin handles connection failures gracefully:
null when Docker information is unavailableWhen Docker information is unavailable, lookup operations return null values, allowing logging to continue normally without Docker context.
This library requires:
<PatternLayout pattern="%d [${docker:shortContainerId}] %level - %msg%n"/><PatternLayout pattern="%d [${docker:containerName}@${docker:imageName}] %level - %msg%n"/>// Application code
Logger logger = LogManager.getLogger(MyApplication.class);
logger.info("Application started in container");
// Output with Docker context:
// 2024-01-15 10:30:45 [abc123456789] INFO - Application started in container