Skip to main content


The Java SDK uses log4j2 as logging facade. To enable logging, add log4j2-core to the dependencies. For example, for Gradle:


And configure the logging adding the file resources/

# Set to debug or trace if log4j initialization is failing
status = warn
# Console appender configuration
appender.console.type = Console = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %notEmpty{[%X{restateInvocationTarget}]}%notEmpty{[%X{restateInvocationId}]} %c - %m%n
# Filter out logging during replay
appender.console.filter.replay.type = ContextMapFilter
appender.console.filter.replay.onMatch = DENY
appender.console.filter.replay.onMismatch = NEUTRAL
appender.console.filter.replay.0.type = KeyValuePair
appender.console.filter.replay.0.key = restateInvocationStatus
appender.console.filter.replay.0.value = REPLAYING
# Restate logs to debug level = dev.restate = info = false = consoleLogger
# Root logger
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = consoleLogger

If you want to do filtering of the logs, you can use log4j2 filters.

Logging on the INFO level is enough for most use cases, but you can set the log level of the dev.restate classes to DEBUG and TRACE if you want more info about the internal SDK operations.

The SDK injects the following additional metadata to the logging context that can be used for filtering as well:

  • restateInvocationTarget: Invocation Target, e.g. counter.Counter/Add.
  • restateInvocationId: Invocation ID.
  • restateInvocationStatus: Invocation status, can be WAITING_START, REPLAYING, PROCESSING, CLOSED.