Regole e consigli per la registrazione?

11

Nella mia organizzazione abbiamo messo insieme alcune regole / gilde sulla registrazione che vorrei sapere se è possibile aggiungere o commentare.

Usiamo Java ma puoi commentare in generale sull'accesso - regole e consigli

  1. Utilizza il livello di registrazione corretto

    • ERRORE: Qualcosa è andato storto e deve essere risolto immediatamente
    • ATTENZIONE: il processo può continuare senza correzione. L'applicazione dovrebbe tollerare questo livello ma l'avviso dovrebbe sempre essere analizzato.
    • INFO: informazioni sul completamento di un processo importante
    • DEBUG. Viene utilizzato solo durante lo sviluppo
  2. Assicurati di sapere cosa stai loggando.

  3. Evita che il log influenzi il comportamento dell'applicazione

La funzione della registrazione dovrebbe essere quella di scrivere messaggi nel registro.

  1. I messaggi di log dovrebbero essere descrittivi, chiari, brevi e concisi.

Non c'è molto uso di un messaggio senza senso durante la risoluzione dei problemi.

  1. Inserisci le proprietà giuste in log4j

Indica che il metodo e la classe corretti sono scritti automaticamente.

Esempio:

Datedfile -web

log4j.rootLogger=ERROR, DATEDFILE
log4j.logger.org.springframework=INFO
log4j.logger.waffle=ERROR
log4j.logger.se.prv=INFO
log4j.logger.se.prv.common.mvc=INFO
log4j.logger.se.prv.omklassning=DEBUG

log4j.appender.DATEDFILE=biz.minaret.log4j.DatedFileAppender
log4j.appender.DATEDFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATEDFILE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}.%M] - %m%n

log4j.appender.DATEDFILE.Prefix=omklassning.
log4j.appender.DATEDFILE.Suffix=.log
log4j.appender.DATEDFILE.Directory=//localhost/WebSphereLog/omklassning/
  1. Valore log.

Si prega di registrare i valori dall'applicazione.

  1. Prefisso registro.

Indica quale parte dell'applicazione è quella da cui è stato scritto il log, preferibilmente con qualcosa per il prefisso concordato del progetto, ad es. PANDORA_DB

  1. La quantità di testo.

Fai attenzione in modo che non ci sia troppo testo di registrazione. Può influenzare le prestazioni dell'app.

  1. Formato di registrazione:

-Ci sono diverse varianti e metodi da usare con log4j ma vorremmo un uso uniforme del seguente formato, quando accediamo alle eccezioni:

logger.error("PANDORA_DB2: Fel vid hämtning av frist i TP210_RAPPORTFRIST", e);

Nell'esempio sopra si presuppone che abbiamo impostato le proprietà di log4j in modo che scriva automaticamente la classe e il metodo.

Usa sempre il logger e non il seguente:

System.out.println(), System.err.println(), e.printStackTrace()

Se l'app web utilizza il nostro framework, puoi ottenere informazioni di errore molto dettagliate da EJB, se usi try-catch nel gestore e loggati secondo il modello sopra:

Nel nostro progetto utilizziamo questo modello di conversione con il quale i nomi dei metodi e delle classi vengono scritti automaticamente. Qui usiamo due diversi modelli per console e per outputfile datato:

log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

log4j.appender.DATEDFILE.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

In entrambi gli esempi sopra il metodo e la classe verranno scritti. Nel numero di riga della console verrà scritto anche il nostro.

  1. toString()

Si prega di avere una toString() per ogni oggetto. EX:

@Override
public String toString() {
  StringBuilder sb = new StringBuilder();
  sb.append(" DwfInformation [ ");
  sb.append("cc: ").append(cc);
  sb.append("pn: ").append(pn);
  sb.append("kc: ").append(kc);
  sb.append("numberOfPages: ").append(numberOfPages);
  sb.append("publicationDate: ").append(publicationDate);
  sb.append("version: ").append(version);
  sb.append(" ]");
  return sb.toString();
}

invece del metodo speciale che rende queste uscite

public void printAll()
{
    logger.info("inbet: " + getInbetInput());
    logger.info("betdat: " + betdat);
    logger.info("betid: " + betid);
    logger.info("send: " + send);
    logger.info("appr: " + appr);
    logger.info("rereg: " + rereg);   
    logger.info("NY: " + ny);   
    logger.info("CNT: " + cnt);   
}

Quindi c'è qualcosa che puoi aggiungere, commentare o trovare discutibile con questi modi di usare il logging? Sentiti libero di rispondere o commentare anche se non è collegato a Java, Java e log4j è solo un'implementazione di come viene ragionato.

    
posta Niklas Rosencrantz 21.09.2012 - 12:50
fonte

6 risposte

4

Come estensione della regola di registrazione in cui l'applicazione proviene dall'espressione del log, è possibile che si desideri aggiungere flag di registrazione a livello di modulo. Invece di registrare tutto, sempre, questo ti permette di indirizzare selettivamente sezioni della tua applicazione. C'è un sovraccarico in questo, ed è necessario creare una funzione che consente di abilitare / disabilitare tale registrazione. Idealmente, si sarebbe in grado di abilitare / disabilitare al volo mentre l'applicazione è in esecuzione.

Sono abituato a vedere un livello sotto il debug che io definisco "Trace", ma non è necessariamente un termine universale. Le tracce di registrazione del livello "Trace" possono essere conservate per quanto possibile, inclusi l'ingresso / uscita del modulo, i timestamp con entrata / uscita e i punti bonus per l'acquisizione dei valori passati. Ovviamente, questo genera un sacco di dati e non è qualcosa che si accende su volente o nolente. Ma ha dei vantaggi rispetto al debug quando non puoi collegarti al processo o non hai un core dump dell'applicazione errante.

Mi piace vedere i riferimenti di file / modulo e le marche temporali con le mie informazioni di registro. Può essere utile quando si cerca di rintracciare le condizioni di gara tra le discussioni e di coordinare le attività di più aree dell'applicazione. Per essere onesti, conosco gente che pensa che questi dettagli ingombrino il file di registro. Aggiungere il timestamp è qualcosa da discutere con il team. (Mi scuso se log4j lo fa già.)

Se la registrazione non viene gestita dal proprio thread / processo, è una cosa da considerare. Invece di fare in modo che il thread dell'applicazione attenda che la registrazione venga elaborata, il messaggio di log viene trasmesso al gestore log e il thread dell'applicazione procede in modo allegro. In alternativa, creare un meccanismo di buffer per gestire i messaggi di registro è un altro modo per accelerare la reattività dell'applicazione.

Avere controlli sulla dimensione e sulla cronologia dei file di registro è un'altra caratteristica da considerare. Non vuoi che l'app elimini tutto lo spazio su disco sul sistema host, né vuoi necessariamente conservare tutti i file di registro per l'eternità.

    
risposta data 21.09.2012 - 15:53
fonte
2

Una cosa da tenere a mente è controllare il livello di registrazione prima di eseguire qualsiasi tipo di operazione di stringa per la registrazione. Cioè, non andare a tutto il lavoro di impostare un formattatore di date o concatenare un gruppo di stringhe per creare il messaggio di log se non si sta andando davvero a registrarlo. È solo uno spreco di lavoro che rallenta l'applicazione.

FYI, il progetto Apache Commons ha un ToStringBuilder classe che semplifica la creazione dei tuoi metodi toString() .

    
risposta data 21.09.2012 - 23:18
fonte
1

Non trovo nulla di discutibile in ciò che hai aggiunto qui Nick. È così che lo faccio da un po 'di tempo. Il post che hai fornito è molto dettagliato e probabilmente può essere usato come una sorta di tutorial per la registrazione. Comunque, voglio aggiungere una cosa qui, che è: In molti posti, ho visto chaps usare la registrazione condizionale, per es. :

     if(env_local)
     {
     write_to_local();
     }    
     else if(env_IT)
     {
     write_to_IT();
     } 
     else if(env_PROD)
     {
     write_to_prod();
     } 
     else
     dosomething();

Penso che questo tipo di traccia condizionale o di debug non sia il modo migliore per andare.

    
risposta data 21.09.2012 - 13:36
fonte
1

Oltre a registrare la classe / metodo che ha generato l'errore, sarebbe utile anche registrare i parametri passati in quel metodo. Sapere dove è stato sollevato un errore non è molto utile se si verifica solo 1 volta su 1000; devi anche sapere quali dati hanno causato l'errore.

Ho anche trovato utile avere una variabile che definisce il livello predefinito di registrazione per un'applicazione. In questo modo puoi avere il codice DEBUG e INFO insieme al codice WARNING e ERROR. Quando si esegue in modalità di produzione, l'impostazione predefinita non genera informazioni DEBUG, ma quando si verifica un errore è possibile aggiornare un flag e iniziare a scrivere i messaggi DEBUG anche nel registro.

    
risposta data 21.09.2012 - 15:51
fonte
1

La registrazione è per lo più una preoccupazione trasversale. Java da solo non è abbastanza espressivo per renderti in grado di separare la registrazione dalle logiche di business attuali. Ciò significa che non è possibile, ad esempio, prendere solo un metodo e inserirlo in un altro progetto, ma è necessario rimuovere e modificare tutte le registrazioni prima di farlo. E questa è solo la punta dell'iceberg.

Per evitare questo ed altri problemi quando si mischiano log e logiche di business "reali" dovresti considerare l'uso della programmazione orientata all'aspetto. Per Java il framework più utilizzato sarebbe AspectJ. C'è questo video di youtube dai talk di google tech che spiega AspectJ ei suoi usi al di là del logging piuttosto bene. Troverai molti esempi per la registrazione di te stesso qui anche su stackexchange .

    
risposta data 01.07.2014 - 21:06
fonte
0

Una cosa che suggerirei sarebbe quella di avere un mezzo per avere più contesti di logging associati ad un particolare file di log, e fare in modo che qualsiasi cosa scritta in qualsiasi contesto di logging venga registrata a meno che non sia esplicitamente chiede al contesto di registrazione di scartarne il contenuto. Tale progetto consentirà di acquisire registri piuttosto dettagliati durante un'operazione e di scartarli se l'operazione ha esito positivo, ma averli disponibili se l'operazione non riesce. In assenza di tale funzione di registrazione, avere buoni registri disponibili quando qualcosa non funziona può richiedere che un'applicazione impieghi molto tempo a registrare dati inutili nel 99,99% dei casi in cui tutto funziona.

    
risposta data 24.03.2014 - 18:26
fonte

Leggi altre domande sui tag