2013-05-23 7 views
7

Uso log4j2 e vorrei aggiungere un prefisso a tutti i miei messaggi. Questo prefisso viene passato al parametro costruttore e dipende dall'istanza della classe. Quindi siamo a livello di oggetto (non di classe o thread).Come aggiungere un prefisso ai messaggi log4j (a livello di oggetto)

Ad esempio, ho una classe A istanziato come new A(152), in modo da quando uso log.error("message") su questa classe, 152: è scritto poco prima del messaggio. Per new A(155), verrà invece visualizzato 155:.

Grazie per il vostro aiuto

+1

Se log4j2 supporta l'MDC si può mettere in là. –

+0

Buon suggerimento. Supporta MDC – cmbaxter

+1

Grazie funziona con ThreadContext in log4j2 – Lucie

risposta

0

Una soluzione è una classe wrapper.

public class YourLogger 
{ 
    private Logger log; 

    public void error(int value, String msg) 
    { 
     log.error(String.valueOf(value) + ": " + msg); 
    } 
} 
+1

Ho provato questo, ma la classe chiamante e il numero di riga sono persi. – Lucie

+0

@Boubee i cosa la tua variabile contiene il codice di linea effettuato. –

+0

No, la mia variabile è un numero di serie – Lucie

6

Usa MDC per raggiungere tale scopo

nel costruttore messo

MDC.put("prefix", yourvalue); 

e nel vostro XML usare in questo modo nel modello

 %X{prefix} 
+0

Diversi thread possono inserire valori diversi per la stessa chiave. La mappa è threadlocal, quindi ogni thread ha una copia separata. –

0

provare questo

public void writeError(String msg,int intValue) { 
logger.error(intValue+" "+msg); 
} 
+0

Con questo, non dovresti creare un metodo per ogni livello di registrazione, in ogni classe che crei? – Joanis

+0

sì, non conosco la necessità di creare metodi seprate per la comprensione di OP ho scritto questo. –

3

Sulla base di Bill Clars risposta:

public class LogWrapper 
{ 
    private Logger log; 
    private String prefix; 

    public LogWrapper(Logger log, String prefix) { 
     this.log = log; 
     this.prefix = prefix; 
    } 

    public void error(String msg) 
    { 
     log.error(prefix + ": " + msg); 
    } 
} 

quindi impostare come variabile di istanza nella classe

public class MyClass { 
    private LogWrapper log; 

    public MyClass(int prefix) { 
     log = new LogWrapper(Logger.getLogger(this.getClass()), String.valueOf(prefix)); 

     // then log away 
     log.error("Test"); 
    } 
} 
+0

Oppure puoi estendere 'Logger' e sovrascrivere i metodi di registrazione – DairyLea

+0

L'ho provato prima ... Stamperà sempre lo stesso identico' file: line' come origine del messaggio di registro. Sarà sempre 'LogWrapper: 26' perché la chiamata del logger log4j è in linea (ad es.) 26 nella classe' LogWrapper'. Avresti bisogno di estendere il logger log4j, ma non è ancora banale (almeno, non era su log4j 1.2). – Joanis

+0

Come ho capito la domanda posta semplicemente prefisso un numero prima di tutti i messaggi ... – DairyLea

0

Qui è una soluzione soluzione semplice: è possibile avvolgere la stringa con un metodo che aggiunge il prefisso e restituisce una stringa concatenata al metodo error.

public class A { 
    private static final Logger LOG = LogManager.getLogger(); 

    final int index; 

    public A(int index) { 
     this.index = index; 
    } 

    public static void f(String message) { 
     return String.valueOf(index) + ": "; 
    } 

    public void method() { 

     // ... 

     LOG.error(f("message")); 

    } 

} 

Vantaggi:

  • semplice
  • È possibile registrare i messaggi con e anche senza il prefisso in una classe/metodo
  • Non è necessario aggiungere in modo permanente qualcosa di simile al %X{prefix} configurazione log4j2

Svantaggi:

  • devi sempre utilizzare il metodo involucro se si desidera aggiungere il prefisso
+0

E se si desidera utilizzare questo metodo wrapper in ogni classe che si crea, è possibile utilizzare l'importazione statica invece di dichiarare il metodo in ogni classe – jjurm

Problemi correlati