Στον σημερινό οδηγό θα μελετήσουμε τους τρόπους με τους οποίους μπορούμε να βλέπουμε τα logs τους συστήματος όπου γίνεται καταγραφή συμβάντων από εφαρμογές, υπηρεσίες και συσκευές συστήματος και να φιλτράρουμε με βάση τις ανάγκες μας.
Όπως συμβαίνει με όλα τα λειτουργικά συστήματα, έτσι και το Linux δημιουργεί λίστα αρχείων καταγραφής συμβάντων για όλα τα υποσυστήματα του. Αυτά τα αρχεία έχουν συνήθως επέκταση αρχείου .log
και δημιουργούνται στην διαδρομή /var/log/
του συστήματος αρχείων.
Αυτά τα αρχεία τα είχαμε δει στο πως τα διαχειρίζεται το σύστημά μας στο σχετικό άρθρο «Log files: Καταγραφές, Ρουφιάνοι και ανακύκλωση» όπου μάθαμε για το πως γίνεται ανεύρεση και ανάγνωση των αρχείων καταγραφής με τον «παραδοσιακό» τρόπο.
Με την έλευση του systemd η ανάλυση αρχείων καταγραφής από τους χρήστες έχει απλοποιηθεί σημαντικά. Το systemd είναι ο νέος διαχειριστής των διαφόρων υπηρεσιών του Linux, που έρχεται ως προ-επιλεγμένος στις δημοφιλέστερες Linux διανομές. Ξεκινά μαζί με το σύστημα μας και το εποπτεύει στο σύνολο του. Έρχεται πακεταρισμένο με πολλές λειτουργίες εκ τον οποίο αυτό που αφορά την ανεύρεση και ανάγνωση των αρχείων καταγραφής είναι το Journald.
Το Journald είναι μια υπηρεσία συστήματος που ασχολείται για τη συλλογή και αποθήκευση δεδομένων καταγραφής του συστήματος την οποία μπορούμε να επιβλέπουμε και να την διαχειριζόμαστε με το εργαλείο journalctl. Το Journald προσπαθεί να διευκολύνει τους διαχειριστές συστήματος στο να βρουν σημαντικές και σχετικές πληροφορίες μεταξύ των, αδιαλείπτως αυξανόμενου σε αριθμό, μηνυμάτων καταγραφής. Μία από τις κύριες αλλαγές με την έλευση του Journald ήταν η αντικατάσταση των αρχείων καταγραφής απλού κειμένου με μια ειδική μορφή αρχείου βελτιστοποιημένη για μηνύματα log. Φέρνει επίσης σε μεμονωμένα συστήματα μας (υπολογιστές, server κλπ) μέρος της ισχύος των μεγάλων logging υλοποιήσεων που βασίζονται σε βάσεις δεδομένων.
Πριν ξεκινήσουμε με το journalctl θεωρώ ότι γνωρίζετε πως να βλέπετε ποιες υπηρεσίες εκτελούνται στο Linux σύστημά σας είτε αυτό είναι ένας υπολογιστής είτε server. Αν όχι τότε σταματήστε εδώ και ανοίξτε τον οδηγό:
Καταγραφή και επίβλεψη ενεργειών του συστήματος
Η υπηρεσία journald
αποθηκεύει την λίστα των αρχείων καταγραφής είτε μόνιμα στο /var/log/journal
είτε σε έναν εφήμερο φάκελο στο /run/log/journal
. Στην τελευταία περίπτωση χάνεται κατά την επανεκκίνηση. Από προεπιλογή, τα δεδομένα καταγραφής αποθηκεύονται μόνιμα εάν το /var/log/journal
υπάρχει κατά την εκκίνηση.
Το journald
μπορεί να ρυθμιστεί μέσω του αρχείου /etc/systemd/journald.conf
όπου για παράδειγμα μπορείτε να χρησιμοποιήστε το Storage =
για να διαμορφώστε πού θα τοποθετούνται τα δεδομένα καταγραφής, ανεξάρτητα από την ύπαρξη του /var/log/journal/
. Περισσότερα για τις διαθέσιμες ρυθμίσεις του journald.conf, δείτε την τεκμηρίωσή του.
Ανάλυση Αρχείων Καταγραφής
Ας υποθέσουμε λοιπόν ότι στο σύστημα μας μια υπηρεσία συμπεριφέρεται με μη αναμενόμενο τρόπο. Για παράδειγμα έχουμε στήσει έναν απομονωμένο μικρό nginx server στο laptop μας διαβάζοντας τον οδηγό:
Ας υποθέσουμε ότι για κάποιον λόγο το nginx δεν ξεκινάει οπότε θα πρέπει να δούμε την κατάστασή του:
sudo systemctl status nginx.service
Αυτό βέβαια μπορεί να είναι η κορυφή του παγόβουνου οπότε για να δούμε και ποιες άλλες υπηρεσίες έχουν αποτύχει τρέχουμε στον server:
sudo systemctl list-units --failed

Βλέπουμε λοιπόν ότι πράγματι κάτι δεν πάει καλά.
Για να δούμε τι μας λένε τα αρχεία καταγραφής του nginx τρέχουμε:
sudo journalctl -u nginx.service
Μπορούμε επίσης να δούμε ταυτόχρονα και άλλες υπηρεσίες :
sudo journalctl -u nginx.service -u mysql.service
Η παραπάνω εντολή θα μας δείξει τα logs της από την πρώτη στιγμή μέχρι την τελευταία φορά που καταγράφηκε ένα συμβάν. Στην περίπτωση του παραδείγματος μας όπου το nginx τρέχει σε έναν μικρό lxd server, δεν θα δούμε άπειρα μηνύματα. Αν όμως θέλουμε να περιορίσουμε τα μηνύματα σε μια χρονική περίοδο, μπορούμε να το κάνουμε με τις παραμέτρους --since
(από) και --until
(έως) :
sudo journalctl -u nginx.service --since "2020-03-11 17:05:00" --until "2020-04-21 18:05:00"
Η μορφή ώρας είναι η ακόλουθη
έτος-μήνας-ημέρα ώρα:λεπτά:δευτερόλεπτα
Επίσης το Journalctl μπορεί, για παράδειγμα, να κατανοήσει λέξεις όπως «ago», «today», «yesterday», «now». Για να ανακτήσετε παράδειγμα τα μηνύματα καταγραφής από χθες, πληκτρολογήστε την παρακάτω εντολή:
sudo journalctl --since yesterday
Φυσικά τα αποτελέσματα που εμφανίζονται μπορούν να συνδυαστούν με άλλες εντολές όπως π.χ. το grep:
sudo journalctl --since yesterday | grep smartd
Η παραπάνω εντολή μου φέρνει χθεσινές καταγραφές logs για το smartd
που είναι μια υπηρεσία ελέγχουν «υγείας» των δίσκων.
Επίσης με την παράμετρο -n
μπορούμε να περιορίσουμε τον αριθμό των πιο πρόσφατων καταχωρήσεων στα logs. Στην παρακάτω εντολή, προβάλουμε τα τελευταία 50 μηνύματα που καταγράφηκαν την τελευταία ώρα.
sudo journalctl -n 50 --since "1 hour ago"
Η παράμετρος -r
εμφανίζει τις καταχωρήσεις με αντίστροφη χρονολογική σειρά, επομένως τα τελευταία μηνύματα προβάλονται πρώτα. Η παρακάτω εντολή εμφανίζει τα τελευταία 10 μηνύματα από της υπηρεσίας nginx, σε αντίστροφη σειρά.
sudo journalctl -u nginx.service -r -n 1
Το παράδειγμά μας ήταν συγκεκριμένο για μια ή δύο υπηρεσίες οι οποίες είδαμε ότι έχουν προβληματική συμπεριφορά και βλέποντας τα μηνύματά τους στο αρχείο καταγραφής συμβάντων, μας δίνει πληροφορίες για το τι πήγε στραβά. Ας δούμε όμως πως μπορούμε να φιλτράρουμε τα αποτελέσματά μας.
Μηνύματα εκκίνησης (Boot)
Αν θέλετε να δείτε τα μηνύματα του πυρήνα Linux τότε χρησιμοποιείτε την παράμετρο -k
sudo journalctl -k
Το Journald καταγράφει αυτόματα κάθε συμβάν σε αρχείο καταγραφής ανά εκκίνηση συστήματος. Για να περιορίσετε τα αρχεία καταγραφής που αφορούν την τρέχουσα εκκίνηση (εκκίνηση 0), χρησιμοποιήστε το -b
.
sudo journalctl -b
Μπορείτε να προβάλετε μηνύματα από προηγούμενη εκκίνηση η οποία καταγράφεται ως «μετατόπιση -1», η την προ προηγούμενη εκκίνηση πριν το οποίο έχει -2 και ούτω καθεξής. Εδώ, λαμβάνουμε μηνύματα από την τελευταία εκκίνηση:
sudo journalctl -b -1
Για να προβάλετε όλες τις καταγραφές του συστήματος που έχουν γίνει ανά εκκίνηση συστήματος, χρησιμοποιήστε την ακόλουθη εντολή:
sudo journalctl --list-boots

Το πρώτο πεδίο είναι το λεγόμενο offset
απο την τωρινή εκκίνηση (0 είναι η τελευταία εκκίνηση, -1 είναι προηγούμενη και ούτω καθεξής), ακολουθούμενο από ένα αναγνωριστικό εκκίνησης (ένας μεγάλος δεκαεξαδικός αριθμός), ακολουθούμενο από τις χρονικές χρονικές καταγραφές του πρώτου και του τελευταίου μηνύματος που σχετίζονται με αυτήν την εκκίνηση.
Παρακολούθηση αρχείων καταγραφής
Σε περίπτωση που θέλουμε να παρακολουθούμε «live» όλα τα μηνύματα του συστήματος τότε μπορούμε να δώσουμε την παράμετρο -f
(από το follow):
sudo journalctl -f
Για να σταματήσετε την παρακολούθηση πατήστε Ctrl + C
.
Αν θέλουμε να παρακολουθούμε συγκεκριμένα μια υπηρεσία (π.χ. έχουμε μια ιστοσελίδα που τρέχει με nginx) τότε συνδυάζουμε αυτά που είδαμε μέχρι τώρα με την παράμετρο –u
sudo journalctl -u nginx.service -f
Κατά προτεραιότητα
Μια σημαντική παράμετρος είναι η προβολή μόνο με βάση ένα κριτήριο προτεραιότητας. Το Systemd πέρα από την καταγραφή ανά εκκίνηση συστήματος, που είδαμε νωρίτερα, ταξινομεί τα μηνύματα ανά επίπεδο προτεραιότητας για να είναι εύκολη η διάκρισή τους. Η ταξινόμηση καταγραφής ακολουθεί το κλασικό πρωτόκολλο Syslog (RFC 5424).
Ένας κωδικός «σοβαρότητας» μιας καταγραφής (στο journald ονομάζεται προτεραιότητα) χρησιμοποιείται για να επισημάνει τη σημασία ενός μηνύματος σύμφωνα με το RFC 5424 Ενότητα 6.2.1
Επίπεδο | Σοβαρότητα | Λέξη Κλειδί |
0 | Επείγον | emerg |
1 | Συναγερμός | alert |
2 | Κρίσιμος | crit |
3 | Σφάλμα | err |
4 | Προειδοποίηση | warning |
5 | Ειδοποίηση | notice |
6 | Ενημερωτικό | info |
7 | Αποσφαλμάτωση | debug |
Άρα με βάση τον παραπάνω πίνακα μπορούμε να προβάλουμε π.χ. μηνύματα με βάση την σοβαρότητά τους από επείγοντα έως και κρίσιμα :
sudo journalctl -p "emerg".."crit"
Αρχεία καταγραφής χρηστών
Προσέξτε, εδώ όταν μιλάμε για χρήστες δεν αναφερόμαστε μόνο σε «ανθρώπους». Το Linux διαθέτει λογαριασμό χρηστών για διάφορες υπηρεσίες τα οποία χρησιμοποιούνται με συγκεκριμένα δικαιώματα και κυρίως από εφαρμογές. Κάθε χρήστης λοιπόν έχει ένα αναγνωριστικό UID το οποίο μπορείτε να μάθετε με την εντολή id
.
Για παράδειγμα όσοι ασχολείστε με web developing θα έχετε χρησιμοποιήσει αμέτρητες φορές τον χρήστη www-data
για παραχώρηση δικαιωμάτων χρήσης του web φακέλου. Επομένως για να δείτε το id
του χρήστη www-data
:
id www-data
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Άρα για να φιλτράρουμε τα logs με βάση αυτόν τον χρήστη 33
δίνουμε με _UID=<αριθμός>
:
sudo journalctl _UID=www-data
Αρχεία καταγραφής δραστηριότητας
Το ίδιο πράγμα μπορούμε να κάνουμε και με την δραστηριότητα μια εκτελούμενης εφαρμογής η υπηρεσίας. Επομένως βρίσκουμε το Process ID (PID) της εφαρμογής που μας ενδιαφέρει είτε με το top
ή με ps aux | grep sshd
ή τέλος με :
pgrep -u root sshd
Ο αριθμός που μας εμφανίζει είναι το αναγνωριστικό της διεργασίας οπότε το δίνουμε στην παράμετρο _PID=<αριθμός>
:
sudo journalct _PID=<αριθμός>
Μορφές προβολής
Κάτι που είναι ιδιαιτέρα χρήσιμο ειδικά για τους developers, DevOps κλπ είναι η παράμετρος -o
η οποία μας επιτρέπει να διαμορφώσουμε την έξοδο – προβολή των περιεχομένων των log files. H -o
μπορεί να πάρει μερικές τιμές όπως:
- Το
jsonwill
θα εμφανίζει κάθε εγγραφή σε μορφή json σε μια γραμμή. Αυτό είναι χρήσιμο κατά την αποστολή των αρχείων καταγραφής σε μια κεντρική υπηρεσία καταγραφής ή ανάλυσης, καθώς τα καθιστά ευκολότερα στην ανάλυση. - Το
json-pretty
θα εμφανίζει κάθε καταχώριση σε ευανάγνωστη μορφή json. - Το
verbose
θα εμφανίζει πολύ λεπτομερείς πληροφορίες για κάθε εγγραφή. - Η
cat
εμφανίζει μηνύματα σε πολύ περιληπτική μορφή, χωρίς ημερομηνία/ώρα κ.α. - Η
short
είναι η προεπιλεγμένη μορφή εξόδου. Εμφανίζει τα μηνύματα σε στυλ syslog. - Η
short-monotonic
είναι παρόμοια με τηνshort
σύντομο, αλλά η χρονικής «σφραγίδας» εμφανίζεται με ακρίβεια. Αυτό μπορεί να είναι χρήσιμο όταν εξετάζετε μηνύματα σφάλματος που δημιουργούνται από περισσότερες από μία πηγές, τα οποία προφανώς εμφανίζουν τα μηνύματα σφάλματος ταυτόχρονα και θέλετε να μεταβείτε στο αναλυτικό επίπεδο.
Για παράδειγμα, η ακόλουθη εντολή προβάλει τα αρχεία καταγραφής από τον Apache σε μορφή json-pretty.
sudo journalctl -u apache2.service -r -o json-pretty
{
"_BOOT_ID" : "6c92864cbcc64a5fabebe04147953894",
"SYSLOG_FACILITY" : "3",
"_UID" : "0",
"_GID" : "0",
...
"UNIT" : "apache2.service",
"CODE_LINE" : "2039",
"CODE_FUNCTION" : "unit_notify",
"MESSAGE" : "apache2.service: Unit entered failed state.",
"_SOURCE_REALTIME_TIMESTAMP" : "1561068031809136"
}
Μπορείτε να δείτε μια σειρά σημαντικών πεδίων όπως ο χρήστης (UID), η ομάδα (GID), η κρισιμότητα κατά syslog, ακόμη και η θέση του κώδικα που δημιούργησε το μήνυμα (εάν υπάρχει).
Διαχείριση των αρχείων καταγραφής Linux
Ανάλογα με την διανομή Linux, θα έχουν ρυθμιστεί και οι παράμετροι του journald
από τους δημιουργούς της. Μια σημαντική παράμετρος είναι το μέγεθος της λίστας καταγραφών του συστήματος.
Για να ελέγξετε πόσος χώρος στο δίσκο καταλαμβάνεται αυτήν τη στιγμή από τα logs του journald, χρησιμοποιήστε την παράμετρο --disk-usage
journalctl --disk-usage
Οι ιδιότητες του, όπως είπαμε ρυθμίζονται στο αρχείο journald.conf
.
Μπορούμε να «καθαρίσουμε» τις αρχειοθετημένες εγγραφές (πολύ κακή ιδέα σε server) είτε δηλώνοντας πόσο θέλουμε να μικρύνει το μέγεθος του καταλόγου με την παράμετρο --vacuum-size
είτε διαγράφοντας τις παλιότερες από την --vacuum-time=10day
που θα δηλώσουμε.
sudo journalctl --vacuum-size=500M
Επίσης μπορούμε να χρησιμοποιήσετε την επιλογή --vacuum-files
, η οποία διαγράφει τα πάντα εκτός από τον καθορισμένο αριθμό αρχείων logs που θα δηλώσετε. Για παράδειγμα, εάν έχετε 10 αρχειοθετημένα αρχεία καταγραφών και θέλετε να τα μειώσετε σε 2, μπορείτε να το κάνετε εκτελώντας την ακόλουθη εντολή:
sudo journalctl --vacuum-files=5
Τέλος μπορείτε να επιβεβαιώσετε την ακεραιότητα των αρχείων καταγραφής συμβάντων με την:
sudo journalctl --verify

Συνοψίζοντας
Στον σημερινό οδηγό, ολοκληρώνουμε τον προηγούμενο, αφού μπήκαμε στα βαθιά βλέποντας τα μηνύματα που μας στέλνουν τα διάφορα υποσυστήματα του λειτουργικού συστήματος.
Είδαμε πού αποθηκεύονται, πως ρυθμίζουμε τις ιδιότητές του, πως φιλτράρουμε την λίστα με τα μηνύματα συμβάντων σύμφωνα με τις ανάγκες μας, αλλά και πως διαχειριζόμαστε το μέγεθος των αρχειοθετημένων εγγραφών.
Ελπίζω να σας φανεί χρήσιμος.
Εξαιρετικό!
Κάτι για CentOS <6.7 version έχουμε;.. εξίσου όμορφο, default εαν γίνεται;
Ευχαριστώ!
6.7 ? Με πας χρόνια πίσω ! Δυστυχώς δεν υπάρχει κάτι αντίστοιχο του journalctl μια προς μια εντολή. Εκεί είναι οι κλασικές εντολές grep/cat awk που πρέπει να συνδυάσεις για να βρεις αυτό που θες