2013-05-23 14 views
7

Używam log4j2 i chciałbym dodać prefiks do wszystkich moich wiadomości. Ten prefiks jest przekazywany do parametru konstruktora i zależy od instancji klasy. Więc jesteśmy na poziomie obiektu (nie klasy lub wątku).Jak dodać prefiks do komunikatów log4j (na poziomie obiektu)

Na przykład, mam A klasę instancję jak new A(152), więc kiedy używam log.error("message") w tej klasie, 152: jest napisane tuż przed komunikatem. Zamiast tego zostanie wyświetlony kod new A(155), 155:.

Dzięki za pomoc

+1

Jeśli log4j2 obsługuje MDC można umieścić go tam. –

+0

Dobra sugestia. Obsługuje MDC – cmbaxter

+1

Dzięki temu działa z ThreadContext w log4j2 – Lucie

Odpowiedz

0

Jednym z rozwiązań jest klasa opakowania.

public class YourLogger 
{ 
    private Logger log; 

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

Próbuję tego, ale klasa wywołująca i numer linii są tracone. – Lucie

+0

@Boubee, a twoja zmienna zawiera numer linii kodu. Czy to prawda? –

+0

Nie, moja zmienna to numer seryjny – Lucie

6

Zastosowanie MDC do achive to

W konstruktora umieścić

MDC.put("prefix", yourvalue); 

oraz w XML używać go tak jak to w strukturze

 %X{prefix} 
+0

Różne wątki mogą wprowadzać różne wartości dla tego samego klucza. Mapa jest wątkowa, więc każdy wątek ma oddzielną kopię. –

0

spróbować tej

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

Dzięki temu nie musiałbyś stworzyć metody dla każdego poziomu rejestrowania w każdej klasie, którą tworzysz? – Joanis

+0

Tak, wiem, że nie ma potrzeby tworzenia metod seprate. W rozumieniu OP napisałem to. –

3

podstawie Bill Clars odpowiedź:

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); 
    } 
} 

Następnie można ustawić jako zmiennej instancji w swojej klasie

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

Lub możesz rozszerzyć 'Logger' i zastąpić metody rejestrowania. – DairyLea

+0

Próbowałem tego wcześniej ... To zawsze wydrukuje dokładnie ten sam' file: line' jako początek komunikatu dziennika. Zawsze będzie to "LogWrapper: 26", ponieważ logger połączenie logger jest w linii (np.) 26 w twojej klasie "LogWrapper". Musisz przedłużyć logger log4j, ale to nadal nie jest banalne (przynajmniej nie było na log4j 1.2). – Joanis

+0

Jak zrozumiałem to pytanie zadane po prostu przedrostka numeru przed wszystkimi wiadomościami ... – DairyLea

0

Oto jedno proste rozwiązanie obejście: można owinąć sznurek z metodą że dodaje do niego przedrostek i zwraca połączony ciąg do metody 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")); 

    } 

} 

Zalety:

  • Proste
  • wiadomości z oraz bez prefiksu w jednej klasie/metody Możesz zalogować
  • Nie trzeba dodawać coś na stałe do %X{prefix} Konfiguracja log4j2

Wady:

  • Zawsze trzeba użyć metody otoki, jeśli chcesz dodać przedrostek
+0

A jeśli chcesz użyć tej metody pakowania w każdej utworzonej klasie, możesz użyć statycznego importu zamiast deklarowania metoda w każdej klasie – jjurm

Powiązane problemy