Skip to content

Unique ID Appenders

The unique id appender allows the logging event to carry a unique id. When used in conjunction with SelectAppender or CompositeAppender, this allows for a log record to use the same id across different logs.

For example, in application.log, you'll see a single line that starts with FfwJtsNHYSw6O0Qbm7EAAA:

FfwJtsNHYSw6O0Qbm7EAAA 2020-03-14T05:30:14.965+0000 [INFO ] play.api.db.HikariCPConnectionPool in play-dev-mode-akka.actor.default-dispatcher-7 - Creating Pool for datasource 'logging'

You can search for this string in application.json and see more detail on the log record:

{"id":"FfwJtsNHYSw6O0Qbm7EAAA","relative_ns":20921024,"tse_ms":1584163814965,"start_ms":null,"@timestamp":"2020-03-14T05:30:14.965Z","@version":"1","message":"Creating Pool for datasource 'logging'","logger_name":"play.api.db.HikariCPConnectionPool","thread_name":"play-dev-mode-akka.actor.default-dispatcher-7","level":"INFO","level_value":20000}

See the showcase for an example.

Installation

Add the library dependency using com.tersesystems.logback:logback-uniqueid-appender.

Usage

<appender name="selector-with-unique-id" class="com.tersesystems.logback.uniqueid.UniqueIdComponentAppender">
  <appender ...>

  </appender>
</appender>

To extract the unique ID, register a converter:

<!-- available as "%uniqueId" in a pattern layout -->
<conversionRule conversionWord="uniqueId" converterClass="com.tersesystems.logback.uniqueid.UniqueIdConverter" />

ID Generators

Unique IDs come with several options. Flake ID is the default.

Flake ID Generator

Flake IDs are decentralized and k-ordered, meaning that they are "roughly time-ordered when sorted lexicographically."

This implementation uses idem with Flake128S.

<appender name="selector-with-unique-id" class="com.tersesystems.logback.uniqueid.UniqueIdComponentAppender">
  <idGenerator class="com.tersesystems.logback.uniqueid.FlakeIdGenerator"/>
  <!-- ... -->
</appender>

Random UUID Generator

Generates a Random UUIDv4 using a ThreadLocalRandom according to https://github.com/f4b6a3/uuid-creator.

<appender name="selector-with-unique-id" class="com.tersesystems.logback.uniqueid.UniqueIdComponentAppender">
  <idGenerator class="com.tersesystems.logback.uniqueid.RandomUUIDIdGenerator"/>
  <!-- ... -->
</appender>

TSID Generator

Generates a TSID according to https://github.com/f4b6a3/tsid-creator.

Highly recommended to set a tsidcreator.node system property in your application to configure the node id.

<appender name="selector-with-unique-id" class="com.tersesystems.logback.uniqueid.UniqueIdComponentAppender">
  <idGenerator class="com.tersesystems.logback.uniqueid.TsidIdgenerator"/>
  <!-- ... -->
</appender>

ULID Generator

Creates a monotonic ULID using a threadlocal random according to https://github.com/f4b6a3/ulid-creator.

<appender name="selector-with-unique-id" class="com.tersesystems.logback.uniqueid.UniqueIdComponentAppender">
  <idGenerator class="com.tersesystems.logback.uniqueid.UlidIdGenerator"/>
  <!-- ... -->
</appender>

KSU ID Generator

Creates a subsecond KSUID according to https://github.com/f4b6a3/ksuid-creator.

<appender name="selector-with-unique-id" class="com.tersesystems.logback.uniqueid.UniqueIdComponentAppender">
  <idGenerator class="com.tersesystems.logback.uniqueid.KsuidSubsecondIdGenerator"/>
  <!-- ... -->
</appender>