2011-10-19 26 views
11

Mam problemy z dokładnym ustalaniu różnicy pomiędzy używaniem tych znaków konwersji dwa LOG4J użyte w log4j PatternLayout (log4j patternLayout)Log4j, patternLayout, klasa i kategoria

  • kategoria (% C)
  • klasy (% C)

Czy ktoś mógłby mi dać przykład, w którym te dwa byłby inny?

Czy ta kategoria nie jest zawsze zgodna z nazwą klasy?

Pozdrawiam,

Odpowiedz

17

To będzie takie samo, jeśli zainicjować rejestratora w popularnym sposobem zaproponowanym przez dokumentację i używać go wewnątrz klasy X:

Logger logger = Logger.getLogger(com.foo.X.class); 

wtedy dostaniesz to samo dla %c i %C, ponieważ nazwa rejestratora (skonstruowana przez "com.foo.X.class.getName()") pasuje do nazwy klasy, w której wydano instrukcję rejestrowania .

Zadzwoń do rejestratora „coś”

Logger logger = Logger.getLogger("something"); 

i będziesz mieć „coś” dla %c i nazwę klasy dla %C.

Należy pamiętać, że jest obliczane przez log4j z bieżącego śladu stosu bieżącego wątku, więc ma duży wpływ na wydajność, w przeciwieństwie do %c, który jest po prostu ciągiem. Można przeprowadzić ciekawy eksperyment, aby go zatwierdzić:

package com.foo; 

class A { 
    private Logger = Logger.getLogger(B.class); 
    // ... 
    logger.log("inside A class"); 
} 

Wyjście na wzór [%c][%m] zakładając B jest w opakowaniu com.foo będą:

[com.foo.B][inside A class] 

Wyjście na wzór [%C][%m] niezależnie od lokalizacji B będzie być:

[com.foo.A][inside A class]