Logging

In order to successfully run an Axon Ivy Engine, you need to be prepared in case of errors or even failures. Therefore mission critical events are logged. Each event has a level:

  • FATAL systems runs partially or not at all

  • ERROR something is not working properly

  • WARNING warning which can lead someday to an error

  • INFO neutral message

  • DEBUG/TRACE low-level events, needed for troubleshooting

Axon Ivy comes with a sophisticated default log configuration which logs all warning, error and fatal events in the logs directory of the Axon Ivy Engine. The log files will be rotated and compressed every day.

Keep in mind that an unfavorable log configuration can lead to failures. For example, if the root log level is set to DEBUG, so many logs are written that the engine has no more resources for other tasks.

Customization

The logging configuration can be fully customized to your needs. For example, you can change the log level of a logger so that the log events are logged in a log file. Therefore you need to know that Axon Ivy uses Log4j 2 for logging and comes with a built-in default configuration which can be customized by providing a configuration in [engineDir]/configuration/log4j2.xml. The custom configuration will be merged with the default configuration automatically on the fly.

Runtime Log

The Runtime Log is a well-known designer feature and disabled by default in the Axon Ivy Engine to prevent a flood of log messages, which can decrease performance and filling the disk. But you can set the log level of a specific runtime logger and bring them even to another file to get the logs also on the Axon Ivy Engine.

The name of the runtime logger has a well defined format:

runtimelog.[app name].[process model name].[category]

Example:

 1<?xml version="1.0" encoding="UTF-8"?>
 2<Configuration>
 3  <!-- custom appender for the Runtime Log which will log in file logs/runtime.log -->
 4  <Appenders>
 5    <RollingRandomAccessFile name="RuntimeLog" fileName="logs/runtime.log" filePattern="logs/runtime-%d{MM-dd-yyyy}.log.gz" ignoreExceptions="false">
 6      <PatternLayout pattern="${pattern}" />
 7      <TimeBasedTriggeringPolicy />
 8    </RollingRandomAccessFile>
 9  </Appenders>
10
11   <Loggers>
12    <!-- example to log runtime logs of application 'myapp' and process model 'hrm' -->
13    <!-- will only pass logs to the appender with RuntimeLog -->
14    <Logger name="runtimelog.myapp.hrm" level="debug" includeLocation="false" additivity="false">
15      <AppenderRef ref="RuntimeLog" />
16    </Logger>
17  </Loggers>
18</Configuration>

All available categories [category] are defined in the RuntimeLogCategory. Write them in lower case e.g. <Logger name="runtimelog.myapp.hrm.rest_client">.

Log format

A single event can be found as a log entry in the format [datetime][level][logger name][thread name]{context infos} followed by the message itself like:

[2020-09-15 11:19:30.351][DEBUG][ch.ivyteam.ivy.performance.classgraph][http-nio-8080-exec-10]{application=system, client=127.0.0.1, executionContext=SYSTEM, pmv=system$engine-cockpit$1, request=, requestId=79, session=1}
Annotation scanning for javax.faces.validator.FacesValidator in engine-cockpit-.iar.zip took 20ms