Log4j: come configurare la registrazione dei file più semplice ansible?

La mia storia:

Voglio fare una cosa che è semplice come un logger log4j il più semplice ansible che registra le righe in un file. Ho trovato diversi esempi con alcune funzionalità, ma non uno di base, generale, che funziona davvero, e non uno con una spiegazione su come funziona ogni riga.

Domanda:

Qualcuno potrebbe fornirne uno?

Prerequisiti:

  • So già dove mettere il file e ho il log4j configurato e funzionante per la registrazione della console.
  • Ora voglio accedere a un file e anche trovare il file dal file system una volta eseguito il programma.
  • Le righe necessarie per essere aggiunte al file log4j.properties esistente sono l’output desiderato.

Ho un file log4j.xml generico per te:

                                     

con una console, due file appender e un logger in coda al secondo file appender invece del primo.

MODIFICARE

In uno dei vecchi progetti ho trovato un semplice file log4j.properties:

 # For the general syntax of property based configuration files see # the documentation of org.apache.log4j.PropertyConfigurator. # The root category uses two appenders: default.out and default.file. # The first one gathers all log output, the latter only starting with # the priority INFO. # The root priority is DEBUG, so that all classs can be logged unless # defined otherwise in more specific properties. log4j.rootLogger=DEBUG, default.out, default.file # System.out.println appender for all classs log4j.appender.default.out=org.apache.log4j.ConsoleAppender log4j.appender.default.out.threshold=DEBUG log4j.appender.default.out.layout=org.apache.log4j.PatternLayout log4j.appender.default.out.layout.ConversionPattern=%-5p %c: %m%n log4j.appender.default.file=org.apache.log4j.FileAppender log4j.appender.default.file.append=true log4j.appender.default.file.file=/log/mylogfile.log log4j.appender.default.file.threshold=INFO log4j.appender.default.file.layout=org.apache.log4j.PatternLayout log4j.appender.default.file.layout.ConversionPattern=%-5p %c: %m%n 

Per la descrizione di tutti gli argomenti di layout vedi qui: log4j PatternLayout argomenti

                

Log4j può essere un po ‘confuso. Quindi cerchiamo di capire cosa sta succedendo in questo file: In log4j hai due costrutti base appendici e logger.

Gli appendici definiscono come e dove vengono aggiunte le cose. Sarà registrato su un file, sulla console, su un database, ecc.? In questo caso si specifica che le istruzioni del registro indirizzate a fileAppender verranno inserite nel file sample.log utilizzando il modello specificato nei tag di layout . Si potrebbe facilmente creare un appender per la console o il database. Dove l’appender della console specifica cose come il layout sullo schermo e l’appender del database avrebbe i dettagli della connessione e i nomi delle tabelle.

I logger rispondono agli eventi di registrazione man mano che aumentano. Se un evento cattura l’interesse di uno specifico registratore, invocherà i suoi allegati allegati. Nell’esempio seguente è disponibile un solo logger per il logger principale, che risponde per impostazione predefinita a tutti gli eventi di registrazione. Oltre al logger root è ansible specificare logger più specifici che rispondono agli eventi da pacchetti specifici. Questi logger possono avere i propri appendici specificati usando i tag appender-ref o altrimenti erediteranno gli appenders dal logger root. L’uso di logger più specifici consente di mettere a punto il livello di registrazione su pacchetti specifici o di indirizzare determinati pacchetti ad altri appendici.

Quindi, quello che sta dicendo questo file è:

  1. Crea un fileAppender che accede al file sample.log
  2. Collega quell’appender al logger principale.
  3. Il logger root risponderà a tutti gli eventi almeno dettagliati come il livello di ‘debug’
  4. L’appender è configurato per registrare solo eventi che siano almeno dettagliati come ‘info’

Il netto è che se hai un logger.debug("blah blah") nel tuo codice verrà ignorato. Un logger.info("Blah blah"); uscirà su sample.log.

Lo snippet seguente potrebbe essere aggiunto al file sopra con i tag log4j . Questo logger erediterebbe gli appenders da ma limiterebbe tutti gli eventi di registrazione dal pacchetto org.springframework a quelli registrati a livello di info o superiori.

      

Ecco una semplice che uso spesso:

 # Set up logging to include a file record of the output # Note: the file is always created, even if there is # no actual output. log4j.rootLogger=error, stdout, R # Log format to standard out log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n # File based log output log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R.File=owls_conditions.log log4j.appender.R.MaxFileSize=10000KB # Keep one backup file log4j.appender.R.MaxBackupIndex=1 log4j.appender.R.layout=org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern= %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n 

Il formato del registro è il seguente:

 ERROR [2009-09-13 09:56:01,760] [main] (RDFDefaultErrorHandler.java:44) http://www.xfront.com/owl/ontologies/camera/#(line 1 column 1): Content is not allowed in prolog. 

Tale formato è definito dalla stringa %5p\t[%d] [%t] (%F:%L)\n \t%m%n\n . È ansible leggere il significato dei caratteri di conversione in log4j javadoc per PatternLayout .

I commenti inclusi dovrebbero aiutare a capire cosa fa. Ulteriori note:

  • registra sia per console che per file; in questo caso il file si chiama owls_conditions.log : cambia in base alle tue esigenze;
  • i file vengono ruotati quando raggiungono 10000 KB e viene conservato un file di backup

Ecco un file log4j.properties che ho utilizzato con grande successo.

 logDir=/var/log/myapp log4j.rootLogger=INFO, stdout #log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{MM/dd/yyyy hh:mm:ss a}|%-5p|%-30c{1}| %m%n log4j.appender.stdout.DatePattern='.'yyyy-MM-dd log4j.appender.stdout.File=${logDir}/myapp.log log4j.appender.stdout.append=true 

Il DailyRollingFileAppender creerà nuovi file ogni giorno con nomi di file che assomigliano a questo:

 myapp.log.2017-01-27 myapp.log.2017-01-28 myapp.log.2017-01-29 myapp.log <-- today's log 

Ogni voce nel file di registro avrà questo formato:

 01/30/2017 12:59:47 AM|INFO |Component1 | calling foobar(): userId=123, returning totalSent=1 01/30/2017 12:59:47 AM|INFO |Component2 | count=1 > 0, calling fooBar() 

Imposta la posizione del file sopra usando -Dlog4j.configuration , come menzionato in questo post :

 java -Dlog4j.configuration=file:/home/myapp/config/log4j.properties com.foobar.myapp 

Nel codice Java, assicurarsi di impostare il nome di ciascun componente software quando si crea un'istanza del proprio object logger. Mi piace anche accedere sia al file di registro che allo standard output, quindi ho scritto questa piccola funzione.

 private static final Logger LOGGER = Logger.getLogger("Component1"); public static void log(org.apache.log4j.Logger logger, String message) { logger.info(message); System.out.printf("%s\n", message); } public static String stackTraceToString(Exception ex) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); return sw.toString(); } 

E poi chiamalo così:

 LOGGER.info(String.format("Exception occurred: %s", stackTraceToString(ex)));