Skip to content

Enterprise · Audit log

Audit log

Every change, sign-in and refused request is in the audit log, written in the same transaction as the change, and a system admin can filter it on one page.

Builds on:Dashboards

Video coming soon

Audit log

Before you start

  • Sign in as admin System admin. Only system admins can open the Audit Log page.
  • Some activity exists to read. In the examples on this page, admin created the flags express-checkout, beta-coupons and one-click-reorder in the team Checkout, archived one-click-reorder, deleted beta-coupons, and created the system client ci-code-refs.

What the audit log records

FluxGate writes an audit entry for every change to its configuration:

  • flags, their lifecycle, targeting criteria, rule groups and contexts;
  • pipelines, stages, environments, approval policies, freeze windows, scheduled changes and canary gates;
  • roles, teams, users, SDK clients, system clients and their tokens;
  • JWT signing secrets, notification channels and preferences, integrations and settings.

The entry is written in the same database transaction as the change. If FluxGate cannot write the entry, the change fails with 500. A change without an entry cannot happen.

The log also records:

  • sign-ins, device logins and license events;
  • refused requests, as policy_deny entries;
  • each export of the log, as one audit_exported entry.

Targeting entries carry ids, counts and context key names. They never carry condition values or context entries. The full before and after values of a criteria or rule-group change are in the flag version that the change stores. Read them on the flag's Versions tab.

Tokens, token hashes, signing secrets, the SMTP password and the SMS auth token are never logged.

What is not logged

Flag evaluations are not logged. POST /api/v1/evaluate, POST /api/v1/metrics/track and the gRPC API are the data plane, and they write nothing to the audit log. Read evaluation volume on Evaluation Analytics instead.

Reads of the audit log through GET /api/v1/audit/events and GET /api/v1/audit/schema are not logged either. An export is logged.

Who can read the log

ReaderAudit Log page, /api/v1/audit/*Audit Analytics of a team
System admin, signed in with a user sessionYes, every teamYes, every team
Team member, for example priya Requester or sam ApproverNo, 403Yes, own teams
System client token, for example ci-code-refsNo, 403Yes, own team only

A refused read is itself an audit entry: a policy_deny entry, at most one per actor, action, resource and team in 60 seconds. See Teams, users and roles for the roles.

The Audit Log page

Click Audit Log under Observe in the sidebar, or open /dashboard/audit-log. The page is titled "Audit Log" and lists "Every recorded change, access decision, and sign-in event. Newest first." Users who are not system admins do not see it.

Audit Log page filtered to the team Checkout with Hide allow decisions on, listing feature_deleted, feature_lifecycle_updated, feature_created and system_client_created entries by admin (opens full size in a new tab)
The Audit Log page for the team Checkout, with access checks that passed hidden.

Two buttons sit at the top right. Audit analytics opens the Audit Analytics dashboard. Export downloads the filtered entries as CSV or NDJSON. See Export and SIEM.

Filter the log

FilterWhat it does
Time RangeLimits the entries to a period, for example Last 24 hours.
TeamShows only the entries of one team. System-wide entries, such as license, user, SSO and export entries, have no team, so a team filter hides them.
CategoryShows only the chosen categories, for example feature or access_policy. You can choose several.
TypeShows only the chosen event types, for example feature_deleted. You can choose several. With both a category and a type, you get entries that match both.
Actor IDShows only the entries of one actor. Enter the actor's id, not the user name.
Entity TypeShows only the entries about one kind of object, for example feature or system_client.
Entity IDShows only the entries about one object, by its id.
Hide allow decisionsHides the policy_allow entries.

Click Apply to load the list with the filters. The round arrow next to Hide allow decisions reloads the list.

Hide allow decisions

FluxGate records an access decision for requests. A policy_allow entry says that an access check passed. These entries are most of the log, and they hide the changes you look for. Turn on Hide allow decisions to drop them. Refused requests (policy_deny) stay visible.

Find a change

  1. Click Audit Log under Observe.
  2. Choose Checkout in Team.
  3. Leave Time Range on Last 24 hours.
  4. Turn on Hide allow decisions.
  5. Type feature in Entity Type and click Apply. The list shows only flag entries, newest first.
  6. Read the top row: feature_deleted, actor admin, target feature: beta-coupons, description "Deleted feature 'beta-coupons'".

Read an entry

Each row is one entry.

ColumnMeaning
TimeWhen the change happened. This is the start time of the database transaction.
TypeThe event type, for example feature_lifecycle_updated.
CategoryThe group the type belongs to, for example feature or client.
Outcomesuccess, denied (a request was refused) or blocked (a freeze window held a change back).
ActorWho did it: a user such as admin, a system client, or a SCIM provider (scim:<provider slug>). Background work has no actor.
TargetThe object, as <entity type>: <key or id>. A flag shows its key, for example feature: one-click-reorder. A system client shows its id.
TeamThe team of the object. Empty for system-wide entries.
DescriptionOne sentence, for example "Created system client 'ci-code-refs'".

In the example, archiving one-click-reorder wrote feature_lifecycle_updated with the description "Updated feature 'one-click-reorder'". beta-coupons changed its lifecycle state first and was then deleted, which wrote feature_deleted. A deleted flag keeps its key in the log, so you can still find it after it is gone.

The export carries more than the table shows: the actor id and kind, the target id, the environment id and the metadata of each entry. See the field reference in Export and SIEM.

Event categories

Every type belongs to one category. Filter by category when you look for a kind of change and do not know the exact type.

CategoryCovers
featureFlags, their lifecycle, targeting criteria, rule groups and contexts.
stageStage change requests, deploys and rollbacks.
approvalApprovals, rejections and approval policies.
safetyKill switches, freeze windows, scheduled changes and canary gates.
access_policyAccess decisions on requests: policy_allow and policy_deny.
licenseLicense uploads, state changes, limits and refusals.
authSign-ins, password changes, command line logins and JWT signing secrets.
ssoSingle sign-on providers, SSO logins and role sync, SCIM tokens, users and groups.
user, team, roleUser accounts, teams and memberships, roles and role assignments.
clientSDK clients, system clients and their tokens.
environment, pipelineEnvironments, rollout pipelines and rollout templates.
integrationJira, external links, code references, AI settings and notifications.
auditExports of the audit log.
systemEdge snapshot signing keys, snapshot exports and relay edges.

Common event types

This table lists the types you meet most often. GET /api/v1/audit/schema returns the full list with the category and outcome of each type. See Export and SIEM.

TypeCategoryOutcomeWritten when
feature_createdfeaturesuccessA flag was created.
feature_updatedfeaturesuccessA flag was updated.
feature_lifecycle_updatedfeaturesuccessA flag moved to another lifecycle state, for example archived.
feature_deletedfeaturesuccessA flag was deleted. The metadata keeps feature_id, feature_key and team_id.
stage_criteria_replacedfeaturesuccessThe targeting criteria of a stage were replaced.
rule_group_created, rule_group_updated, rule_group_deletedfeaturesuccessA rule group of a criterion was added, changed or removed.
stage_change_requestedstagesuccessA requester such as priya asked to change a pipeline stage.
stage_deployedstagesuccessA flag was deployed to a pipeline stage.
stage_rollbackedstagesuccessA flag was rolled back from a pipeline stage.
stage_approved, stage_rejectedapprovalsuccessAn approver such as sam approved or rejected a stage change request.
approval_policy_created, approval_policy_updated, approval_policy_deletedapprovalsuccessAn approval policy changed.
kill_switch_activatedsafetysuccessA kill switch turned a flag off.
freeze_blockedsafetyblockedA freeze window blocked a change.
freeze_overridesafetysuccessA change overrode a freeze window.
user_logged_inauthsuccessA user signed in.
sso_loginssosuccessA user signed in through single sign-on.
sso_role_syncssosuccessRoles of a user were synchronised from SSO groups.
scim_user_created, scim_user_deactivatedssosuccessSCIM provisioning created or deactivated a user.
scim_group_updatedssosuccessSCIM provisioning renamed a group or changed its members.
system_client_createdclientsuccessA system client was created with its first token, for example ci-code-refs.
system_client_token_revokedclientsuccessA token of a system client was revoked.
system_client_token_regeneratedclientsuccessEvery token of a system client was revoked and a new one issued.
code_ref_repository_updatedintegrationsuccessThe settings of a code-reference repository changed.
code_ref_repository_deletedintegrationsuccessA code-reference repository and all its scans were deleted.
edge_snapshot_key_created, edge_snapshot_key_rotated, edge_snapshot_key_retiredsystemsuccessAn edge snapshot signing key was created, replaced or retired.
edge_snapshot_exportedsystemsuccessA team's signed edge snapshot was exported.
edge_relay_registered, edge_relay_removedsystemsuccessA relay edge was registered or removed.
license_uploadedlicensesuccessA license was uploaded.
license_denylicensedeniedThe license refused a request.
policy_allowaccess_policysuccessAn access check allowed a request.
policy_denyaccess_policydeniedAn access check refused a request.
audit_exportedauditsuccessSomeone exported the audit log.

Types can be added in later releases. Code that reads the log must accept types it does not know.

Audit Log and Audit Analytics

The two pages answer different questions.

  • Audit Analytics (Audit Analytics under Observe) counts changes for one team: events, emergency actions, rollbacks, rejected requests, lead time and the most changed flags. Team members can read it for their own teams. Export summary saves these numbers as a CSV.
  • The Audit Log page lists every entry. Only system admins can read it. Export saves the entries themselves.

Audit Analytics and the Recent Activity feed on the System Overview leave out policy_allow, policy_deny and license_deny. Those types record an access decision, not a change. Filtering Audit Analytics by one of them returns zeros. Read them on the Audit Log page, with the category access_policy or the type license_deny.

On Audit Analytics, admins see an Open audit log button that opens the Audit Log page.

Good to know

  • Only system admins with a user session can read the audit log. A system client token gets 403, even with every scope.
  • The log keeps at most one policy_deny entry per actor, action and resource in 60 seconds. A script that is refused 100 times in a minute writes one entry.
  • Time is the start of the database transaction. Two entries next to each other can step back slightly in time. The log is ordered by transaction, not by Time.
  • An entry for a system-wide object, such as a user, a license or an export, has no team. Clear the Team filter to see it.
  • A user signing out writes no entry.
  • A stage change that needs approval writes its approval request first, in its own transaction. If the stage change then fails, the request stays and the stage entry is missing.

Next

Export the log as CSV or NDJSON, or feed it to a SIEM, in Export and SIEM.