-
Notifications
You must be signed in to change notification settings - Fork 42
Open
Labels
Description
Description
Support ECSLayout with log4j2-elasticsearch-ahc and/or log4j2-elasticsearch-jest
Why: If using appender in a centralized logging setup in combination with elastic-apm in a clustered environment it is much easier to setup the appender. Adding fields provided by the elastic-apm e.g. client.ip, trace.id, transaction.id, http.*, error.*
etc. with VirtualProperties <VirtualProperty name="client.ip" value="$${ctx:client.ip}"/>
doesn't work.
We have also tried to setup the appender with JestHttp with the use of data streams which won't work. maybe an configuration.
Configuration ahc
<Appenders>
<Elasticsearch name="elasticsearch">
<JacksonJsonLayout>
<JacksonMixIn targetClass="org.apache.logging.log4j.core.LogEvent" mixInClass="org.appenders.log4j2.elasticsearch.json.jackson.LogEventJacksonEcsJsonMixIn"/>
<NonEmptyFilter/>
<VirtualProperty name="host.name" value="$${sys:hostName}.example.de"/>
<VirtualProperty name="service.version" value="$${sys:elastic.apm.service_version}"/>
<VirtualProperty name="service.name" value="$${sys:elastic.apm.service_name}"/>
<VirtualProperty name="data_stream.type" value="logs"/>
<VirtualProperty name="data_stream.dataset" value="$${sys:elastic.apm.service_name}.example.de"/>
<VirtualProperty name="data_stream.namespace" value="$${sys:elastic.apm.environment}.example.de"/>
<VirtualProperty name="client.ip" value="$${ctx:client.ip}"/>
<PooledItemSourceFactory poolName="itemPool"
itemSizeInBytes="1024"
maxItemSizeInBytes="8192"
initialPoolSize="500"
monitored="true"
monitorTaskInterval="10000"
resizeTimeout="500">
<UnlimitedResizePolicy resizeFactor="0.6"/>
</PooledItemSourceFactory>
</JacksonJsonLayout>
<AsyncBatchDelivery batchSize="500" eliveryInterval="5000">
<IndexTemplate apiVersion="8" name="log4j2-${sys:elastic.apm.service_name}" path="classpath:composableIndexTemplate.json"/>
<ILMPolicy name="logs" createBootstrapIndex="false">
{}
</ILMPolicy>
<AHCHttp name="http-main"
connTimeout="500"
readTimeout="30000"
gzipCompression="true"
maxTotalConnections="8"
serverUris="http://localhost:9200">
<PooledItemSourceFactory poolName="batchPool"
itemSizeInBytes="5120000"
initialPoolSize="10"
resizeTimeout="500">
<UnlimitedResizePolicy resizeFactor="0.70"/>
</PooledItemSourceFactory>
<ElasticsearchDataStream />
<BatchLimitBackoffPolicy maxBatchesInFlight="4"/>
<ServiceDiscovery
refreshInterval="5000"
configPolicies="serverList">
</ServiceDiscovery>
</AHCHttp>
</AsyncBatchDelivery>
Configuration JestHttp
<Appenders>
<Elasticsearch name="elasticsearch">
<ECSLayout serviceName="${sys:elastic.apm.service_name}" eventDataset="${sys:elastic.apm.service_name}.log">
<KeyValuePair key="host.name" value="${sys:hostName}.example.de"/>
<KeyValuePair key="service.version" value="${sys:elastic.apm.service_version}"/>
<KeyValuePair key="data_stream.type" value="logs"/>
<KeyValuePair key="data_stream.dataset" value="${sys:elastic.apm.service_name}"/>
<KeyValuePair key="data_stream.namespace" value="${sys:elastic.apm.environment}"/>
</ECSLayout>
<IndexName indexName="log4j2-${sys:elastic.apm.service_name}"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT"/>
<AsyncBatchDelivery deliveryInterval="5000" batchSize="500" shutdownDelatMillis="10000">
<IndexTemplate apiVersion="8" name="log4j2-${sys:elastic.apm.service_name}" path="classpath:composableIndexTemplate.json"/>
<ILMPolicy name="logs" createBootstrapIndex="false">
{}
</ILMPolicy>
<JestHttp serverUris="http://localhost:9200" dataStreamsEnabled="true"/>
<AppenderRefFailoverPolicy>
<AppenderRef ref="stderr"/>
</AppenderRefFailoverPolicy>
</AsyncBatchDelivery>
</Elasticsearch>
</Appenders>
Additional
ILMPolicy with createBootstapIndex
only works, if an empty template is provided
<ILMPolicy name="logs" createBootstrapIndex="false">
{}
</ILMPolicy>