Το Log Rotation είναι ένας μηχανισμός αυτόματης διαχείρισης αρχείων καταγραφής που αποτρέπει την υπερχείλιση του δίσκου μέσω αρχειοθέτησης, συμπίεσης και διαγραφής παλαιών εγγραφών. Σε κινητές εφαρμογές, τα αρχεία καταγραφής συσσωρεύονται στη συσκευή του χρήστη και χωρίς περιστροφή μπορούν να καταλάβουν gigabytes μνήμης μέσα σε λίγες εβδομάδες χρήσης. Σύμφωνα με το Redis Documentation, η σωστή ρύθμιση του log rotation μειώνει τον κίνδυνο αποτυχίας του συστήματος λόγω γεμάτου δίσκου κατά 99% σε σύγκριση με την ανεξέλεγκτη αύξηση των καταγραφών. Οι κύριες στρατηγικές περιστροφής: βάσει μεγέθους αρχείου, βάσει χρόνου και βάσει αριθμού αρχείων — η κάθε μία επιλέγεται ανάλογα με το σενάριο χρήσης: το logrotate στο Linux, το CocoaLumberjack στο iOS και το Timber στο Android υποστηρίζουν και τις τρεις προσεγγίσεις.
Κύρια σημεία
Log Rotation είναι η διαδικασία περιοδικής αλλαγής του ενεργού αρχείου καταγραφής σε νέο με ταυτόχρονη αρχειοθέτηση, συμπίεση ή διαγραφή του παλαιού. Χωρίς περιστροφή, ένα αρχείο καταγραφής μεγαλώνει απεριόριστα μέχρι να γεμίσει ολόκληρο το διαμέρισμα δίσκου, οδηγώντας σε κατάρρευση της εφαρμογής και απώλεια δεδομένων.
Τυπικό σενάριο: η εφαρμογή γράφει καταγραφές στο αρχείο app.log. Όταν το app.log φτάσει τα 100 MB, το σύστημα το μετονομάζει σε app.log.1, το συμπιέζει σε app.log.1.gz και δημιουργεί ένα νέο κενό app.log. Στην επόμενη πλήρωση, το app.log.1 γίνεται app.log.2, το app.log.1.gz γίνεται app.log.2.gz και το παλιό app.log.2.gz διαγράφεται. Αυτός ο μηχανισμός ονομάζεται περιστροφή με keep count — ο αριθμός των αντιγράφων αρχειοθέτησης είναι σταθερός.
Σύμφωνα με την Splunk (2023), η λανθασμένη ρύθμιση περιστροφής είναι η αιτία του 40% των περιστατικών που σχετίζονται με γέμισμα δίσκου σε διακομιστές εφαρμογών. Για κινητές συσκευές, η περιστροφή είναι ακόμη πιο κρίσιμη, καθώς ο χρήστης δεν μπορεί και δεν πρέπει να διαχειρίζεται χειροκίνητα τις καταγραφές.
Το Log Rotation υποστηρίζει τρεις βασικές στρατηγικές που μπορούν να συνδυαστούν. Η επιλογή στρατηγικής εξαρτάται από τον τύπο εφαρμογής: τα συστήματα διακομιστών χρησιμοποιούν συχνότερα περιστροφή βάσει χρόνου, οι κινητές εφαρμογές — βάσει μεγέθους, τα ενσωματωμένα συστήματα — βάσει αριθμού αρχείων.
| Στρατηγική | Ενεργοποιητής | Πότε να χρησιμοποιείται |
|---|---|---|
| Βάσει μεγέθους | Το αρχείο έφτασε N bytes | Συστήματα υψηλού φόρτου με απρόβλεπτο όγκο καταγραφών |
| Βάσει χρόνου | Πέρασαν N ώρες/ημέρες | Καθημερινά dumps, απαιτήσεις συμμόρφωσης |
| Βάσει αριθμού αρχείων | Δημιουργήθηκαν N αρχεία | Κινητές συσκευές με περιορισμένο χώρο δίσκου |
Η περιστροφή βάσει μεγέθους εγγυάται ότι κανένα αρχείο καταγραφής δεν υπερβαίνει το καθορισμένο όριο. Το όριο επιλέγεται με βάση τον διαθέσιμο χώρο δίσκου και τη συχνότητα καταγραφής. Για έναν διακομιστή, το τυπικό όριο είναι 100–500 MB ανά αρχείο, για μια κινητή συσκευή — 1–10 MB. Εάν η εφαρμογή καταγράφει επιθετικά, το όριο πρέπει να μειωθεί, διαφορετικά η περιστροφή θα συμβαίνει κάθε λίγα λεπτά.
Η περιστροφή βάσει χρόνου είναι ανεξάρτητη από τον όγκο καταγραφών — το αρχείο αλλάζει αυστηρά σύμφωνα με το χρονοδιάγραμμα. Βολική για συστήματα όπου οι καταγραφές πρέπει να φυλάσσονται για σταθερό αριθμό ημερών: η καθημερινή περιστροφή με keep count = 30 σημαίνει 30 ημέρες αποθήκευσης. Μειονέκτημα — ένα αρχείο μπορεί να φτάσει έως και ένα gigabyte την ημέρα υπό εντατικό φόρτο.
Το logrotate είναι το τυπικό βοηθητικό πρόγραμμα Linux για αυτόματη περιστροφή καταγραφών. Εκτελείται μέσω cron και επεξεργάζεται αρχεία ρύθμισης από το /etc/logrotate.d/. Κάθε υπηρεσία (nginx, postgresql, εφαρμογή) δημιουργεί το δικό της config με διαδρομές προς τις καταγραφές, στρατηγική περιστροφής και ενέργειες μετά την περιστροφή.
# /etc/logrotate.d/myapp — περιστροφή καταγραφών εφαρμογής
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
postrotate
kill -HUP $(cat /var/run/myapp.pid)
endscript
}
Αυτή η ρύθμιση περιστρέφει τις καταγραφές καθημερινά, διατηρεί 7 αντίγραφα αρχειοθέτησης, συμπιέζει παλιά αρχεία με gzip (εκτός από το τελευταίο — delaycompress), δεν δίνει σφάλμα αν δεν υπάρχουν καταγραφές (missingok), δεν περιστρέφει κενά αρχεία (notifempty) και αναδημιουργεί το αρχείο με δικαιώματα 0640. Μετά την περιστροφή, στέλνει σήμα HUP στη διεργασία της εφαρμογής μέσω σεναρίου postrotate.
size — περιστροφή όταν επιτευχθεί μέγεθος (size 100M). rotate — αριθμός αντιγράφων αρχειοθέτησης (rotate 7). compress — συμπίεση gzip. dateext — προσθήκη ημερομηνίας στο όνομα αρχείου αντί για αύξοντα αριθμό. sharedscripts — εκτέλεση postrotate μία φορά για όλα τα αρχεία, όχι για το καθένα ξεχωριστά. maxage — διαγραφή αρχείων παλαιότερων από N ημέρες.
Σε κινητές συσκευές, το Log Rotation είναι κρίσιμο επειδή ο χρήστης δεν διαχειρίζεται το σύστημα αρχείων και δεν περιμένει η εφαρμογή να καταλάβει gigabytes με καταγραφές. Το iOS και το Android διαθέτουν ενσωματωμένους μηχανισμούς: το os_log στο iOS χρησιμοποιεί κυκλικό buffer σταθερού μεγέθους (περιστροφή με αντικατάσταση), το Android Logcat έχει περιορισμένο buffer στον πυρήνα.
Για προσαρμοσμένες καταγραφές αρχείων στο iOS χρησιμοποιείται το CocoaLumberjack με την κλάση DDFileLogger, το οποίο υποστηρίζει περιστροφή βάσει μεγέθους και χρόνου. Στο Android — Logback ή δικές του υλοποιήσεις μέσω RollingFileAppender. Και τα δύο εργαλεία επιτρέπουν τον ορισμό μέγιστου μεγέθους αρχείου και αριθμού αρχείων.
// CocoaLumberjack — περιστροφή αρχείων στο iOS
import CocoaLumberjack
let fileLogger = DDFileLogger()
fileLogger.maximumFileSize = 1024 * 1024 // 1 MB
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)
iOS: το os_log δεν απαιτεί περιστροφή — τα μηνύματα αντικαθίστανται στον κυκλικό buffer. Αλλά αν η εφαρμογή γράφει προσαρμοσμένες καταγραφές αρχείων (π.χ. για εντοπισμό σφαλμάτων ή αποστολή σε διακομιστή), η περιστροφή πρέπει να ρυθμιστεί χειροκίνητα. Το CocoaLumberjack είναι η τυπική επιλογή για ομάδες iOS, συμπιέζει αυτόματα τα αρχεία σε .gz και διαγράφει παλιά αρχεία όταν ξεπεραστεί το όριο.
Android δεν περιορίζει την εφαρμογή στην εγγραφή καταγραφών στον δικό της κατάλογο. Εάν ο προγραμματιστής γράφει debug καταγραφές σε αρχείο χωρίς περιστροφή, σε ένα μήνα ενεργής χρήσης μπορεί να καταλάβουν 500 MB — 1 GB. Ο χρήστης θα ανακαλύψει το πρόβλημα όταν το σύστημα εμφανίσει προειδοποίηση για έλλειψη χώρου και θα διαγράψει την εφαρμογή. Το Logback με RollingFileAppender λύνει αυτό το πρόβλημα: το όριο των 5 MB με 3 αρχεία εγγυάται ότι οι καταγραφές δεν θα καταλαμβάνουν ποτέ περισσότερα από 20 MB.
Παρακάτω δίνονται παραδείγματα ρύθμισης περιστροφής καταγραφών και στις δύο πλατφόρμες. Στο iOS χρησιμοποιείται CocoaLumberjack, στο Android — Logback με ρύθμιση μέσω XML.
// Logback στο Android — ρύθμιση περιστροφής στο logback.xml
// Μέγεθος αρχείου 5MB, 3 αντίγραφα αρχειοθέτησης
@file:Suppress("unused")
// Στο logback.xml:
// <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
// <file>${DATA_DIR}/logs/app.log</file>
// <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
// <fileNamePattern>app.%i.log.gz</fileNamePattern>
// <minIndex>1</minIndex>
// <maxIndex>3</maxIndex>
// </rollingPolicy>
// <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
// <maxFileSize>5MB</maxFileSize>
// </triggeringPolicy>
// </appender>
CocoaLumberjack στο iOS υποστηρίζει όχι μόνο περιστροφή βάσει μεγέθους, αλλά και διαγραφή παλαιών καταγραφών βάσει ημερομηνίας μέσω logFileManager.maximumLogFiles. Εάν ορίσετε maximumLogFiles = 0, ο περιορισμός αφαιρείται — οι καταγραφές θα συσσωρεύονται επ' αόριστον, κάτι που είναι επικίνδυνο για παραγωγή.
// Προσαρμοσμένη περιστροφή με έλεγχο συνολικού όγκου
class SizeAwareLogger {
let maxTotalSize: Int64 = 20 * 1024 * 1024
func enforceQuota(at logDirectory: URL) {
let files = (try? FileManager.default
.contentsOfDirectory(
at: logDirectory,
includingPropertiesForKeys: [.fileSize]
)) ?? []
let total = files.reduce(0) {
$0 + (try? $1.resourceValues(forKeys: [.fileSize])
.fileSize).map(Int64.init) ?? 0
}
if total > maxTotalSize {
// Διαγράφουμε το παλαιότερο αρχείο
files.sorted { $0.path < $1.path }.first.map {
try? FileManager.default.removeItem(at: $0)
}
}
}
}
Το Log Rotation δεν είναι μόνο αυτόματη αρχειοθέτηση, αλλά και δείκτης υγείας του συστήματος. Εάν οι καταγραφές περιστρέφονται πολύ συχνά (κάθε λίγα λεπτά), αυτό είναι σήμα υπερβολικής καταγραφής ή σφάλματος στην κυκλική καταγραφή σφαλμάτων (error log loop). Ρυθμίστε ειδοποιήσεις στη συχνότητα περιστροφής: περισσότερες από 10 περιστροφές την ώρα — λόγος για έλεγχο.
Συστήματα παρακολούθησης (Prometheus, Grafana, Datadog) μπορούν να παρακολουθούν μετρήσεις περιστροφής μέσω εξαγωγέων συστήματος αρχείων. Ο Prometheus node_exporter παρέχει μετρήσεις μεγέθους αρχείων και χρόνου τροποποίησής τους. Σε κινητές συσκευές, η παρακολούθηση περιστροφής είναι συνήθως ενσωματωμένη στο SDK: το CocoaLumberjack καταγράφει το συμβάν περιστροφής μέσω DDLog, και το Logback στέλνει κατάσταση μέσω appender.
Ειδοποιήσεις: εάν τα αρχεία είναι περισσότερα από τα αναμενόμενα (το rotate count ξεπέρασε το όριο) ή ο συνολικός όγκος καταγραφών ξεπέρασε την ποσόστωση — το σύστημα πρέπει να ειδοποιήσει τον διαχειριστή. Για διακομιστές, το τυπικό όριο είναι το 80% του μεγέθους διαμερίσματος, για κινητές συσκευές — ειδοποίηση όταν ξεπεραστούν τα 50 MB ανά εφαρμογή.
Συχνές ερωτήσεις
Για διακομιστές — 100–500 MB, για κινητές εφαρμογές — 1–10 MB. Πολύ μικρό όριο (κάτω από 1 MB) προκαλεί συχνή περιστροφή και περιττές λειτουργίες εισόδου/εξόδου. Πολύ μεγάλο όριο (πάνω από 500 MB) αυξάνει τον χρόνο ανοίγματος και αναζήτησης στο αρχείο.
Για παραγωγή — τουλάχιστον 7 ημέρες (καθημερινή περιστροφή) ή 3–5 αρχεία (περιστροφή βάσει μεγέθους). Για απαιτήσεις συμμόρφωσης — 30–90 ημέρες, αλλά τότε χρησιμοποιήστε ξεχωριστή αποθήκευση με συμπίεση και πολιτική διατήρησης, όχι περιστροφή στο ίδιο διαμέρισμα.
Το logrotate είναι βοηθητικό πρόγραμμα Linux, μη διαθέσιμο σε iOS και Android. Σε κινητές συσκευές, την περιστροφή υλοποιούν βιβλιοθήκες: CocoaLumberjack για iOS και Logback για Android. Δεν απαιτούν πρόσβαση root και λειτουργούν στο περιβάλλον sandbox της εφαρμογής.
Ελέγξτε αν υπάρχει κυκλική καταγραφή — όταν ο χειρισμός σφάλματος δημιουργεί το ίδιο νέο σφάλμα. Προσθέστε προστασία: μετρητή επαναλήψεων καταγραφής του ίδιου τύπου με όριο (όχι περισσότερα από 100 ίδια μηνύματα ανά λεπτό) και χρονικό αποκλεισμό μετά την υπέρβαση.
Δεν είναι υποχρεωτική, αλλά συνιστάται. Το gzip συμπιέζει τις καταγραφές κειμένου 10–20 φορές χωρίς απώλεια δεδομένων. Σε κινητές συσκευές, η συμπίεση μειώνει τον χώρο που καταλαμβάνεται από 50 MB σε 3–5 MB. Το μόνο μειονέκτημα — το αρχείο δεν μπορεί να διαβαστεί χωρίς αποσυμπίεση, αλλά για ανάλυση συνήθως χρειάζεται μόνο το τρέχον αρχείο.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης