Log Output #
Output adalah tujuan akhir dari log entries — ke mana Caddy mengirimkan log yang sudah diformat. Caddy mendukung beberapa tipe output: file (dengan rotation otomatis), stdout, stderr, discard (untuk mematikan log), dan net (untuk remote logging via TCP/UDP).
Memilih output yang tepat tergantung pada environment: development biasanya cukup dengan stderr, production di VM butuh file dengan rotation, container environment lebih natural dengan stdout, dan microservices besar mungkin perlu net output langsung ke log aggregator.
Tipe Output yang Tersedia #
file → Tulis ke file lokal, dengan rotation otomatis opsional
stdout → Standard output (file descriptor 1)
stderr → Standard error (file descriptor 2) — DEFAULT
discard → Buang semua log (matikan logging)
net → Kirim via TCP atau UDP ke remote server
Output: File #
example.com {
log {
output file /var/log/caddy/access.log
format json
}
}
File dengan Rotation Lengkap #
example.com {
log {
output file /var/log/caddy/access.log {
# Rotate saat ukuran file mencapai N (default: 100MB)
roll_size 100mb
# Berapa file rotasi yang disimpan (default: 10)
roll_keep 7
# Hapus file lebih lama dari N hari (default: 90)
roll_keep_days 30
# Nonaktifkan kompresi file rotasi (default: aktif)
# roll_uncompressed
# Format nama file rotasi menggunakan timestamp
# Default: access.log.2024-01-15T14-30-45.000.gz
}
format json
}
}
Output: stdout dan stderr #
# Output ke stdout (cocok untuk Docker/container)
example.com {
log {
output stdout
format json
}
}
# Output ke stderr (default Caddy)
{
log {
output stderr
format console
level INFO
}
}
Output: discard #
example.com {
log {
# Matikan logging sama sekali untuk site ini
# Berguna jika site mendapat sangat banyak traffic
# dan log tidak diperlukan
output discard
}
file_server { root /var/www/html }
}
# Atau matikan log global
{
log {
output discard
}
}
Output: net (Remote Logging) #
{
log {
# Kirim log ke remote syslog server via UDP
output net udp/syslog-server:514
format json
}
}
# Atau via TCP (lebih reliable, tapi ada overhead koneksi)
{
log {
output net tcp/log-aggregator:5000
format json
}
}
Strategi Output per Environment #
Development #
# Development: output ke console yang mudah dibaca
{
debug
log {
output stderr
format console
level DEBUG
}
}
localhost:8080 {
log {
output stdout
format console
level DEBUG
}
reverse_proxy localhost:3000
}
Staging #
# Staging: mirip production tapi lebih verbose
{
log {
output file /var/log/caddy/server.log {
roll_size 50mb
roll_keep 5
roll_keep_days 14
}
format json
level INFO
}
}
staging.example.com {
log {
output file /var/log/caddy/staging-access.log {
roll_size 100mb
roll_keep 5
roll_keep_days 14
}
format json
}
reverse_proxy staging-backend:3000
}
Production #
# Production: log terstruktur, rotation agresif, level minimal
{
log {
output file /var/log/caddy/server.log {
roll_size 50mb
roll_keep 10
roll_keep_days 30
}
format json
level WARN
}
}
example.com {
log {
output file /var/log/caddy/access.log {
roll_size 500mb # Traffic lebih tinggi
roll_keep 14 # 2 minggu history
roll_keep_days 90 # 3 bulan untuk compliance
}
format filter {
wrap json
fields {
request>headers delete
request>tls delete
}
}
}
reverse_proxy backend:3000
}
Container / Docker Environment #
Di lingkungan container, stdout/stderr adalah pilihan terbaik:
# Dockerfile / container — log ke stdout
{
log {
output stdout
format json
level INFO
}
}
:80 {
log {
output stdout
format json
}
file_server { root /var/www/html }
}
# docker-compose.yml — konfigurasi log driver
services:
caddy:
image: caddy:2.8.4
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "5"
ports:
- "80:80"
- "443:443"
# Lihat log dari Docker
docker logs caddy --tail 100 -f
# Atau dengan format yang lebih baik
docker logs caddy -f 2>&1 | jq .
Kubernetes Environment #
# Caddy sebagai sidecar atau deployment di K8s
# Log ke stdout, K8s/Fluentd/Loki handle aggregation
# ConfigMap untuk Caddyfile
apiVersion: v1
kind: ConfigMap
metadata:
name: caddy-config
data:
Caddyfile: |
{
log {
output stdout
format json
level INFO
}
}
:80 {
log {
output stdout
format json
}
reverse_proxy backend-svc:3000
}
# Promtail config untuk K8s — ambil log dari stdout
# /etc/promtail/config.yml
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- json:
expressions:
level: level
ts: ts
msg: msg
- labels:
level:
Integrasi dengan Syslog #
{
# Kirim log ke syslog lokal via UDP
log {
output net udp/127.0.0.1:514
format json
}
}
# /etc/rsyslog.d/caddy.conf
# Terima log dari Caddy via UDP
$ModLoad imudp
$UDPServerRun 514
# Simpan log Caddy ke file terpisah
:programname, isequal, "caddy" /var/log/caddy/syslog.log
& stop
Monitoring Disk Usage Log #
# Cek ukuran semua log Caddy
du -sh /var/log/caddy/
du -sh /var/log/caddy/*.log
# Cek log yang paling besar
ls -lhS /var/log/caddy/
# Monitor pertumbuhan log
watch -n 60 'du -sh /var/log/caddy/'
# Estimasi berapa cepat log berkembang (MB per jam)
SIZE_START=$(du -sb /var/log/caddy/ | cut -f1)
sleep 3600
SIZE_END=$(du -sb /var/log/caddy/ | cut -f1)
GROWTH=$(( (SIZE_END - SIZE_START) / 1048576 ))
echo "Log growth: ${GROWTH} MB/hour"
echo "Estimated daily: $((GROWTH * 24)) MB/day"
Ringkasan #
- Gunakan
output filedenganroll_size,roll_keep, danroll_keep_daysuntuk deployment VM/bare metal agar log tidak memenuhi disk.- Di container / Docker, gunakan
output stdoutdan biarkan Docker atau Kubernetes mengelola log rotation dan aggregation.output discardberguna untuk mematikan logging endpoint yang sangat high-frequency (health check) tanpa mengorbankan log untuk endpoint lain.- Output
netmemungkinkan streaming log real-time ke remote aggregator (Logstash, Fluentd, syslog) tanpa menulis ke disk lokal — ideal untuk environment microservices.- Monitor disk usage log secara berkala — log yang tumbuh tak terkendali bisa menghabiskan disk dan menyebabkan Caddy crash.
- Gunakan
roll_keep_daysyang sesuai dengan kebutuhan compliance — log security mungkin perlu disimpan 1 tahun, access log biasa cukup 30-90 hari.
← Sebelumnya: Format Log Berikutnya: xcaddy →
Flush Interval dan Buffering #
Caddy melakukan buffering log sebelum ditulis ke disk. Ini meningkatkan performa tapi artinya log terbaru mungkin belum ditulis saat terjadi crash:
example.com {
log {
output file /var/log/caddy/access.log
format json
# Default: Caddy mengelola buffering secara internal
# Untuk critical applications, pertimbangkan output ke stdout
# dan biarkan OS atau log shipper yang handle buffering
}
}
Log ke Multiple Files dengan Handle #
Jika kamu ingin beberapa jenis request dicatat ke file yang berbeda:
example.com {
# Log request API ke file terpisah
handle /api/* {
log {
output file /var/log/caddy/api-access.log {
roll_size 200mb
roll_keep 7
}
format json
}
reverse_proxy api-backend:8080
}
# Log semua request lainnya ke file utama
handle {
log {
output file /var/log/caddy/web-access.log {
roll_size 100mb
roll_keep 7
}
format json
}
file_server { root /var/www/html }
}
}
Pendekatan ini memungkinkan retensi dan monitoring yang berbeda antara API traffic (biasanya butuh lebih lama untuk audit) dan web traffic biasa.
Estimasi Kebutuhan Disk untuk Log #
# Hitung rata-rata ukuran per log entry
head -100 /var/log/caddy/access.log | \
awk '{sum += length($0)} END {print "Avg entry size:", sum/NR, "bytes"}'
# Estimasi kebutuhan disk:
# Misal: 1000 req/detik, avg 500 bytes per entry
# = 500,000 bytes/detik
# = 43.2 GB/hari (tanpa kompresi)
# = ~8 GB/hari (dengan kompresi ~80%)
# Tips: gunakan filter untuk hapus field besar seperti headers
# bisa mengurangi ukuran per entry 40-60%
# Cek rasio kompresi file rotasi Caddy
ls -lh /var/log/caddy/access.log* | head -5