Audit-Protokoll
Das Audit-Protokoll erfasst sicherheitsrelevante Änderungen an Ihrem Zammad-System: wer hat was wann geändert. Das Audit-Protokoll ist schreibgeschützt.
Auflisten
Erforderliche Berechtigung: admin.audit_log
GET-Anfrage gesendet: /api/v1/audit_logs
Der Endpunkt unterstützt die Paginierung. Die Standardseitengröße beträgt 500. Die Einträge werden nach id (aufsteigend) sortiert zurückgegeben. Geben Sie ?sort_by=id und ?order_by=DESC an, um die neuesten Einträge zuerst anzuzeigen.
Details
[
{
"id": 12,
"user_id": 10,
"user_fullname": "Hannah Taylor",
"action_type": "create",
"auditable_type": "ChecklistTemplate",
"auditable_id": 1,
"auditable_name": "Onboarding",
"value_from": {},
"value_to": {
"name": "Onboarding",
"active": true,
"sorted_item_names": []
},
"source_ip": "Rails runner",
"preferences": {},
"created_at": "2026-08-19T06:30:43.527Z",
"updated_at": "2026-08-19T06:30:43.527Z"
},
{
"id": 41,
"user_id": 3,
"user_fullname": "Lauren Brooks",
"action_type": "create",
"auditable_type": "Macro",
"auditable_id": 2,
"auditable_name": "RMA",
"value_from": {},
"value_to": {
"name": "RMA",
"active": true,
"perform": {
"ticket.tags": {
"value": "RMA",
"operator": "add"
},
"ticket.group_id": {
"value": "8"
},
"notification.email": {
"body": "<div>Dear #{ticket.customer.firstname} #{ticket.customer.lastname},</div><div><br></div><div>your request got forwarded to our logistics department. You'll receive instructions about how to return your product and the replacement process.</div><div><br></div><div>Best regards,</div><div>#{ticket.owner.firstname} #{ticket.owner.lastname}</div>",
"sign": "no",
"subject": "Update regarding your inquiry",
"internal": "false",
"recipient": [
"ticket_customer"
],
"encryption": "no",
"include_attachments": "false"
}
},
"ux_flow_next_up": "none"
},
"source_ip": "172.20.0.1",
"preferences": {},
"created_at": "2026-08-19T06:43:49.908Z",
"updated_at": "2026-08-19T06:43:49.908Z"
},
{
"id": 33,
"user_id": 3,
"user_fullname": "Lauren Brooks",
"action_type": "update",
"auditable_type": "Setting",
"auditable_id": 270,
"auditable_name": "pgp_integration",
"value_from": {
"area": "Integration::Switch",
"name": "pgp_integration",
"title": "PGP integration",
"options": {
"form": [
{
"tag": "boolean",
"name": "pgp_integration",
"null": true,
"display": "",
"options": {
"true": "yes",
"false": "no"
}
}
]
},
"frontend": true,
"description": "Defines if PGP encryption is enabled or not.",
"state_current": {
"value": false
},
"state_initial": {
"value": false
}
},
"value_to": {
"area": "Integration::Switch",
"name": "pgp_integration",
"title": "PGP integration",
"options": {
"form": [
{
"tag": "boolean",
"name": "pgp_integration",
"null": true,
"display": "",
"options": {
"true": "yes",
"false": "no"
}
}
]
},
"frontend": true,
"description": "Defines if PGP encryption is enabled or not.",
"state_current": {
"value": true
},
"state_initial": {
"value": false
}
},
"source_ip": "Rails runner",
"preferences": {
"changed_attributes": [
"state_current"
]
},
"created_at": "2026-08-19T06:30:53.279Z",
"updated_at": "2026-08-19T06:30:53.279Z"
}
]Anzeigen
Erforderliche Berechtigung: admin.audit_log
GET-Anfrage gesendet: /api/v1/audit_logs/{id}
Details
{
"id": 41,
"user_id": 3,
"user_fullname": "Lauren Brooks",
"action_type": "create",
"auditable_type": "Macro",
"auditable_id": 2,
"auditable_name": "RMA",
"value_from": {},
"value_to": {
"name": "RMA",
"active": true,
"perform": {
"ticket.tags": {
"value": "RMA",
"operator": "add"
},
"ticket.group_id": {
"value": "8"
},
"notification.email": {
"body": "<div>Dear #{ticket.customer.firstname} #{ticket.customer.lastname},</div><div><br></div><div>your request got forwarded to our logistics department. You'll receive instructions about how to return your product and the replacement process.</div><div><br></div><div>Best regards,</div><div>#{ticket.owner.firstname} #{ticket.owner.lastname}</div>",
"sign": "no",
"subject": "Update regarding your inquiry",
"internal": "false",
"recipient": [
"ticket_customer"
],
"encryption": "no",
"include_attachments": "false"
}
},
"ux_flow_next_up": "none"
},
"source_ip": "172.20.0.1",
"preferences": {},
"created_at": "2026-08-19T06:43:49.908Z",
"updated_at": "2026-08-19T06:43:49.908Z"
}Suche
Erforderliche Berechtigung: admin.audit_log
Der Such-Endpunkt akzeptiert die query Syntax des Zammad-Such-Backends. Der einfachste Fall ist eine wörtliche Zeichenfolge in einem einzelnen indexierten Feld wie beispielsweise auditable_name, auditable_type oder user_fullname:
GET-Anfrage gesendet: /api/v1/audit_logs/search?query={search-string}
Details
[
{
"id": 41,
"user_id": 3,
"user_fullname": "Lauren Brooks",
"action_type": "create",
"auditable_type": "Macro",
"auditable_id": 2,
"auditable_name": "RMA",
"value_from": {},
"value_to": {
"name": "RMA",
"active": true,
"perform": {
"ticket.tags": {
"value": "RMA",
"operator": "add"
},
"ticket.group_id": {
"value": "8"
},
"notification.email": {
"body": "<div>Dear #{ticket.customer.firstname} #{ticket.customer.lastname},</div><div><br></div><div>your request got forwarded to our logistics department. You'll receive instructions about how to return your product and the replacement process.</div><div><br></div><div>Best regards,</div><div>#{ticket.owner.firstname} #{ticket.owner.lastname}</div>",
"sign": "no",
"subject": "Update regarding your inquiry",
"internal": "false",
"recipient": [
"ticket_customer"
],
"encryption": "no",
"include_attachments": "false"
}
},
"ux_flow_next_up": "none"
},
"source_ip": "172.20.0.1",
"preferences": {},
"created_at": "2026-08-19T06:43:49.908Z",
"updated_at": "2026-08-19T06:43:49.908Z"
},
{
"id": 12,
"user_id": 10,
"user_fullname": "Hannah Taylor",
"action_type": "create",
"auditable_type": "ChecklistTemplate",
"auditable_id": 1,
"auditable_name": "Onboarding",
"value_from": {},
"value_to": {
"name": "Onboarding",
"active": true,
"sorted_item_names": []
},
"source_ip": "Rails runner",
"preferences": {},
"created_at": "2026-08-19T06:30:43.527Z",
"updated_at": "2026-08-19T06:30:43.527Z"
}
]Um nach einem bestimmten Attribut zu filtern anstatt den gesamten Datensatz nach Teilzeichenfolgen abzugleichen, setzen Sie dem Attributnamen ein Präfix voran. Sie können sogar die logische AND Verknüpfung verwenden, um die Ergebnisse einzugrenzen:
GET-Anfrage gesendet: /api/v1/audit_logs/search?query=auditable_type:Macro AND user_id:3
WARNING
Bei der Suche wird die Groß-/Kleinschreibung berücksichtigt und es werden ausschließlich die indizierten Attributfelder durchsucht (auditable_name, auditable_type, user_fullname usw.). Die Nutzlast der Felder value_from und value_to sind nicht durchsuchbar.
TIP
Standardmäßig besteht die Antwort aus einem einfachen JSON-Array mit den übereinstimmenden Einträgen. Übergeben Sie with_total_count=true in der URL (oder with_total_count: true im Body einer POST*-Anfrage), um die Antwort in ein Objekt zu verpacken, das auch einen total_countenthält. Senden Sie einePOST`-Anfrage, wenn die Abfrage für eine URL zu lang oder zu komplex ist.
Feldreferenz
id- Ganzzahliger Primärschlüssel des Eintrags im Audit-Protokoll.
user_id- ID des Benutzers, der die Änderung ausgelöst hat.
null, wenn der Eintrag von einem Hintergrundjob ohne aktuellen Benutzer geschrieben wurde. user_fullname- Vollständiger Name des Benutzers zum Zeitpunkt der Erstellung des Eintrags. Wird separat gespeichert, damit er auch nach der Löschung des Kontos lesbar bleibt.
action_type- Art der erfassten Änderung. Eine der folgenden Optionen:
create(ein Datensatz wurde hinzugefügt),update(ein bestehender Datensatz wurde geändert),destroy(ein Datensatz wurde entfernt),switch_to(ein Benutzer hat die Sitzung eines anderen Benutzers per aus Sicht des Benutzers ansehen übernommen),switch_back_to(die ursprüngliche Sitzung wurde wieder aufgenommen). auditable_id- ID des Datensatzes, der geändert wurde.
auditable_type- Klassenname des Datensatzes, der geändert wurde (z.B.
Macro,Setting,KnowledgeBase,ChecklistTemplate,Job). auditable_name- Anzeigename des geänderten Datensatzes zum Zeitpunkt des Schreibvorgangs. Wird separat gespeichert, damit er auch dann noch lesbar ist, wenn der Datensatz selbst nicht mehr vorhanden ist.
value_from- Objekt (JSON), das den vorherigen Status des geänderten Attributs enthält. Leer (
{}) beicreateEinträgen. value_to- Objekt (JSON), das den neuen Status des geänderten Attributs enthält. Leer (
{}) beidestroyEinträge. source_ip- IP-Adresse, von der die zugrunde liegende Anfrage stammt.
Rails consoleoderRails runnerwird gespeichert, wenn die Änderung von einem Wartungsskript geschrieben wurde. preferences- Objekt (JSON), das zusätzliche Metadaten pro Eintrag enthält. Bei Aktualisierungen von Einträgen per
updateenthält dies ein Arraychanged_attributes, das die tatsächlich geänderten Attribute auflistet. created_at- Zeitstempel, zu dem der Eintrag erstellt wurde. Einträge im Audit-Protokoll sind unveränderbar und werden einmalig hinzugefügt.
updated_at- Entspricht
created_atfür Einträge im Audit-Protokoll. Einträge im Audit-Protokoll sind unveränderbar und werden einmalig hinzugefügt.
Lebenszyklus
Eine geplante Aufgabe löscht täglich Einträge, die älter als 12 Monate sind. Verwenden Sie AuditLog.cleanup in der Rails-Konsole, um eine Bereinigung manuell auszulösen.