Docker και Log Rotation

Docker και Log Rotation: Πώς να διαχειριστείτε τα logs σωστά

Τα logs είναι το αίμα κάθε σύγχρονου server. Αν δεν τα διαχειρίσετε σωστά, ένα απλό verbose container μπορεί να γεμίσει τον δίσκο και να ρίξει ολόκληρο το production. Στον κόσμο του Docker, υπάρχουν πολλοί τρόποι να κάνετε log rotation — από τον built‑in json-file driver μέχρι centralized λύσεις όπως fluentd, syslog ή cloud παρόχους. Σε αυτόν τον οδηγό θα εξηγήσουμε τις επιλογές, θα δώσουμε παραδείγματα και θα προτείνουμε βέλτιστες πρακτικές για να κρατήσετε τα logs σας υπό έλεγχο.

Γιατί το log rotation είναι σημαντικό;

Χωρίς rotation, τα log files μπορούν να μεγαλώσουν ανεξέλεγκτα. Αυτό οδηγεί σε εξαντλημένο disk space, επιβράδυνση I/O και δυσλειτουργίες στο server. Επιπλέον, η απουσία κεντρικής συλλογής κάνει δύσκολη την ανάλυση, το alerting και τη συμμόρφωση (retention policies).

Τι logging drivers προσφέρει το Docker;

Το Docker υποστηρίζει διάφορους logging drivers. Κάθε driver διαφοροποιείται ως προς το που αποθηκεύει τα logs, πως γίνεται το rotation και τι metadata στέλνει:

  • json-file — default driver. Γράφει JSON logs τοπικά σε /var/lib/docker/containers. Υποστηρίζει max-size και max-file για rotation.
  • local — νέος, πιο αποδοτικός local driver με ενσωματωμένο rotation. Συστήνεται για τοπική αποθήκευση όταν δεν θέλετε εξωτερικό aggregator.
  • journald — στέλνει τα logs στο systemd journald, το οποίο διαχειρίζεται retention/rotation μέσω των δικών του ρυθμίσεων.
  • syslog — στέλνει logs στο syslog daemon (π.χ. rsyslog, syslog-ng). Ο syslog daemon αναλαμβάνει rotation/retention.
  • fluentd, gelf, awslogs, splunk, κ.ά. — στέλνουν logs σε central aggregator που αναλαμβάνει retention, ανάλυση και indexing.
  • none — απενεργοποιεί logging για noisy containers.

Παραδείγματα: docker run και docker-compose

Ο πιο απλός τρόπος για να ενεργοποιήσετε rotation είναι στο container level με --log-driver και --log-opt.

docker run -d \
  --log-driver=json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  --name my-app myimage
    

Αν χρησιμοποιείτε docker-compose, μπορείτε να προσθέσετε logging κάτω από την υπηρεσία:

services:
  app:
    image: myimage
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    

Daemon-level defaults (daemon.json)

Μπορείτε να ορίσετε default logging driver και options για όλα τα containers μέσω του /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
    

Ποια επιλογή να διαλέξω;

Η επιλογή εξαρτάται από τις ανάγκες σας:

  • Για μικρές εγκαταστάσεις: json-file με max-size/max-file ή ο local driver καλύπτει τις ανάγκες.
  • Για production / πλήθος containers: Κεντρική λύση (fluentd, ELK, Splunk, awslogs). Αυτό αποφεύγει τοπική συσσώρευση και επιτρέπει αναζήτηση και retention policies.
  • Για περιπτώσεις με υψηλή απόδοση I/O: local driver συνήθως επιδόσεων.
  • Αν χρειάζεστε audit και system-level retention: journald ή syslog.

Λεπτομέρειες για json-file και local

Ο json-file driver γράφει γραμμικά αρχεία JSON per container. Όταν ρυθμίσετε max-size και max-file, το Docker θα κάνει rotate τα αρχεία και θα κρατήσει μέχρι τον αριθμό που δώσατε. Παράδειγμα: max-size=10m και max-file=3 σημαίνει ότι θα κρατηθούν μέχρι 3 αρχεία των 10MB.

Ο local driver είναι σχεδιασμένος για καλύτερη απόδοση και ελαφρώς πιο αποδοτική αποθήκευση. Υποστηρίζει επίσης max-size και max-file. Σε νεότερες Docker εκδόσεις προτείνεται το local για local storage.

Μην χρησιμοποιείτε logrotate ταυτόχρονα με το built‑in rotation

Είναι συχνό λάθος να αφήσετε το Docker να κάνει rotation και παράλληλα να έχετε system logrotate να κάνει copytruncate στα ίδια αρχεία. Αυτό μπορεί να δημιουργήσει race conditions ή προβλήματα ανάγνωσης των logs από το Docker. Επιλέξτε είτε να εμπιστευτείτε τον Docker logging driver (προτεινόμενο) είτε να απενεργοποιήσετε την εσωτερική ρύθμιση και να διαχειρίζεστε τα αρχεία με logrotate προσεκτικά.

Αν θέλετε πραγματικά να χρησιμοποιήσετε logrotate, ένα βασικό παράδειγμα για τα container logs (όμως προσοχή) θα μοιάζει με αυτό:

/var/lib/docker/containers/*/*.log {
  rotate 7
  daily
  compress
  missingok
  copytruncate
}
    

Η χρήση του copytruncate μειώνει τον κίνδυνο αλλά δεν τον εξαφανίζει. Γι’ αυτό, όπου είναι δυνατόν, προτιμήστε τις ενσωματωμένες επιλογές του Docker.

Centralized logging: γιατί και πώς

Οι centralized λύσεις (π.χ. ELK stack, Loki, Splunk, Datadog, AWS CloudWatch) φέρνουν δυνατά πλεονεκτήματα:

  • Αναζήτηση και index πάνω σε τεράστιο όγκο logs.
  • Retention policies και συμμόρφωση.
  • Alerting και dashboards.
  • Επεξεργασία, parsing και structured logs.

Για να τα συνδέσετε με Docker, επιλέξτε τον αντίστοιχο logging driver (fluentd, gelf, awslogs, splunk). Παράδειγμα για fluentd:

docker run -d \
  --log-driver=fluentd \
  --log-opt fluentd-address=fluentd:24224 \
  --log-opt tag="{{.Name}}/{{.ID}}" \
  myimage
    

Βέλτιστες πρακτικές

  • Ρυθμίστε max-size και max-file για κάθε container ή στο daemon.json.
  • Για production, στείλτε logs σε centralized system για ανάλυση και retention.
  • Αποφύγετε το διπλό rotation (Docker + logrotate).
  • Χρησιμοποιήστε structured logging (JSON) από τις εφαρμογές σας για ευκολότερο parsing.
  • Απενεργοποιήστε logging για containers που είναι πολύ noisy με --log-driver=none.
  • Προσοχή σε disk usage: παρακολουθήστε /var/lib/docker και ρυθμίστε alerts.
  • Προσθέστε metadata (labels) ώστε ο aggregator να έχει context (service, environment, version).

Συμπέρασμα

Το σωστό log rotation στο Docker δεν είναι μόνο θέμα αποφυγής γεμάτων δίσκων: είναι θέμα observability, απόδοσης και συμμόρφωσης. Για μικρά deployments, οι built‑in επιλογές json-file ή local με max-size και max-file αρκούν. Σε μεγαλύτερα ή παραγωγικά περιβάλλοντα, προτιμήστε centralized logging με fluentd, ELK, Splunk ή cloud providers. Κάθε λύση έχει πλεονεκτήματα — το σημαντικό είναι να έχετε πολιτική retention, monitoring του disk usage και consistent configuration (container-level ή daemon-level).

Θέλετε ένα μικρό cheatsheet για να ξεκινήσετε; Ακολουθήστε αυτά τα βήματα:

  1. Αποφασίστε αν θα κρατήσετε logs τοπικά ή θα τα στείλετε σε aggregator.
  2. Αν τοπικά: daemon.json defaults ή container-level --log-opt με max-size/max-file.
  3. Αν aggregator: ρυθμίστε logging driver (fluentd/gelf/awslogs) και βεβαιωθείτε για tags/metadata.
  4. Παρακολουθείτε disk usage και εφαρμόστε alerts.

Αν θέλετε, μπορώ να σας βοηθήσω να γράψουμε το daemon.json ή το docker-compose.yml για το περιβάλλον σας — πείτε μου τον τύπο του workload και το retention που θέλετε.


Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *