2012-03-09 5 views
7

Używam log4j do logowania. Chciałbym zmodyfikować metody: warn (..), error (..). Chciałbym zmodyfikować komunikat w tej metodzie. Czy istnieje sposób, w jaki sposób utworzyć własny rejestrator?jak utworzyć MyLogger?

public class MyLogger extends Logger { 

protected MyLogger(String name) { 
    super(name); 
} 

@Override 
public void error(Object message) { 
    message = "test - " + message; 

    super.error(message); 
} 

} 

I w wywołaniu klasy:

private static final Logger logger = MyLogger.getLogger(TestClass.class); 

logger.error("error message"); 

Ale to nie działa. Czy mógłbyś mi pomóc? Dzięki.

Odpowiedz

7

Twój problem polega na tym:

MyLogger.getLogger(TestClass.class) 

jest static metoda, która zwraca oryginalny Logger klasę. MyLogger jest ignorowana. Najprostszym rozwiązaniem jest owinąć pierwotnie zwrócony Logger klasę w duchu wzoru:

public class MyLogger extends Logger { 
    final Logger target; 
    protected MyLogger(Logger target) { 
     this.target = target; 
    } 

    @Override 
    public void error(Object message) { 
     target.error(message); 
    } 

    //... 

} 

Aby korzystać MyLogger dekorator musi zawinąć oryginalnego rejestratora z nim:

private static final Logger logger = 
    new MyLogger(Logger.getLogger(TestClass.class)); 

Rozważmy owijając go w zwyczaju fabryka.

+3

Myślę, że problem z tą metodą polega na tym, że po dodaniu pliku/wiersza, w którym log występuje do wzorca (na przykład "% l"), zawsze otrzymasz "MyLogger", a nigdy prawdziwe źródło. – electrotype

+1

Podobnie jak odniesienie: to rozwiązanie jest opisane na stronie https://books.google.es/books?id=hZBimlxiyAcC&lpg=PA162&ots=QgJm9Y3WZ9&dq=log4j%20decorator&hl=es&pg=PA163#v=onepage&q=log4j%20decorator&f=false – frb

5

Nigdy nie powinieneś tworzyć własnego Loggera. Widziałem wiele złych powodów, by je stworzyć, ale nigdy nie były dobre. Jeśli chcesz dodać pewne informacje kontekstowe do instrukcji dziennika, możesz użyć funkcji NDC/MDC w Log4J.

http://wiki.apache.org/logging-log4j/NDCvsMDC

0

Nie modyfikować logger - rejestrator to tylko wygodny sposób na wysyłanie wiadomości dziennika do ram rejestrowania. Przetwarzanie wiadomości odbywa się w aplikantach.

Więc masz dwie opcje:

  1. Można powiedzieć główne appender (który jest podłączony do rejestratora korzenia), aby przetworzyć te wiadomości dla Ciebie. Zajrzyj tutaj: LOG4J: Modify logged message using custom appender

  2. Utwórz nowego uczestnika, który deleguje do istniejącego aplikanta. W ten sposób możesz dołączyć tego specjalnego aplikanta tylko do niektórych rejestratorów.

    Wystarczy zaimplementować AppenderAttachable<E> w swoim appenderze. Następnie możesz użyć <appender-ref .../> w swojej konfiguracji.