v0.7.1 · aggiornata · GitHub

Utilizzo

Da “mostra tutto” a “mostra solo ciò che conta”. Tutti gli esempi sono da copiare e incollare con testdata/sample.log: sostituiscilo con la tua sorgente (consulta Sorgenti log).

Nessun filtro — report aggregato

caddy-analyze testdata/sample.log

Mostra periodo, RPS, barre 2xx/3xx/4xx/5xx, byte, P50/P95/P99, umano/bot, percorsi/IP/UA/metodi/host principali, paesi/ASN (con GeoIP) e conteggi operativi.

Filtri per voce → modalità elenco

Quando è attivo un filtro a livello di voce e il formato è table senza -o, lo strumento passa a un elenco colorato (non aggregato). Forza il report con -f json/csv/html o -o.

FiltroEsempio
Tempo--from 1h --from 2026-08-31T00:00:00Z --to 2026-08-31T01:00:00Z
Stato-s 404,500 --5xx --4xx
Rete--ip 198.51.100.0/24 --exclude-ip 10.0.0.0/8
Geo--country IT,US --exclude-country CN --asn 12345
HTTP-m POST -p /api/* --host example.com --grep "admin"
Prestazioni--slow 500ms --max-latency 100ms --min-size 1mb
Bot--no-bots --bots-only
Operativo--level error,warn --ops-only
caddy-analyze --5xx testdata/sample.log
caddy-analyze --country IT -t 25 testdata/sample.log
caddy-analyze --grep "wp-" --no-bots testdata/sample.log

Formati di output

caddy-analyze -f table testdata/sample.log              # default
caddy-analyze -f json -o report.json --detect testdata/sample.log
caddy-analyze -f csv -o report.csv testdata/sample.log
caddy-analyze -f html -o report.html --detect testdata/sample.log && open report.html
caddy-analyze --defang -f json testdata/sample.log      # 203.0.113.1 → 203[.]0[.]113[.]1

--defang riscrive IP/URL per una condivisione sicura (anche hxxp).

Exporter remoti

I formati remoti inviano un report aggregato per ogni report generato. Elasticsearch e OpenSearch usano la Bulk API; Loki riceve lo stesso report come una singola log line. In --follow e --interval ogni finestra viene inviata sincronicamente.

caddy-analyze -f elasticsearch --remote-url http://localhost:9200 --remote-index caddy-analysis testdata/sample.log
caddy-analyze -f opensearch --remote-url https://search.example/_bulk --remote-token "$TOKEN" testdata/sample.log
caddy-analyze -f loki --remote-url http://localhost:3100 testdata/sample.log

Usa --remote-user/--remote-password per Basic o --remote-token per Bearer. Retry e timeout sono configurabili con --remote-retries, --remote-backoff e --remote-timeout.

Pattern personalizzati

Carica uno o più file JSON validati senza ricompilare il binario:

caddy-analyze --detect --custom-patterns rules.json --custom-patterns local.json testdata/sample.log
[{"type":"internal_admin","pattern":"/internal/admin","description":"Internal admin probe","confidence":8,"source":"uri","mitre":"T1595.002"}]

source può essere uri, header, user_agent o all. JSON, regex, tipo o confidence non validi bloccano l'elaborazione prima della lettura dei log.

Top — ispettore classificato

caddy-analyze top ip testdata/sample.log
caddy-analyze top path -t 20 --5xx testdata/sample.log
caddy-analyze top country --country IT testdata/sample.log
caddy-analyze top asn testdata/sample.log
caddy-analyze top -b bandwidth -f csv -o top.csv testdata/sample.log

Dimensioni: path, ip, ua, status, method, host, bandwidth, country, city, asn. Paese/asn richiedono GeoIP; City scarica automaticamente il database GeoLite2 City, salvo usare --no-auto-download (consulta Configurazione → ottimizzazione).

Diff — confronta due log

caddy-analyze diff testdata/sample.log testdata/large.log
caddy-analyze diff old.log new.log -f json -o diff.json

Mostra delta RPS, picco di 5xx, regressione della latenza, nuovi percorsi di errore (primi 10).

Baseline e controlli di regressione

caddy-analyze baseline save --output baseline.json testdata/sample.log
caddy-analyze --against baseline.json --threshold 20 testdata/sample.log

La baseline è uno snapshot JSON versionato. Il confronto stampa le differenze e restituisce un exit code non-zero quando errori, latenza, errori operativi o nuovi percorsi superano la soglia. È quindi adatto ai gate CI/CD. La soglia predefinita è 20 percento.

Deployment container

Il demo locale hardened è in docker-compose.yml. Il chart Helm è in deploy/helm/caddy-analyzer: esegue il processo come non-root con filesystem in sola lettura e non monta il socket Docker di default. Abilitalo solo dopo aver valutato le implicazioni di sicurezza.

docker compose up --build
helm lint deploy/helm/caddy-analyzer
helm template caddy-analyzer deploy/helm/caddy-analyzer

Live — follow / interval / watch

caddy-analyze --follow /var/log/caddy/access.log        # stream
caddy-analyze --interval 10s /var/log/caddy/access.log  # report every 10s
caddy-analyze --watch /var/log/caddy/access.log         # 8-tab TUI (see TUI & Reports)
caddy-analyze tail docker://caddy --detect              # tail with inline detect

Rilevamento

caddy-analyze --detect testdata/sample.log -f table
caddy-analyze --detect -f html -o sec.html testdata/sample.log

26 categorie, doppio passaggio (raw + senza escape), tag MITRE. Consulta Categorie e Dettagli sul rilevamento.