Журнал аудита
NORA записывает операции реестра в структурированный журнал аудита. Каждая запись представляет собой JSON-объект, записанный в одну строку (формат JSONL).
Конфигурация
Заголовок раздела «Конфигурация»| Переменная | По умолчанию | Описание |
|---|---|---|
NORA_AUDIT_LOG | file | Режим вывода: file, stdout, both или off |
[audit]mode = "file" # "file", "stdout", "both", "off"Режимы:
| Режим | Поведение |
|---|---|
file | Запись в {storage_path}/audit.jsonl |
stdout | Запись в stderr (совместимо с 12-factor, работает с агрегаторами логов) |
both | Запись и в файл, и в stderr |
off | Отключить журналирование аудита |
Формат записи
Заголовок раздела «Формат записи»Каждая строка представляет собой JSON-объект со следующими полями:
| Поле | Тип | Описание |
|---|---|---|
ts | string | Временная метка в формате ISO 8601 (UTC) |
action | string | push, pull, delete, cache_hit, proxy_fetch, overwrite, retention-apply |
actor | string | Источник операции: api (HTTP-запрос), scheduler (политики хранения) или cli |
artifact | string | Имя пакета или ссылка на образ |
registry | string | Тип реестра: docker, npm, pypi, maven и т. д. |
detail | string | Дополнительный контекст (версия, дайджест, размер) |
Примеры записей
Заголовок раздела «Примеры записей»{"ts":"2026-05-18T10:30:45.123Z","action":"push","actor":"api","artifact":"myapp","registry":"docker","detail":"sha256:abc123"}{"ts":"2026-05-18T10:31:02.456Z","action":"pull","actor":"api","artifact":"lodash","registry":"npm","detail":"4.17.21"}{"ts":"2026-05-18T10:32:15.789Z","action":"delete","actor":"api","artifact":"old-image:v1","registry":"docker","detail":"manifest"}{"ts":"2026-05-18T10:33:00.001Z","action":"cache_hit","actor":"api","artifact":"","registry":"maven","detail":""}{"ts":"2026-05-18T10:33:05.200Z","action":"proxy_fetch","actor":"api","artifact":"","registry":"npm","detail":""}{"ts":"2026-05-18T10:34:10.500Z","action":"overwrite","actor":"api","artifact":"libs/config.yaml","registry":"raw","detail":""}Типы действий:
| Действие | Описание |
|---|---|
push | Клиент загрузил новый артефакт |
pull | Клиент скачал артефакт из локального хранилища |
delete | Клиент удалил артефакт |
cache_hit | Запрос обслужен из локального кэша без обращения к вышестоящему реестру |
proxy_fetch | Артефакт получен из вышестоящего реестра |
overwrite | Существующий артефакт заменён (реестр Raw) |
retention-apply | Артефакт удалён политикой хранения |
Расположение файла
Заголовок раздела «Расположение файла»При использовании режима file или both журнал аудита записывается в:
{NORA_STORAGE_PATH}/audit.jsonlПо умолчанию: data/audit.jsonl (относительно рабочей директории).
Файл создаётся автоматически. Родительские директории создаются, если они не существуют.
Пример для Docker Compose
Заголовок раздела «Пример для Docker Compose»services: nora: image: ghcr.io/getnora-io/nora:0.9 environment: NORA_AUDIT_LOG: both NORA_STORAGE_PATH: /data volumes: - nora-data:/dataЗатем следите за журналом:
docker exec nora tail -f /data/audit.jsonl | jq .Пересылка в агрегатор логов
Заголовок раздела «Пересылка в агрегатор логов»В режиме stdout записи аудита отправляются в stderr вместе с обычными логами. Используйте драйвер логов вашего оркестратора контейнеров для их пересылки:
# Filter audit entries from container logsdocker logs nora 2>&1 | grep '"action":' | jq .Для выделенной пересылки на основе файлов (Filebeat, Promtail, Vector):
filebeat.inputs: - type: log paths: - /data/audit.jsonl json.keys_under_root: true json.add_error_key: trueЗапросы к журналу аудита
Заголовок раздела «Запросы к журналу аудита»# All pushes todaygrep '"action":"push"' /data/audit.jsonl | jq .
# All Docker operations by user "admin"jq -c 'select(.registry == "docker" and .actor == "admin")' /data/audit.jsonl
# Count operations per registryjq -r '.registry' /data/audit.jsonl | sort | uniq -c | sort -rnСмотрите также
Заголовок раздела «Смотрите также»- Справочник по конфигурации — переменная окружения
NORA_AUDIT_LOG - Метрики Prometheus — количественный мониторинг