Regole e consigli per la registrazione?


13

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

Usiamo Java ma puoi commentare in generale sulla login - regole e consigli

  1. Utilizzare il livello di registrazione corretto

    • ERRORE: Qualcosa non ha funzionato e deve essere risolto immediatamente
    • ATTENZIONE: il processo può continuare senza riparazioni. L'applicazione dovrebbe tollerare questo livello ma l'avviso deve sempre essere esaminato.
    • INFO: informazioni sul completamento di un processo importante
    • DEBUG. Viene utilizzato solo durante lo sviluppo
  2. Assicurati di sapere cosa stai registrando.

  3. Evitare che la registrazione influenzi il comportamento dell'applicazione

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

  1. I messaggi di registro devono 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

Metti che il metodo e la classe giusti vengono scritti automaticamente.

Esempio:

Datatedfile -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 di registro.

Si prega di registrare i valori dall'applicazione.

  1. Prefisso registro.

Indicare da quale parte dell'applicazione è stata scritta la registrazione, preferibilmente con qualcosa per il prefisso concordato del progetto, ad es PANDORA_DB

  1. La quantità di testo.

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

  1. Formato di registrazione:

-Ci sono diverse varianti e metodi da utilizzare 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 presume che abbiamo impostato le proprietà log4j in modo che scriva automaticamente la classe e il metodo.

Utilizzare sempre il logger e non i seguenti:

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

Se l'app Web utilizza il nostro framework è possibile ottenere informazioni di errore molto dettagliate da EJB, se si utilizza try-catch nel gestore e si registra in base al 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 brevetti per console e per datefileappender:

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. Nella riga della console verrà anche scritto il nostro.

  1. toString()

Si prega di avere un 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 questi output

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 la registrazione? Sentiti libero di rispondere o commentare anche se non è correlato a Java, Java e log4j è solo un'implementazione di come questo è motivato.



1
@gnat - Penso che tu abbia ragione, c'è molta sovrapposizione tra le due domande. Sto lottando per chiamarlo un duplicato però.

Risposte:


4

Come estensione della regola di registrazione da cui proviene nell'applicazione l'istruzione di registro, è possibile aggiungere flag di registrazione a livello di modulo. Invece di registrare tutto, sempre, questo ti consente invece di selezionare selettivamente le sezioni della tua applicazione. C'è un sovraccarico in questo, ed è necessario creare una funzione che ti consenta di abilitare / disabilitare quella 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 chiamo "Trace", ma non è necessariamente un termine universale. Registra le tracce di registrazione di livello quanto più puoi possibilmente in piedi, tra cui entrata / uscita del modulo, timestamp con entrata / uscita e punti bonus per acquisire i valori passati. Ovviamente, ciò genera MOLTI dati e non è qualcosa che si accende volenti o nolenti. Tuttavia, presenta vantaggi rispetto al debug quando non è possibile collegarsi al processo o non si dispone di un dump principale dell'applicazione errata.

Mi piace vedere riferimenti a file / moduli e timestamp con le mie informazioni di registro. Può essere utile quando si cerca di cercare le condizioni di gara tra i thread e di coordinare le attività di più aree dell'applicazione. Ad essere sinceri, conosco alcune persone che pensano che questi dettagli ingombrino il file di registro. L'aggiunta del timestamp è qualcosa da discutere con il team. (Mi scuso se log4j lo fa già.)

Se la registrazione non è gestita dal proprio thread / processo, anche questo è qualcosa da considerare. Invece di fare in modo che il thread dell'applicazione attenda l'elaborazione della registrazione, il messaggio di log viene passato al gestore del log e il thread dell'applicazione procede nel modo giusto. In alternativa, la creazione di una sorta di meccanismo buffer per gestire i messaggi di registro è un altro modo per accelerare la reattività delle applicazioni.

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


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 impostazione di un formattatore di date o di concatenare un sacco di stringhe per creare il messaggio di registro se non lo stai effettivamente registrando. Questo è solo uno spreco di lavoro che rallenta l'applicazione.

Cordiali saluti, il progetto Apache Commons ha una ToStringBuilder classe che semplifica la creazione dei toString()metodi.


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. Tuttavia, voglio aggiungere una cosa qui, che è: In molti posti, ho visto dei chap che usano la registrazione condizionale, per esempio:

     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 o debugging condizionale non sia il modo migliore di procedere.


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 generato 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 ed ERROR. Quando si esegue in modalità di produzione, per impostazione predefinita non si generano informazioni DEBUG, ma quando viene visualizzato un bug è possibile aggiornare un flag e iniziare a scrivere anche i messaggi DEBUG nel registro.


1

La registrazione è per lo più una preoccupazione trasversale. Java da solo non è sufficientemente espressivo per renderti in grado di separare la registrazione dalle logiche aziendali reali. Ciò significa che, ad esempio, non puoi semplicemente prendere un metodo e inserirlo in un altro progetto, ma devi rimuovere e regolare tutte le tue registrazioni prima di farlo. E questa è solo la punta dell'iceberg.

Per evitare questo e altri problemi quando si mescolano la registrazione e le logiche aziendali "reali", è necessario considerare l'utilizzo della programmazione orientata all'aspetto. Per Java il framework più utilizzato sarebbe AspectJ. C'è questo video di YouTube dai colloqui di tecnologia di Google che spiega AspectJ e i suoi usi oltre la registrazione abbastanza bene. Troverai molti esempi per registrarti ovviamente anche qui su stackexchange .


0

Una cosa che suggerirei sarebbe quella di disporre di un mezzo per avere più contesti di registrazione associati a un particolare file di registro e disporre in modo tale che qualsiasi cosa scritta in qualsiasi contesto di registrazione venga registrata a meno che il codice non richieda esplicitamente al contesto di registrazione di scartarne il contenuto. Tale progettazione consentirà di acquisire registri piuttosto dettagliati durante un'operazione e di scartarli se l'operazione ha esito positivo, ma di averli disponibili se l'operazione non riesce. In assenza di tale funzionalità di registrazione, avere buoni registri disponibili quando qualcosa non funziona potrebbe richiedere che un'applicazione perda molto tempo registrando dati inutili nel 99,99% delle volte in cui tutto funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.