Skip to main content

User operation log

The user operation log contains entries for many API operations and can be used for auditing purposes. It provides data on what kind of operations are performed as well as details on the changes involved in the operation. Operations are logged when the operation is performed in the context of a logged in user. To use the operation log, the process engine history level must be set to FULL.

Write log entries regardless of user authentication context​

If it is desired that operations are logged regardless whether they are performed in the context of a logged in user or not, then the process engine configuration flag named restrictUserOperationLogToAuthenticatedUsers can be set to false.

Access the user operation log​

The user operation log can be accessed via the Java API. The history service can be used to execute a UserOperationLogQuery by calling historyService.createUserOperationLogQuery().execute(). The query can be restricted with various filtering options. The query is also restref page="queryUserOperationEntries" text="exposed in the REST API" tag="Historic-User-Operation-Log.

User operation log entries​

The log consists of operations and entries. An operation corresponds to one performed action and consists of multiple entries, at least one. Entries contain the detailed changes being part of the operation. When making a user operation log query, the returned entities are of type UserOperationLogEntry, corresponding to entries. All entries of one operation are linked by an operation id.

A user operation log entry has the following properties:

  • Operation ID: A generated id that uniquely identifies a performed operation. Multiple log entries that are part of one operation reference the same operation ID.
  • Operation Type: The name of the performed operation. Available operation types are listed in the interface org.operaton.bpm.engine.history.UserOperationLogEntry. Note that one operation can consist of multiple types, for example a cascading API operation is one user operation, but is split into multiple types of operations.
  • Entity Type: An identifier of the type of the entity that was addressed by the operation. Available entity types are listed in the class org.operaton.bpm.engine.EntityTypes. Like the operation type, one operation may address more than one type of entity.
  • Category: The name of the category the operation is associated with. Available categories are listed in the interface org.operaton.bpm.engine.history.UserOperationLogEntry. For example, all task related runtime operations like claiming and completing tasks fall into the category .
  • Annotation: An arbitrary text annotation set by a user for auditing reasons. Multiple log entries that belong to an operation have the same annotation.
  • Entity IDs: A job log entry contains the entity IDs that serve to identify the entities addressed by the operation. For example, an operation log entry on a task contains the id of the task as well as the id of the process instance the task belongs to. As a second example, a log entry for suspending all process instances of a process definition does not contain individual process instance IDs but only the process definition ID.
  • User ID: The ID of the user who performed the operation.
  • Timestamp: The time at which the operation was performed.
  • Changed Property: A user operation may change multiple properties. For example, suspension of a process instance changes the suspension state property. A log entry is created for each changed property involved in an operation.
  • Old Property Value: The previous value of the changed property. A null value either indicates that the property was previously null or is not known.
  • New Property Value: The new value of the changed property.

Annotation of user operation logs​

User Operation Logs are helpful to audit manual operations. To make it obvious why a certain operation was performed, sometimes it is not enough to only log technical information (e. g. timestamp, operation type, etc.) but also add an annotation that puts the operation in the right business context.

You can directly pass an annotation for the following operations:

You can also set an annotation to an operation log which is already present:

An annotation can be set and cleared via Java API:

String operationId = historyService.createUserOperationLogQuery()
.singleResult()
.getOperationId();

String annotation = "Instances restarted due to wrong turn";
historyService.setAnnotationForOperationLogById(operationId, annotation);

historyService.clearAnnotationForOperationLogById(operationId);

Please note: Annotations are present on all entries that belong to an operation log.

Please also see the REST API reference for restref page="setAnnotationUserOperationLog" text="setting" tag="Historic-User-Operation-Log and restref page="clearAnnotationUserOperationLog" text="clearing" tag="Historic-User-Operation-Log annotations.

Glossary of operations logged in the user operation log​

The following describes the operations logged in the user operation log and the entries that are created as part of it:

Entity TypeOperation TypeCategoryProperties
TaskAssignTaskWorker
  • assignee: The id of the user who was assigned to the task
ClaimTaskWorker
  • assignee: The id of the user who claimed the task
CompleteTaskWorker
  • delete: The new delete state, true
CreateTaskWorkerNo additional property is logged
DelegateTaskWorker

When delegating a task, three log entries are created, containing one of the following properties:

  • delegation: The resulting delegation state, PENDING
  • owner: The original owner of the task
  • assignee: The user this task has been assigned to
DeleteTaskWorker
  • delete: The new delete state, true
ResolveTaskWorker
  • delegation: The resulting delegation state, RESOLVED
SetOwnerTaskWorker
  • owner: The new owner of the task
SetPriorityTaskWorker
  • priority: The new priority of the task
UpdateTaskWorker

The manually changed property of a task, where manually means that a property got directly changed. Claiming a task via the TaskService wouldn't be logged with an update entry, but setting the assignee directly would be. One of the following is possible:

  • description: The new description of the task
  • owner: The new owner of the task
  • assignee: The new assignee to the task
  • dueDate: The new due date of the task
DeleteHistoryOperator
  • nrOfInstances: the amount of decision instances that were deleted
  • async: by default false since the operation can only be performed synchronously
ProcessInstanceCreateOperatorNo additional property is logged
ActivateOperator
  • suspensionState: The new suspension state, active
DeleteOperator

In case of regular operation:

    No additional property is logged
In case of batch operation:

  • nrOfInstances: the amount of process instances that were deleted
  • async: true if operation was performed asynchronously as a batch, false if operation was performed synchronously
  • deleteReason: the reason for deletion
  • type: history in case of deletion of historic process instances
ModifyProcessInstanceOperator
  • nrOfInstances: The amount of process instances modified
  • async: true if modification was performed asynchronously as a batch, false if modification was performed synchronously
  • processDefinitionVersion: The version of the process definition
SuspendOperator
  • suspensionState: The new suspension state, suspended
MigrateOperator
  • processDefinitionId: The id of the process definition that instances are migrated to
  • nrOfInstances: The amount of process instances migrated
  • nrOfVariables: The amount of set variables. Only present when variables were set
  • async: true if migration was performed asynchronously as a batch, false if migration was performed synchronously
RestartProcessInstanceOperator
  • nrOfInstances: The amount of process instances restarted
  • async: true if restart was performed asynchronously as a batch, false if restart was performed synchronously
DeleteHistoryOperator
  • nrOfInstances: the amount of process instances that were deleted
  • async: true if operation was performed asynchronously as a batch, false if operation was performed synchronously
  • deleteReason: the reason for deletion. This property exists only if the operation was performed asynchronously
CreateIncidentOperator
  • incidentType: The type of incident that was created
  • configuration: The configuration of the incident that was created
ResolveOperator
  • incidentId: The id of the incident that was resolved
SetRemovalTimeOperator
  • async: true if operation was performed asynchronously as a batch
  • nrOfInstances: The amount of updated instances
  • removalTime: The date of which an instance shall be removed
  • mode: CALCULATED_REMOVAL_TIME if the removal time was calculated, ABSOLUTE_REMOVAL_TIME if the removal time was set explicitly, CLEARED_REMOVAL_TIME if the removal time was cleared

  • hierarchical: true if the removal time was set across the hiearchy, false if the hierarchy was neglected

SetVariablesOperator
  • async: true if operation was performed asynchronously as a batch
  • nrOfInstances: The amount of affected instances
  • nrOfVariables: The amount of set variables
CorrelateMessageOperator
  • async: true if operation was performed asynchronously as a batch
  • nrOfInstances: The amount of affected instances
  • nrOfVariables: The amount of set variables
  • messageName: The name of the correlated message
IncidentSetAnnotationOperator
  • incidentId: the id of the annotated incident
ClearAnnotationOperator
  • incidentId: the id of the annotated incident
IdentityLinkAddUserLinkTaskWorker
  • candidate: The new candidate user associated
DeleteUserLinkTaskWorker
  • candidate: The previously associated user
AddGroupLinkTaskWorker
  • candidate: The new group associated
DeleteGroupLinkTaskWorker
  • candidate: The previously associated group
AttachmentAddAttachmentTaskWorker
  • name: The name of the added attachment
DeleteAttachmentTaskWorker
  • name: The name of the deleted attachment
JobDefinitionActivateJobDefinitionOperator
  • suspensionState: the new suspension state active
SetPriorityOperator
  • overridingPriority: the new overriding job priority. Is null, if the priority was cleared.
SuspendJobDefinitionOperator
  • suspensionState: the new suspension state suspended
ProcessDefinitionActivateProcessDefinitionOperator
  • suspensionState: the new suspension state active
SuspendProcessDefinitionOperator
  • suspensionState: the new suspension state suspended
DeleteOperator
  • cascade: if the value is set to true, then all instances including history are also deleted.
UpdateHistoryTimeToLiveOperator
  • historyTimeToLive: the new history time to live.
DecisionDefinitionUpdateHistoryTimeToLiveOperator
  • historyTimeToLive: the new history time to live.
  • decisionDefinitionId: the id of the decision definition whose history time to live is updated.
  • decisionDefinitionKey: the key of the decision definition whose history time to live is updated.
EvaluateOperator
  • decisionDefinitionId: the id of the decision definition that was evaluated.
  • decisionDefinitionKey: the key of the decision definition that was evaluated.
CaseDefinitionUpdateHistoryTimeToLiveOperator
  • historyTimeToLive: the new history time to live.
  • caseDefinitionKey: the key of the case definition whose history time to live is updated.
JobActivateJobOperator
  • suspensionState: the new suspension state active
SetPriorityOperator
  • priority: the new priority of the job
SetJobRetriesOperator
  • retries: the new number of retries
  • nrOfInstances: the number of jobs that were updated.
  • async: true if operation was performed asynchronously as a batch, false if operation was performed synchronously
SuspendJobOperator
  • suspensionState: the new suspension state suspended
  • async: true if operation was performed asynchronously as a batch, false if operation was performed synchronously
ExecuteOperatorNo additional property is logged
DeleteOperatorNo additional property is logged
SetDueDateOperator
  • duedate: the new due date of the job
RecalculateDueDateOperator
  • creationDateBased: if the value is set to true, the new due date was calculated based on the creation date of the job. Otherwise, it was calculated using the date the recalcuation took place.
  • duedate: the new due date of the job
CreateHistoryCleanupJobsOperator
  • immediatelyDue: true if the operation was performed immediately, false if the operation was scheduled regularly
VariableModifyVariableOperator/
TaskWorker
No additional property is logged
RemoveVariableOperator/
TaskWorker
No additional property is logged
SetVariableOperator/
TaskWorker
No additional property is logged
DeleteHistoryOperator

In case of single operation:

  • name: the name of the variable whose history was deleted

In case of list operation by process instance:

    No additional property is logged

DeploymentCreateOperator
  • duplicateFilterEnabled: if the value is set to true, then during the creation of the deployment the given resources have been checked for duplicates in the set of previous deployments. Otherwise, the duplicate filtering has been not executed.
  • deployChangedOnly: this property is only logged when duplicateFilterEnabled is set to true. If the property value is set to true then only changed resources have been deployed. Otherwise, all resources are redeployed if any resource has changed.
DeleteOperator
  • cascade: if the value is set to true, then all instances including history are also deleted.
BatchActivateBatchOperator
  • suspensionState: the new suspension state active
SuspendBatchOperator
  • suspensionState: the new suspension state suspended
DeleteOperator
  • cascadeToHistory: true if historic data related to the batch job is deleted as well, false if only the runtime data is deleted.
DeleteHistoryOperatorNo additional property is logged
SetRemovalTimeOperator
  • async: true if operation was performed asynchronously as a batch
  • nrOfInstances: The amount of updated instances
  • removalTime: The date of which an instance shall be removed
  • mode: CALCULATED_REMOVAL_TIME if the removal time was calculated, ABSOLUTE_REMOVAL_TIME if the removal time was set explicitly, CLEARED_REMOVAL_TIME if the removal time was cleared

ExternalTaskSetExternalTaskRetriesOperator
  • retries: the new number of retries
  • nrOfInstances: the amount of external tasks that were updated
  • async: true if operation was performed asynchronously as a batch, false if operation was performed synchronously
SetPriorityOperator
  • priority: the new priority
UnlockOperatorNo additional property is logged
DecisionInstanceDeleteHistoryOperator
  • nrOfInstances: the amount of decision instances that were deleted
  • async: true if operation was performed asynchronously as a batch, false if operation was performed synchronously
  • deleteReason: the reason for deletion. This property exists only if operation was performed asynchronously
SetRemovalTimeOperator
  • async: true if operation was performed asynchronously as a batch
  • nrOfInstances: The amount of updated instances
  • removalTime: The date of which an instance shall be removed
  • mode: CALCULATED_REMOVAL_TIME if the removal time was calculated, ABSOLUTE_REMOVAL_TIME if the removal time was set explicitly, CLEARED_REMOVAL_TIME if the removal time was cleared

  • hierarchical: true if the removal time was set across the hiearchy, false if the hierarchy was neglected

CaseInstanceDeleteHistoryOperator
  • nrOfInstances: The amount of case instances that were deleted. Only present if executed in bulk delete.
MetricsDeleteOperator
  • timestamp: The date for which all metrics older than that have been deleted. Only present if specified by the user.
  • reporter: The reporter for which all metrics reported by it have been deleted. Only present if specified by the user.
TaskMetricsDeleteOperator
  • timestamp: The date for which all task metrics older than that have been deleted. Only present if specified by the user.
OperationLogSetAnnotationOperator
  • operationId: the id of the annotated operation log
ClearAnnotationOperator
  • operationId: the id of the annotated operation log
FilterCreateTaskWorker
  • filterId: the id of the filter that been created
UpdateTaskWorker
  • filterId: the id of the filter that been updated
DeleteTaskWorker
  • filterId: the id of the filter that been deleted
UserCreateAdmin
  • userId: the id of the user that has been created
UpdateAdmin
  • userId: the id of the user that has been updated
DeleteAdmin
  • userId: the id of the user that has been deleted
UnlockAdmin
  • userId: the id of the user that has been unlocked
GroupCreateAdmin
  • groupId: the id of the group that has been created
UpdateAdmin
  • groupId: the id of the group that has been updated
DeleteAdmin
  • groupId: the id of the group that has been deleted
TenantCreateAdmin
  • tenantId: the id of the tenant that has been created
UpdateAdmin
  • tenantId: the id of the tenant that has been updated
DeleteAdmin
  • tenantId: the id of the tenant that has been deleted
Group membershipCreateAdmin
  • userId: the id of the user that has been added to the group
  • groupId: the id of the group that the user has been added to
DeleteAdmin
  • userId: the id of the user that has been deleted from the group
  • groupId: the id of the group that the user has been deleted from
TenantMembershipCreateAdmin
  • tenantId: the id of the tenant that the group or user was associated with
  • userId: the id of the user that has been associated with the tenant. Is not present if the groupId is set
  • groupId: the id of the group that has been associated with the tenant. Is not present if the userId is set
DeleteAdmin
  • tenantId: the id of the tenant that the group or user has been deleted from
  • userId: the id of the user that has been deleted from the tenant. Is not present if the groupId is set
  • groupId: the id of the group that has been deleted from the tenant. Is not present if the userId is set
AuthorizationCreateAdmin
  • permissions: the list of permissions that has been granted or revoked
  • permissionBits: the permissions bit mask that is persisted with the authorization
  • type: the type of authorization, can be either 0 (GLOBAL), 1 (GRANT) or 2 (REVOKE)
  • resource: the name of the resource type
  • resourceId: The id of the resource. Can be * if granted or revoked for all instances of the resource type.
  • userId: The id of the user the authorization is bound to. Can be * if granted or revoked for all users. Is not present when groupId is set.
  • groupId: The id of the group the authorization is bound to. Is not present when userId is set.
UpdateAdmin
  • permissions: the list of permissions that has been granted or revoked
  • permissionBits: the permissions bit mask that is persisted with the authorization
  • type: the type of authorization, can be either 0 (GLOBAL), 1 (GRANT) or 2 (REVOKE)
  • resource: the name of the resource type
  • resourceId: The id of the resource. Can be * if granted or revoked for all instances of the resource type.
  • userId: The id of the user the authorization is bound to. Can be * if granted or revoked for all users. Is not present when groupId is set.
  • groupId: The id of the group the authorization is bound to. Is not present when userId is set.
DeleteAdmin
  • permissions: the list of permissions that has been granted or revoked
  • permissionBits: the permissions bit mask that is persisted with the authorization
  • type: the type of authorization, can be either 0 (GLOBAL), 1 (GRANT) or 2 (REVOKE)
  • resource: the name of the resource type
  • resourceId: The id of the resource. Can be * if granted or revoked for all instances of the resource type.
  • userId: The id of the user the authorization is bound to. Can be * if granted or revoked for all users. Is not present when groupId is set.
  • groupId: The id of the group the authorization is bound to. Is not present when userId is set.
PropertyCreateAdmin
  • name: the name of the property that was created
UpdateAdmin
  • name: the name of the property that was updated
DeleteAdmin
  • name: the name of the property that was deleted