Skip to content

Support for ECSLayout for elasticsearch-ahc and / or elaticsearch-jest in combination with data streams #84

@thaarbach

Description

@thaarbach

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>

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions