Ένας οδηγός για προγραμματιστές Java

Ένα από τα πιο κρίσιμα μέρη της διαδικασίας ανάπτυξης λογισμικού είναι η σωστή καταγραφή. Με πολλά διαφορετικά πλαίσια καταγραφής Java διαθέσιμα, είναι σημαντικό να επιλέξετε ένα που είναι εύκολο στη χρήση. Ταυτόχρονα, το πλαίσιο της επιλογής σας θα πρέπει να έχει υψηλή απόδοση, επεκτάσιμες λειτουργίες και να επιτρέπει την προσαρμογή. Το Log4j2 είναι μια δωρεάν βιβλιοθήκη καταγραφής Java που σημειώνει όλα τα πλαίσια.

Η ενσωμάτωση του Log4j2 με οποιαδήποτε εφαρμογή ξεκλειδώνει επιλογές όπως προηγμένο φιλτράρισμα, υποστήριξη Java 8 lambda, αναζητήσεις ιδιοτήτων και προσαρμοσμένα επίπεδα καταγραφής. Ας ρίξουμε μια ματιά στο πώς μπορείτε να προσθέσετε το Log4j2 στα έργα σας και ποιες δυνατότητες μπορούν να σας βοηθήσουν να παραμείνετε στην κορυφή του παιχνιδιού σας.

Τι είναι το Log4j2;

Η καταγραφή είναι η μέθοδος σύλληψης χρήσιμων πληροφοριών, γνωστών ως αρχεία καταγραφής, που μπορούν να αναφερθούν και να αναλυθούν αργότερα. Μπορείτε να χρησιμοποιήσετε τα αρχεία καταγραφής για γρήγορο εντοπισμό σφαλμάτων στον κώδικα εφαρμογής. Τα αρχεία καταγραφής εφαρμογών βοηθούν στην κατανόηση της ροής του κώδικα και στην αντιμετώπιση προβλημάτων και σφαλμάτων παραγωγής.

Εκτός από τις περιπτώσεις διαγνωστικής χρήσης, τα αρχεία καταγραφής χρησιμοποιούνται επίσης για σκοπούς ελέγχου — για παράδειγμα, παρακολούθηση του εάν ένα μήνυμα ειδοποίησης έχει σταλεί ή όχι με επιτυχία στον χρήστη.

Η Log4j2 είναι μια από τις πιο δημοφιλείς βιβλιοθήκες καταγραφής Java. Είναι ο διάδοχος της πολύ σημαντικής βιβλιοθήκης Log4j. Αναπτύχθηκε από το Ίδρυμα Λογισμικού Apache και μέρος των Υπηρεσιών Καταγραφής Apache, το Log4j2 είναι ένα Ελεύθερο Λογισμικό Ανοιχτού Κώδικα (FOSS) που διανέμεται υπό την άδεια Apache, έκδοση 2.0.

Το Log4j2 είναι χτισμένο πάνω στη σταθερή βάση του αρχικού Log4j. Υπάρχουν πλεονεκτήματα από τη χρήση ενός Logger έναντι των απλών εντολών εκτύπωσης του System.out.println(). Αυτό περιλαμβάνει τον έλεγχο των μηνυμάτων που θα εμφανίζονται, ενώ αποφεύγετε άλλα μηνύματα καταγραφής. Η ύπαρξη κατάλληλων αρχείων καταγραφής είναι ζωτικής σημασίας σε ένα περιβάλλον παραγωγής όπου δεν υπάρχουν διαθέσιμα προγράμματα εντοπισμού σφαλμάτων.

Πώς να προσθέσετε το Log4j2 στο έργο σας;

Υπάρχουν διάφοροι τρόποι για να προσθέσετε το Log4j2 στο έργο σας Java. Συνιστάται να είστε σε Java 8 ή νεότερη έκδοση για να χρησιμοποιήσετε όλες τις δυνατότητες του Log4j2.

Ας συζητήσουμε τις διάφορες μεθόδους με τις οποίες μπορείτε να προσθέσετε Log4j2 ανάλογα με τις απαιτήσεις που μπορεί να έχετε.

Προσθήκη Log4j2 σε έργα με χρήση του Apache Maven

Εάν το έργο σας χρησιμοποιεί το Apache Maven ως σύστημα κατασκευής, οι εξαρτήσεις Log4j2 πρέπει να προστεθούν στο αρχείο pom.xml.

<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.20.0</version>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.20.0</version>
  </dependency>
</dependencies>

Προκειμένου να διευκολυνθεί η διατήρηση της ίδιας έκδοσης σε διαφορετικά τεχνουργήματα, το Log4j2 διαθέτει ένα αρχείο Bill of Material (BOM) pom.xml. Εάν το προσθέσετε στη διαχείριση εξαρτήσεων, δεν χρειάζεται να προσθέσετε μεμονωμένα τις εκδόσεις.

<!-- Add the BOM to the dependencyManagement -->
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-bom</artifactId>
      <version>2.20.0</version>
      <scope>import</scope>
      <type>pom</type>
    </dependency>
  </dependencies>
</dependencyManagement>

<!-- Once the BOM is added, the versions are not required -->
<dependencies>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
  </dependency>
</dependencies>

Προσθήκη Log4j2 σε έργα με χρήση του Apache Gradle

Σε περίπτωση που χρησιμοποιείτε το Apache Gradle ως εργαλείο δόμησης, μπορείτε να προσθέσετε τις εξαρτήσεις Log4j2 στο αρχείο build.gradle.

dependencies {
  implementation 'org.apache.logging.log4j:log4j-api:2.20.0'
  implementation 'org.apache.logging.log4j:log4j-core:2.20.0'
}

Εάν χρησιμοποιείτε την έκδοση Gradle 5.0 ή νεότερη, έχετε την επιλογή να εισαγάγετε το Log4j2 Maven Bill Of Materials (BOM) προκειμένου να διατηρήσετε συνεπείς εκδόσεις εξάρτησης. Αυτό μπορεί να επιτευχθεί προσθέτοντας τα ακόλουθα στο αρχείο build.gradle.

dependencies {
  implementation platform('org.apache.logging.log4j:log4j-bom:2.20.0')

  implementation 'org.apache.logging.log4j:log4j-api'
  runtimeOnly 'org.apache.logging.log4j:log4j-core'
}

Για τις εκδόσεις Gradle 2.8-4.10, δεν υπάρχει επιλογή για απευθείας εισαγωγή του Maven BOM. Πρέπει να προσθέσετε ένα πρόσθετο πρόσθετο για τη λειτουργία διαχείρισης εξαρτήσεων.

plugins {
  id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

dependencyManagement {
  imports {
    mavenBom 'org.apache.logging.log4j:log4j-bom:2.20.0'
  }
}

dependencies {
  implementation 'org.apache.logging.log4j:log4j-api'
  runtimeOnly 'org.apache.logging.log4j:log4j-core'
}

Προσθήκη Log4j2 σε αυτόνομες εφαρμογές χωρίς εργαλείο κατασκευής

Εάν το έργο σας δεν διαθέτει εργαλείο κατασκευής, μπορείτε να κάνετε λήψη της απαιτούμενης έκδοσης τεχνουργήματος του Log4j2 από την επίσημη σελίδα λήψης Log4j2.

  Διορθώστε το InputMapper Δεν ήταν δυνατό να ανοίξει αποκλειστικά το DS4

Αφού τα κατεβάσετε, πρέπει να βεβαιωθείτε ότι η διαδρομή τάξης της εφαρμογής σας περιλαμβάνει τα ακόλουθα βάζα.

  • log4j-api-2.20.0.jar
  • log4j-core-2.20.0.jar

Ποια είναι τα στοιχεία στο Log4j2;

Για να κατανοήσετε τα χαρακτηριστικά του Log4j2 και να χρησιμοποιήσετε τις δυνατότητές του στο έπακρο, είναι σημαντικό να κατανοήσετε πώς λειτουργεί το Log4j2. Κάτω από την επιφάνεια, πολλά δομικά στοιχεία συνθέτουν το Log4j2. Ας τους μιλήσουμε ένα προς ένα.

#1. LoggerContext

Το LoggerContext είναι η κεντρική μονάδα του συστήματος καταγραφής. Διατηρεί όλα τα Logger που ζητούνται στην εφαρμογή. Έχει επίσης μια αναφορά στη Διαμόρφωση.

#2. Διαμόρφωση

Η Διαμόρφωση περιέχει όλες τις πληροφορίες που απαιτούνται από το σύστημα καταγραφής. Αυτό περιλαμβάνει τα καταγραφικά, τα προσαρτήματα, τα φίλτρα και άλλα. Στο Log4j2, μπορείτε να ορίσετε τη Διαμόρφωση χρησιμοποιώντας διάφορες μορφές αρχείων όπως XML, JSON και YAML, καθώς και μέσω προγραμματισμού μέσω του API Log4j2.

Πραγματοποιείται αυτόματη επαναφόρτωση κάθε φορά που αλλάζει κάποια ιδιότητα στη Διαμόρφωση. Ως εκ τούτου, δεν υπάρχει απαίτηση για επανεκκίνηση της εφαρμογής.

#3. Κόπτων δέντρα διά ξυλείαν

Το κύριο συστατικό του συστήματος Log4j2 είναι το Logger. Τα καταγραφικά λαμβάνονται μέσα στον κώδικα της εφαρμογής χρησιμοποιώντας τη δήλωση LogManager.getLogger() και χρησιμοποιούνται για τη δημιουργία αρχείων καταγραφής. Τα μηνύματα καταγραφής μπορούν να δημιουργηθούν σε διάφορα επίπεδα σοβαρότητας, όπως εντοπισμός σφαλμάτων, πληροφορίες, προειδοποίηση, σφάλμα και μοιραία.

#4. LoggerConfig

Το LoggerConfig είναι υπεύθυνο για τη συμπεριφορά ενός συγκεκριμένου Logger. Καθορίζει τη συμπεριφορά και τις ρυθμίσεις για την καταγραφή συμβάντων που δημιουργούνται από το συγκεκριμένο καταγραφικό. Επιτρέπει τη διαμόρφωση διαφορετικών επιπέδων καταγραφής, τη ρύθμιση των προσαρτημάτων και την εφαρμογή φίλτρων.

#5. Φίλτρο

Μπορείτε να επεξεργαστείτε επιλεκτικά συμβάντα καταγραφής στο Log4j2 χρησιμοποιώντας Φίλτρα. Τα φίλτρα εφαρμόζονται με βάση συγκεκριμένα κριτήρια. Μπορείτε να εφαρμόσετε αυτά τα φίλτρα σε καταγραφικά ή προσαρτήματα. Τα φίλτρα ελέγχουν ποια συμβάντα καταγραφής επιτρέπεται να περάσουν μέσω του αγωγού καταγραφής για περαιτέρω επεξεργασία. Με τη βοήθεια φίλτρων, η συμπεριφορά καταγραφής μπορεί να ρυθμιστεί με ακρίβεια, διασφαλίζοντας ότι γίνεται επεξεργασία μόνο των σχετικών αρχείων καταγραφής.

#6. Appender

Ο προορισμός οποιουδήποτε μηνύματος καταγραφής καθορίζεται από το Appender. Ένα μόνο Logger μπορεί να έχει πολλαπλά Appenders. Ένα συμβάν καταγραφής θα σταλεί σε όλα τα Appenders για το συγκεκριμένο Logger. Το Log4j2 έχει πολλά προρυθμισμένα προσαρτήματα. Για παράδειγμα, το ConsoleAppender χρησιμοποιείται για την καταγραφή μηνυμάτων στην κονσόλα και το FileAppender για την έξοδο μηνυμάτων σε ένα αρχείο. Κάθε Appender χρειάζεται τη δική του Διάταξη που καθορίζει πώς θα μοιάζει το τελικό μήνυμα καταγραφής.

#7. Διάταξη

Στο Log4j2, το Layout χρησιμοποιείται για να ορίσει πώς θα μοιάζει το τελικό μήνυμα καταγραφής. Ένα Layout σχετίζεται με ένα Appender. Ενώ ένα Appender καθορίζει τον προορισμό εξόδου, το Layout περιγράφει τον τρόπο με τον οποίο θα εξαχθεί το μήνυμα.

Τα κορυφαία 5 χαρακτηριστικά του Log4j2

Το Log4j2 είναι πλούσιο σε χαρακτηριστικά και αυτό είναι που το ξεχωρίζει από άλλα διαθέσιμα πλαίσια καταγραφής Java. Από την ύπαρξη Asynchronous Logger μέχρι την υποστήριξη Java 8 lambda, το Log4j2 έχει ένα πλεονέκτημα έναντι άλλων. Ας συζητήσουμε μερικά από τα αξιοσημείωτα χαρακτηριστικά αυτού του πλαισίου.

#1. Επέκταση των λειτουργιών χρησιμοποιώντας πρόσθετα

Στο Log4j 1.x, για να δημιουργηθούν επεκτάσεις, απαιτήθηκαν πολλές τροποποιήσεις κώδικα. Το Log4j2 λύνει το πρόβλημα της επεκτασιμότητας εισάγοντας το σύστημα Plugin.

Μπορείτε να δηλώσετε μια νέα προσθήκη χρησιμοποιώντας τον σχολιασμό @Plugin στην τάξη σας. Χρησιμοποιώντας τη δύναμη των Προσθηκών, μπορείτε να δημιουργήσετε τα δικά σας στοιχεία όπως Φίλτρα και Εφαρμογές. Στοιχεία τρίτων μπορούν επίσης να προστεθούν εύκολα στη βιβλιοθήκη.

#2. Υποστήριξη Java 8 Lambda

Με την κυκλοφορία της Log4j2 έκδοσης 2.4, εισήχθη η υποστήριξη για εκφράσεις λάμδα Java 8. Με τις εκφράσεις λάμδα, μπορείτε να ορίσετε τη λογική καταγραφής ενσωματωμένα. Αυτό μειώνει την ανάγκη για ελέγχους πολλαπλών γραμμών ή ανώνυμες εσωτερικές κατηγορίες. Αυτό διασφαλίζει επίσης ότι οι ακριβές μέθοδοι δεν εκτελούνται άσκοπα. Έτσι, όχι μόνο ο κώδικας είναι πιο καθαρός και πιο ευανάγνωστος, αλλά μειώνεται και η επιβάρυνση του συστήματος.

  11 καλύτερα πορτοφόλια Solana για να προστατεύσετε την επένδυσή σας με σιγουριά

Ας εξετάσουμε ένα παράδειγμα όπου καταγράφετε το αποτέλεσμα μιας δαπανηρής λειτουργίας, αλλά μόνο εάν το επίπεδο εντοπισμού σφαλμάτων είναι ενεργοποιημένο. Πριν από την υποστήριξη για λάμδα, αυτό θα γινόταν χρησιμοποιώντας τον παρακάτω κώδικα:

if (logger.isDebugEnabled()) {
    logger.debug("The output of the given operation is: {}", expensiveOperation());
}

Η ύπαρξη πολλαπλών τέτοιων περιπτώσεων χρήσης θα εισαγάγει άσκοπα ελέγχους υπό όρους. Ωστόσο, με το Log42, η ίδια ενέργεια μπορεί να πραγματοποιηθεί ως εξής:

logger.debug("The output of the given operation is: {}", () -> expensiveOperation()

Η μέθοδος exprensiveOperation() αξιολογείται μόνο εάν το επίπεδο εντοπισμού σφαλμάτων είναι ενεργοποιημένο. Δεν υπάρχει ανάγκη για ρητούς ελέγχους.

#3. Ασύγχρονοι καταγραφείς

Κάθε συμβάν καταγραφής είναι μια λειτουργία I/O, η οποία αυξάνει την επιβάρυνση του συστήματος. Για να μετριαστεί αυτό, το Log4j2 εισάγει Ασύγχρονους Καταγραφείς που εκτελούνται σε ξεχωριστό νήμα από το νήμα της εφαρμογής. Όταν χρησιμοποιείτε Asynchronous Loggers, το νήμα καλούντος ανακτά αμέσως τον έλεγχο μετά την κλήση της μεθόδου logger.log().

Αυτό του επιτρέπει να συνεχίσει με τη λογική της εφαρμογής αντί να περιμένει να ολοκληρωθεί το συμβάν καταγραφής. Η αξιοποίηση αυτής της ασύγχρονης συμπεριφοράς επιτυγχάνει μεγαλύτερη απόδοση καταγραφής. Μπορείτε είτε να επιλέξετε να κάνετε όλα τα καταγραφικά ασύγχρονα από προεπιλογή είτε να έχετε ένα μείγμα σύγχρονης και ασύγχρονης συμπεριφοράς.

#4. Καταγραφή χωρίς σκουπίδια

Στη Java, η συλλογή σκουπιδιών είναι η διαδικασία με την οποία τα αχρησιμοποίητα αντικείμενα στην εφαρμογή καθαρίζονται αυτόματα. Αν και δεν χρειάζεται να φροντίσετε χειροκίνητα αυτή τη λειτουργία, η συλλογή σκουπιδιών έχει τα δικά της έξοδα.

Εάν η εφαρμογή σας δημιουργεί πάρα πολλά αντικείμενα σε σύντομο χρονικό διάστημα, η διαδικασία συλλογής σκουπιδιών ενδέχεται να καταλαμβάνει περισσότερους πόρους συστήματος από ό,τι χρειάζεται. Πολλές βιβλιοθήκες καταγραφής, συμπεριλαμβανομένων των προηγούμενων εκδόσεων του Log4j, δημιουργούν πολλά προσωρινά αντικείμενα κατά τη διαδικασία καταγραφής. Στη συνέχεια, η αυξημένη πίεση στον συλλέκτη απορριμμάτων επηρεάζει την απόδοση του συστήματος.

Από την έκδοση 2.6, το Log4j2 εκτελείται σε λειτουργία “χωρίς σκουπίδια”. Αυτή είναι η προεπιλεγμένη συμπεριφορά. Ως εκ τούτου, τα αντικείμενα επαναχρησιμοποιούνται και η δημιουργία προσωρινών μειώνεται σημαντικά.

Οι παρακάτω εικόνες δείχνουν πώς η έκδοση 2.6 Log4j2 μετριάζει το πρόβλημα των περιττών αντικειμένων, σε σύγκριση με την έκδοση Log4j2 2.5.

Στην έκδοση Log4j2 2.5, δημιουργούνται πολλά προσωρινά αντικείμενα κατά τη διαδικασία καταγραφής. Πηγή: apache.org

Στο Log4j2.6, δεν υπάρχουν προσωρινά αντικείμενα που δημιουργούνται κατά τη διαδικασία καταγραφής. Πηγή: apache.org

#5. Αναζητήσεις

Στο log4j2, μπορείτε να προσθέσετε πληροφορίες με βάση τα συμφραζόμενα στα αρχεία καταγραφής σας χρησιμοποιώντας τις αναζητήσεις. Χρησιμοποιώντας τα, μπορείτε να προσθέσετε δεδομένα από διάφορες πηγές, όπως ιδιότητες συστήματος, μεταβλητές περιβάλλοντος ή προσαρμοσμένες τιμές. Έτσι, μπορείτε να συμπεριλάβετε σχετικές πληροφορίες που ανακτώνται δυναμικά, καθιστώντας τα αρχεία καταγραφής πιο χρήσιμα.

Ας εξετάσουμε ένα παράδειγμα όπου θέλετε να καταγράψετε το αναγνωριστικό περιόδου σύνδεσης του χρήστη με όλες τις γραμμές καταγραφής. Αυτό θα σας επιτρέψει να αναζητήσετε όλα τα αρχεία καταγραφής που αντιστοιχούν σε ένα αναγνωριστικό περιόδου λειτουργίας.

Ο τρόπος brute-force για να γίνει αυτό θα ήταν να προσθέσετε ρητά το αναγνωριστικό περιόδου λειτουργίας ξεχωριστά, κάτι που γίνεται δύσκολο να διατηρηθεί. Σύντομα μπορεί να ξεχάσετε να το προσθέσετε, χάνοντας έτσι πολύτιμες πληροφορίες.

logger.info("The user data has been fetched for session id {}", sessionId);
...
logger.info("The transaction has been processed for session id {}", sessionId);
...
logger.info("Request has been successfully processed for session id {}", sessionId);

Ένας καλύτερος τρόπος για να το κάνετε αυτό θα ήταν να χρησιμοποιήσετε την Αναζήτηση χάρτη περιβάλλοντος. Το αναγνωριστικό συνεδρίας μπορεί να προστεθεί στο πλαίσιο νήματος στον κώδικα της εφαρμογής. Στη συνέχεια, η τιμή μπορεί να χρησιμοποιηθεί στη διαμόρφωση Log4j2. Έτσι εξαλείφεται η ανάγκη για ρητή αναφορά σε μηνύματα καταγραφής.

ThreadContext.put("sessionId", sessionId);

Μόλις προστεθεί η τιμή, η ίδια μπορεί να χρησιμοποιηθεί στην Αναζήτηση χρησιμοποιώντας τη λέξη-κλειδί ctx.

<File name="Application" fileName="application.log">
  <PatternLayout>
    <pattern>%d %p %c{1.} [%t] $${ctx:sessionId} %m%n</pattern>
  </PatternLayout>
</File>

Πώς να δημιουργήσετε προσαρμοσμένα επίπεδα καταγραφής στο Log4j2;

Τα επίπεδα καταγραφής στο Log4j2 χρησιμοποιούνται για την κατηγοριοποίηση συμβάντων καταγραφής με βάση τη σοβαρότητα ή τη σημασία τους. Μπορείτε να ελέγξετε το επίπεδο καταγραφής όταν καταγράφετε ένα μήνυμα στον κωδικό της εφαρμογής.

Για παράδειγμα, η logger.debug() προσθέτει το επίπεδο DEBUG. Αντίστοιχα, η logger.error() προσθέτει το επίπεδο ERROR. Αυτό καθορίζει ποια μηνύματα θα εμφανίζονται τελικά στην έξοδο. Μπορείτε να διαμορφώσετε το επίπεδο καταγραφής στο αρχείο διαμόρφωσης.

  MongoDB Atlas Charts: A Beginner's Guide

Τα προρυθμισμένα επίπεδα καταγραφής στο Log4j2 και οι αντίστοιχες τιμές τους αναφέρονται παρακάτω.

OFF0FATAL100 ERROR200WARN300INFO400DEBUG500TRACE600ALLMAX VALUE

Εάν το επίπεδο καταγραφής έχει οριστεί σε ένα συγκεκριμένο επίπεδο, τότε εξάγονται όλες οι γραμμές καταγραφής για αυτήν την αντίστοιχη τιμή και αυτές που βρίσκονται πάνω από αυτήν (με μικρότερη τιμή). Οι άλλοι αγνοούνται.

Για παράδειγμα, εάν ορίσετε το επίπεδο καταγραφής σε ΠΡΟΕΙΔΟΠΟΙΗΣΗ, τότε θα εμφανιστούν μηνύματα ΠΡΟΕΙΔΟΠΟΙΗΣΗ, ΣΦΑΛΜΑ και ΦΑΤΑΛ. Οποιαδήποτε γραμμή καταγραφής με διαφορετικό επίπεδο θα αγνοηθεί. Αυτό είναι ιδιαίτερα χρήσιμο όταν εκτελείτε τον ίδιο κώδικα σε διαφορετικά περιβάλλοντα.

Ίσως θέλετε να ορίσετε το επίπεδο καταγραφής σε ΠΛΗΡΟΦΟΡΙΕΣ ή ΕΝΤΟΠΙΣΜΟΣ ΣΦΑΛΜΑΤΩΝ κατά την εκτέλεση του κώδικα στο περιβάλλον ανάπτυξης. Αυτό θα σας επιτρέψει να δείτε περισσότερα αρχεία καταγραφής και να βοηθήσετε στη διαδικασία ανάπτυξης. Ωστόσο, όταν εκτελείται σε περιβάλλον παραγωγής, θα θέλατε να το ορίσετε σε ERROR. Έτσι, θα μπορείτε να εστιάσετε στην εύρεση του προβλήματος σε περίπτωση που παρουσιαστεί κάποια ανωμαλία και να μην χρειαστεί να περάσετε από περιττές γραμμές καταγραφής.

Μπορεί να συμβεί ότι θέλετε να προσθέσετε το δικό σας Προσαρμοσμένο Επίπεδο Καταγραφής εκτός από τα προρυθμισμένα. Το Log4j2 σας επιτρέπει να το κάνετε εύκολα. Ας δούμε πώς μπορείτε να προσθέσετε τα δικά σας επίπεδα καταγραφής και να τα χρησιμοποιήσετε στην εφαρμογή σας.

#1. Προσθήκη προσαρμοσμένου επιπέδου καταγραφής χρησιμοποιώντας το αρχείο διαμόρφωσης

Μπορείτε να προσθέσετε προσαρμοσμένα επίπεδα καταγραφής δηλώνοντάς τα στο αρχείο διαμόρφωσης.

Στο παρακάτω παράδειγμα, έχει οριστεί ένα προσαρμοσμένο επίπεδο καταγραφής με το όνομα NOTICE με τιμή 450. Αυτό το τοποθετεί μεταξύ INFO (με τιμή 400) και DEBUG (με τιμή 500). Αυτό σημαίνει ότι εάν το επίπεδο έχει οριστεί σε ΕΙΔΟΠΟΙΗΣΗ, τότε τα μηνύματα INFO θα καταγράφονται, αλλά τα μηνύματα DEBUG θα παραλείπονται.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <CustomLevels>
    <CustomLevel name="NOTICE" intLevel="450" />
  </CustomLevels>
 
  <Appenders>
    <File name="MyFile" fileName="logs/app.log">
      <PatternLayout pattern="%d %-7level %logger{36} - %msg%n"/>
    </File>
  </Appenders>
  <Loggers>
    <Root level="trace">
      <AppenderRef ref="MyFile" level="NOTICE" />
    </Root>
  </Loggers>
</Configuration>

#2. Προσθήκη προσαρμοσμένου επιπέδου καταγραφής σε κώδικα

Εκτός από τη δήλωση τους στο αρχείο διαμόρφωσης, μπορείτε να ορίσετε τα δικά σας προσαρμοσμένα επίπεδα καταγραφής στον κώδικά σας.

final Level VERBOSE = Level.forName("VERBOSE", 550);

Αυτό θα δημιουργήσει ένα νέο επίπεδο καταγραφής που ονομάζεται VERBOSE. Αυτό το επίπεδο καταγραφής θα βρίσκεται μεταξύ DEBUG (με τιμή 500) και TRACE (με τιμή 600). Εάν το καταγραφικό έχει οριστεί στο επίπεδο VERBOSE, τότε όλα τα μηνύματα καταγραφής του VERBOSE και άνω θα καταγράφονται, συμπεριλαμβανομένου του DEBUG. Ωστόσο, τα μηνύματα TRACE θα παραβλεφθούν.

#3. Χρησιμοποιώντας το επίπεδο προσαρμοσμένου αρχείου καταγραφής στον κώδικα

Τα προσαρμοσμένα επίπεδα καταγραφής πρέπει πρώτα να δηλωθούν πριν χρησιμοποιηθούν. Μπορείτε να τα δηλώσετε είτε στο αρχείο ρυθμίσεων είτε στον κώδικά σας. Μόλις δηλώσετε, είστε ελεύθεροι να τα χρησιμοποιήσετε.

Αυτό το παράδειγμα κώδικα δείχνει πώς μπορείτε να δηλώσετε ένα προσαρμοσμένο επίπεδο που ονομάζεται ΕΙΔΟΠΟΙΗΣΗ και στη συνέχεια να χρησιμοποιήσετε το ίδιο.

final Level NOTICE = Level.forName("NOTICE", 550);

final Logger logger = LogManager.getLogger();
logger.log(NOTICE, "a notice level message");

Αν και αυτό θα δημιουργήσει το απαιτούμενο μήνυμα με το επίπεδο που δημιουργήθηκε πρόσφατα, μπορεί να είναι δύσκολο να περνάτε πάντα το επίπεδο ρητά. Ευτυχώς, μπορείτε να δημιουργήσετε τον πηγαίο κώδικα, ώστε να έχετε βοηθητικές μεθόδους για την καταγραφή των προσαρμοσμένων επιπέδων σας. Χρησιμοποιώντας το ίδιο, θα μπορείτε να χρησιμοποιήσετε τη δική σας μέθοδο logger.notice() παρόμοια με τον τρόπο που θα χρησιμοποιούσατε την logger.debug() ή την logger.error().

Το Log4j2 συνοδεύεται από ένα βοηθητικό πρόγραμμα που σας βοηθά να δημιουργήσετε τα δικά σας εκτεταμένα καταγραφικά. Η ακόλουθη εντολή δημιουργεί ένα αρχείο Java που ονομάζεται CustomLogger.java. Αυτό το αρχείο περιέχει τις υπάρχουσες μεθόδους καταγραφής, μαζί με τις μεθόδους που δημιουργήθηκαν πρόσφατα για το επίπεδο ΕΙΔΟΠΟΙΗΣΗ.

java -cp log4j-core-2.20.0.jar org.apache.logging.log4j.core.tools.ExtendedLoggerGenerator 
        com.example.CustomLogger NOTICE=450 > com/example/CustomLogger.java

Μόλις δημιουργηθεί το αρχείο, μπορείτε να χρησιμοποιήσετε την κλάση στον κώδικά σας για τη δημιουργία νέων καταγραφών. Αυτά τα καταγραφικά θα περιέχουν πρόσθετες μεθόδους για το προσαρμοσμένο επίπεδο καταγραφής σας. Μπορείτε έτσι να επεκτείνετε τη λειτουργικότητα των καταγραφών σας.

final Logger logger = CustomLogger.create(ValueFirstSmsSender.class);

//this new method is similar to using logger.debug()
logger.notice("a notice level message");

συμπέρασμα

Το Log4j2 είναι ένα πολύ ισχυρό πλαίσιο καταγραφής Java, που προσφέρει ένα ευρύ φάσμα δυνατοτήτων, διαμορφώσεων, βελτιώσεων απόδοσης και πολλά άλλα. Με τα αρχεία καταγραφής να αποτελούν πολύ σημαντικό μέρος της διαδικασίας ανάπτυξης λογισμικού, η ύπαρξη ενός ισχυρού πλαισίου όπως το Log4j2 ενισχύει τις ικανότητες της εφαρμογής.

Η ευελιξία και η επεκτασιμότητα του Log4j2 επιτρέπουν τη σωστή καταγραφή των γεγονότων που συμβαίνουν στην εφαρμογή σας. Στη συνέχεια, σας δίνει τη δυνατότητα να σκεφτείτε τα αρχεία καταγραφής ως ένα ισχυρό εργαλείο για τον εντοπισμό σφαλμάτων και τον έλεγχο. Με όλες τις δυνατότητες και τις βελτιώσεις του, το Log4j2 ξεχωρίζει και καθιστά τον εαυτό του την προτιμώμενη επιλογή σε ένα ευρύ φάσμα έργων λογισμικού.

Μπορεί επίσης να σας ενδιαφέρουν αυτά τα Java IDE και τα online compliers.