Skip to main content
Version: 26.2

Audit logs

Audit logs provide a structured record of administrative activity across the Authorization Hub.

tip

For in-project change history, check the Activity feed that shows what was changed within a project, by whom, and when. Audit logs are intended for administrators and external observability tooling (SIEM), while the activity feed is designed for day-to-day project collaboration.

They are designed to answer critical security questions, such as: "Who modified this policy and when?" or "Who accessed the system and what did they do?"

The system generates audit logs for all CRUD (Create, Read, Update, Delete) operations involving authorization components, policy insights, and user management. Furthermore, logs capture critical identity and access management events occurring within Keycloak.

Logs are produced in JSON format and displayed in the console, allowing for seamless integration with the external observability or SIEM (Security Information and Event Management) system of your choice.

At a high level, each event consists of the following fields:

Log componentJSON keyDescription
Action"operation"The specific operation that was performed.
See Audit log operations for details.
Resource"resource"The object that was created, read, updated, or deleted.
Examples: project, policy, domain.
Result"result"Indicates the outcome of the action.
Actor"user"The user or client that performed the action.
Timestamp"event_timestamp"When the event occurred (UTC, ISO 8601).
Details"details"Additional metadata, such as IDs, names, operation results, or error indicators.
tip

Keycloak is configured to output logs in ECS JSON format and the audit payload to be parsed by the log pipeline is embedded in the "message" field. See the Keycloak events section below.

Data privacy & security​

Audit logs are designed to be safe for export and compliant with global privacy best practices:

  • Anonymized actors: Actors are identified only by technical identifiers, such as an externalUserId (UUID). Personally Identifiable Information (PII), including usernames, emails, and full names, is never recorded.
  • No sensitive data: Log payloads exclude passwords, API keys, shared secrets, and other sensitive configuration values.

Audit log operations​

OperationDescription
dictionary.attribute.getGet all active attributes from the dictionary.
dictionary.attribute.get.by.fqnGet an attribute by its FQN.
dictionary.attribute.get.by.idGet an attribute by its unique ID.
dictionary.attribute.createCreate a new attribute.
dictionary.attribute.updateUpdate an attribute.
dictionary.attribute.deleteDelete an attribute.
dictionary.attribute.exportExport all active attributes.
dictionary.namespace.getGet all namespaces used in the dictionary.
dictionary.cacheprofile.getGet all cache profiles.
dictionary.cacheprofile.createCreate a new cache profile.
dictionary.cacheprofile.get.by.nameGet a cache profile by its name.
dictionary.cacheprofile.updateUpdate a cache profile.
dictionary.cacheprofile.deleteDelete a cache profile.
connector.getGet all attribute connectors.
connector.get.by.fqnGet an attribute connector by its FQN.
connector.get.by.idGet an attribute connector by its unique ID.
connector.get.by.attributesGet all attribute connectors that use specific attributes.
connector.createCreate a new attribute connector.
connector.updateUpdate an attribute connector.
connector.deleteDelete an attribute connector.
connector.exportExport all attribute connectors.
domain.listGet all domains.
domain.get_by_idGet a domain by its unique ID.
domain.get_by_nameGet a domain by its name.
domain.composeCompose an authorization domain.
domain.copyCopy a domain.
domain.storeStore a domain.
domain.rollbackRolls back domain name.
domain.history.listGet domain history by name.
domain.metadata.listRetrieve the metadata of all domains under a specified namespace.
policyfile.getGet a specific file content from a policy package.
policies.policy.package.getGet a policy package with its policies.
policies.policy.package.createCreate a policy package.
policies.policy.package.patchUpdate a policy package (add, update, or remove policies).
policies.policy.getGet a policy.
policies.policy.package.exportExport the published policies of a policy package.
draft.promoteSave a workspace to the project.
draft.discardDiscard a whole workspace.
draft.artifact.discardDiscard a single artifact from a workspace.
project.getGet all projects.
project.get.by.idGet a project by its unique ID.
project.createCreate a project.
project.updateUpdate a project.
project.leaveLeave a project.
principal.user.getGet all users.
principal.user.get.by.idGet a user by their unique ID.
principal.user.get.by.emailGet a user by their email.
principal.user.createCreate a user.
principal.user.updateUpdate a user.
principal.user.meGet the details of the currently authenticated user.
principal.client.getGet all M2M clients.
insights.template.getGet all templates.
insights.template.get.by.nameGet a template by its name.
insights.template.get.by.idGet a template by its unique ID.
insights.template.createCreate a template.
insights.template.updateUpdate a template.
insights.template.deleteDelete a template.
insights.report.getGet all reports.
insights.report.get.by.idGet a report by its unique ID.
insights.report.get.by.nameGet a report by its name.
insights.report.createCreate a report.
insights.report.updateUpdate a report.
insights.report.deleteDelete a report.
insights.report.runRun a saved report.
insights.run.executeRun queries without a saved report.
insights.run.get.by.idGet a saved run by its unique ID.
insights.run.deleteDelete a saved run.
insights.endpoint.getList configured endpoints.
activity.feed.getGet the activity feed of a project.
draft.promoteSave a workspace to the project.
draft.discardDiscard a workspace.
draft.artifact.discardDiscard a single staged change from a workspace.
project.permission.checkA request was denied by the project access check of the API gateway. The result is DENIED.
note

Policy package operations are recorded by two services. The policies.* operations are recorded by the Hub service when policies are managed through /api/policy-package, which is what the Authorization Hub interface uses. The policypackage.* and policyfile.get operations are recorded by the domain manager, and only occur when its own policy package endpoints are called directly.

note

While My workspace is enabled, a change that is staged in a workspace is not audited when it is staged. The change is audited, with the same operation as a direct change (for example, dictionary.attribute.create), when the workspace is saved to the project with draft.promote. The audit log always records the user or client that performed the action.

note

The draft.* operations apply to My workspace. When a Project admin saves or discards the workspace of an M2M client, the actor recorded is the admin, not the client. Staging changes into a workspace is not audited when it happens. The save is audited when the workspace is saved to the project.

Keycloak events​

Keycloak user events, such as logins and logouts, are mapped to auth.<event_type>. For example:

  • auth.login
  • auth.logout
  • auth.code_to_token.
note

Success and failure share the same operation name. To distinguish the outcome, the result field (SUCCESSFUL / FAILURE) is used.

Keycloak admin events are mapped to identity.<resource_type>.<operation_type>. For example:

  • identity.client.create
  • identity.identity_provider.update

Configure log levels​

Each service has its own log level setting and the default is INFO. Available values are TRACE, DEBUG, INFO, WARN, and ERROR. Follow the steps below to update log levels for one or more services.

  1. Navigate to the kubernetes/charts directory.

  2. Upgrade the Helm chart configuration:

    helm upgrade hub \
    -f hub/values.yaml hub \
    --set services.hubService.env.logging.comAxiomaticsHub=DEBUG \
    --set services.apiGateway.env.logging.comAxiomaticsGateway=DEBUG \
    --set services.adm.env.logLevel=DEBUG \
    --set services.keycloak.env.logLevel=DEBUG
    note

    The command above sets the log level to DEBUG for all services. To target a specific service, include only the --set flag relevant to that service.