Skip to content
For the complete DHIS2 documentation index, see llms.txt.

Audit

Introduction

DHIS2 supports a new audit service based on Apache ActiveMQ Artemis. Artemis is used as an asynchronous messaging system by DHIS2.

After an entity is saved to database, an audit message will be created and sent to the Artemis message consumer service. The message will then be processed in a different thread.

Audit logs can be retrieved from the DHIS2 database. Currently there is no UI or API endpoint available for retrieving audit entries.

Detailed explanation of the audit system architecture can be found here.

What we log

This is the list of operations we log as part of the audit system:

  • Operations on user accounts (like but not limited to creation, profile edits)
  • Operations on user roles, groups and authority groups
  • Operations on metadata objects (like but not limited to categories, organization units, reports)
  • Operations on tracked objects (like but not limited to tracked entities)
  • Jobs configuration
  • Breaking the glass operations

Single Audit table

All audit entries, except the ones related to tracked entities, will be saved into one single table named audit

Column Type Description
auditid integer Primary key.
audittype text READ, CREATE, UPDATE, DELETE, SEARCH
auditscope text METADATA, AGGREGATE, TRACKER
klass text Audit Entity Java class name.
attributes jsonb A JSON string with attributes of the audited object. Example: {"valueType":"TEXT", "categoryCombo":"SWQW313FQY", "domainType":"TRACKER"}.
data bytea Compressed JSON string of the audit entity in byte array format (not humanly readable).
createdat timestamp without time zone Time of creation.
createdby text Username of the user performing the audited operation.
uid text The UID of the audited object.
code text The code of the audited object.

The audit service makes use of two new concepts: Audit Scope and Audit Type.

Audit Scope

An audit scope is a logical area of the application which can be audited. Currently there are three audit scopes.

Scope Key Audited objects
Tracker TRACKER Tracked Entity, Enrollment, Event.
Metadata METADATA All metadata objects (e.g. Data Element, Organisation Unit).
Aggregate AGGREGATE Aggregate Data Value.

Audit Type

An audit type is an action that triggers an audit operation. Currently we support the following four types.

Name Key Description
Read READ Object was read.
Create CREATE Object was created.
Update UPDATE Object was updated.
Delete DELETE Object was deleted.
Disabled DISABLED Disable audit.

Caution

The READ audit type may generate a lot of data in the database and may have an impact on the performance.

Tracked entity audits

Operations on tracked entities are stored in the trackedentityaudit table.

trackedentityaudit

Column Type Description
trackedentityauditid integer Primary key.
trackedentity text Tracked entity name.
created timestamp without time zone Time of creation.
accessedby text Username of the user performing the audited operation.
audittype text READ, CREATE, UPDATE, DELETE, SEARCH
comment text The code of the audited object.

This data can be retrieved via the API.

Breaking the glass

Breaking the glass features allows to access records a DHIS2 user doesn't have access in special circumstances. As a result of such, users must enter a reason to access such records.

A video explaining how it works can be found in our Youtube channel here.

The breaking the glass event is stored in the programtempownershipaudit table, described below:

Column Type Description
programtempownershipauditid integer Primary key.
programid integer Program ID of which the tracked entity belongs to.
trackedentityid integer Tracked entity ID of which the attribute value belongs to.
created timestamp without time zone Time of creation.
accessedby text Username of the user performing the audited operation.
reason text The reason as inserted in the dialog.

Setup

The audit system is enabled by default for the following scopes and types.

Scopes (case sensitive):

  • READ
  • CREATE
  • UPDATE
  • DELETE
  • SEARCH
  • DISABLED

Types:

  • METADATA
  • TRACKER
  • AGGREGATE

This means that no action is required to enable the default audit system. The default setting is equivalent to the following dhis.conf configuration.

audit.metadata = CREATE;UPDATE;DELETE
audit.tracker = CREATE;UPDATE;DELETE
audit.aggregate = CREATE;UPDATE;DELETE

The audit can be configured using the audit matrix. The audit matrix represents the valid combinations of scopes and types, and is defined with the following properties in the dhis.conf configuration file. Each property accepts a semicolon (;) delimited list of audit types.

  • audit.metadata
  • audit.tracker
  • audit.aggregate

Artemis

Apache ActiveMQ Artemis is an open source project to build a multi-protocol, embeddable, very high performance, clustered, asynchronous messaging system. It has been part of DHIS2 since version 2.31 and used as a system to consume audit logs.

By default, DHIS2 will start an embedded Artemis server, which is used internally by the application to store and access audit events.

However, if you have already an Artemis server, you can connect to it from DHIS2 to send audit events, as described in our official documentation: in this setup, audit events will flow from DHIS2 to the external Artemis system.

log4j2

log4j2 is the default DHIS2 logging library used to handle output messages. It's used to control what events are recored in which file.

The application ships a log4j2 default configuration file, which instructs what information to log and where (console). DHIS2 then takes care of import that file and instruction logging as described in the log4j configuration class, that is, redirecting output from console to files.

From 2.36 to 2.38, audit log file dhis-audit.log is rotated every day at midnight.

An example of custom log4j2 configuration can be found here: it shows how to configure DHIS2 to save all logs into an external storage location, rotate them on a weekly basis and retain them for 30 days. Please read the application logging section on how to use it.

Examples

This section demonstrates how to configure the audit system in dhis.conf.

To enable audit of create and update of metadata and tracker only:

audit.metadata = CREATE;UPDATE
audit.tracker = CREATE;UPDATE
audit.aggregate = DISABLED

To only audit tracker related objects create and delete:

audit.metadata = DISABLED
audit.tracker = CREATE;DELETE
audit.aggregate = DISABLED

To completely disable audit for all scopes:

audit.metadata = DISABLED
audit.tracker = DISABLED
audit.aggregate = DISABLED

We recommend keeping the audit trails into a file, as by default in version 2.38. For older versions, the following configuration saves the audit logs into the $DHIS2_HOME/logs/dhis-audit.log file:

audit.database = off
audit.logger = on

To store audit data into the database, add the following to your dhis.conf file (default up until version 2.38):

audit.database = on
audit.logger = off

To extract logs from the audit table, you can use dhis2-audit-data-extractor from the system where DHIS2 is running:

$ python extract_audit.py extract

Please read the documentation for full details.

To parse entries from log file, you can use the python script as follow:

$ grep "auditType" dhis-audit.log | python extract_audit.py parse

Or use jq as follow:

$ grep "auditType" dhis-audit.log | jq -r .

To select events within a specific date, you can use jq as follow (in this example, we're selecting all events happened between January 2022 and end of June 2022):

$ grep "auditType" dhis-audit.log | jq -r '.[] | select ( (.datetime >="2022-01-01") and (.datetime <= "2022-06-30") )'

Same with extract_audit:

$ python3 extract_audit.py extract -m stdout -f JSON | jq -r '.[] | select ( (.datetime >="2022-01-01") and (.datetime <= "2022-06-30") )'