Files
vibedns/web/templates/pages/settings_logging.html
T
2026-08-16 21:18:45 -05:00

150 lines
7.0 KiB
HTML

{{define "content"}}
{{$s := .Data.S}}
<h1 class="page-title mb-1">Settings</h1>
<p class="text-body-secondary mb-4">Server configuration, stored in the database.</p>
{{template "settingsnav" .}}
<form method="post" action="/settings/logging">
<input type="hidden" name="_csrf" value="{{.CSRF}}">
<div class="row g-3">
<div class="col-12 col-xl-8">
<div class="card">
<div class="card-header">Query logging</div>
<div class="card-body">
<div class="form-section">
<div class="form-check form-switch mb-2">
<input type="hidden" name="querylog_enabled" value="false">
<input class="form-check-input" type="checkbox" role="switch" id="qlEnabled"
name="querylog_enabled" value="true" {{if $s.QueryLog.Enabled}}checked{{end}}>
<label class="form-check-label" for="qlEnabled">Record DNS queries in the database</label>
</div>
<div class="form-text">
Records are buffered in memory and written in batches, so logging never delays
a DNS response. Under sustained overload entries are dropped rather than queued.
</div>
</div>
<div class="form-section">
<div class="form-section-title">Retention</div>
<div class="alert alert-info small">
<i class="bi bi-info-circle me-1"></i>
Both limits are applied on every cleanup pass: rows older than the retention
period go first, then the table is trimmed to the row cap. Set a value to 0 to
disable that limit — but leaving both at 0 lets the database grow without bound.
</div>
<div class="row g-3">
<div class="col-6 col-md-4">
<label class="form-label" for="retentionDays">Retention</label>
<div class="input-group">
<input type="number" class="form-control" id="retentionDays" name="retention_days"
value="{{$s.QueryLog.RetentionDays}}" min="0" max="3650">
<span class="input-group-text">days</span>
</div>
</div>
<div class="col-6 col-md-4">
<label class="form-label" for="maxRows">Maximum rows</label>
<input type="number" class="form-control" id="maxRows" name="max_rows"
value="{{$s.QueryLog.MaxRows}}" min="0" max="100000000">
<div class="form-text">Currently {{num .Data.QueryLogRows}} stored</div>
</div>
<div class="col-12 col-md-4">
<label class="form-label" for="cleanupMinutes">Cleanup interval</label>
<div class="input-group">
<input type="number" class="form-control" id="cleanupMinutes" name="cleanup_minutes"
value="{{$s.QueryLog.CleanupMinutes}}" min="1" max="1440">
<span class="input-group-text">min</span>
</div>
</div>
</div>
</div>
<div class="form-section">
<div class="form-section-title">Exclusions</div>
<div class="row g-3">
<div class="col-12 col-md-6">
<label class="form-label" for="ignoreNetworks">Ignore these networks</label>
<textarea class="form-control list-input" id="ignoreNetworks" name="ignore_networks" rows="4"
placeholder="127.0.0.0/8">{{joinLines $s.QueryLog.IgnoreNetworks}}</textarea>
<div class="form-text">Queries from these clients are not logged.</div>
</div>
<div class="col-12 col-md-6">
<label class="form-label" for="ignoreDomains">Ignore these domains</label>
<textarea class="form-control list-input" id="ignoreDomains" name="ignore_domains" rows="4"
placeholder="internal.example.com">{{joinLines $s.QueryLog.IgnoreDomains}}</textarea>
<div class="form-text">Subdomains are excluded too. Useful for chatty monitoring checks.</div>
</div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">
<i class="bi bi-check-lg me-1"></i>Save logging settings
</button>
</div>
</div>
</div>
</div>
<div class="col-12 col-xl-4">
<div class="card mb-3">
<div class="card-header">Application log</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label" for="logLevel">Log level</label>
<select class="form-select" id="logLevel" name="log_level">
{{range list "debug" "info" "warn" "error"}}
<option value="{{.}}" {{if eq . $s.Logging.Level}}selected{{end}}>{{title .}}</option>
{{end}}
</select>
<div class="form-text">
Debug logs every request and resolution failure; useful when diagnosing, noisy
otherwise.
</div>
</div>
<div class="mb-3">
<label class="form-label" for="logFormat">Format</label>
<select class="form-select" id="logFormat" name="log_format">
<option value="text" {{if eq $s.Logging.Format "text"}}selected{{end}}>Text — readable in a terminal</option>
<option value="json" {{if eq $s.Logging.Format "json"}}selected{{end}}>JSON — for log shippers</option>
</select>
</div>
<div>
<label class="form-label" for="auditMaxRows">Audit log maximum rows</label>
<input type="number" class="form-control" id="auditMaxRows" name="audit_max_rows"
value="{{$s.Logging.AuditMaxRows}}" min="100" max="10000000">
<div class="form-text">Oldest entries are trimmed past this count.</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">Query log writer</div>
<div class="card-body">
<dl class="row small mb-0">
<dt class="col-7 text-body-secondary">State</dt>
<dd class="col-5 text-end">
{{if .Data.Stats.Enabled}}<span class="badge text-bg-success">on</span>
{{else}}<span class="badge text-bg-secondary">off</span>{{end}}
</dd>
<dt class="col-7 text-body-secondary">Rows written</dt>
<dd class="col-5 text-end">{{num .Data.Stats.Written}}</dd>
<dt class="col-7 text-body-secondary">Buffered</dt>
<dd class="col-5 text-end">{{num .Data.Stats.Buffered}}</dd>
<dt class="col-7 text-body-secondary">Dropped</dt>
<dd class="col-5 text-end {{if gt .Data.Stats.Dropped 0}}text-warning fw-semibold{{end}}">
{{num .Data.Stats.Dropped}}
</dd>
<dt class="col-7 text-body-secondary">Pruned</dt>
<dd class="col-5 text-end">{{num .Data.Stats.Pruned}}</dd>
</dl>
</div>
</div>
</div>
</div>
</form>
{{end}}