Log Output

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 file dengan roll_size, roll_keep, dan roll_keep_days untuk deployment VM/bare metal agar log tidak memenuhi disk.
  • Di container / Docker, gunakan output stdout dan biarkan Docker atau Kubernetes mengelola log rotation dan aggregation.
  • output discard berguna untuk mematikan logging endpoint yang sangat high-frequency (health check) tanpa mengorbankan log untuk endpoint lain.
  • Output net memungkinkan 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_days yang 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
About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact