2012-04-27 16 views
23

Zawsze stosować następujący wzór do skonstruowania (slf4j) rejestratory:Jaki jest narzut tworzenia rejestratorów SLF4J w kontekście statycznym i nie statycznym?

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

ten pracował tak daleko, ale zastanawiałem się o kontekście static w pewnym momencie i konieczności przejścia w konkretnej klasie dosłowne cały czas, a nie tylko przy użyciu non-statyczne rejestratora jak

private final Logger log = LoggerFactory.getLogger(getClass()); 

To w zasadzie został poproszony (a odpowiedział), zanim tutaj LOG4J

Should logger be private static or not

i tutaj

Should be logger always final and static?

Zdaję sobie sprawę final jest w zasadzie obowiązkowe, więc jestem zastanawiać, jak wysoko nad głową z użyciem slf4j w kontekście non-statycznej rzeczywistości.

Q:

Czy istnieje znacząca praktyczna narzut użyciu

private final Logger log = LoggerFactory.getLogger(getClass()); 

nad

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

średniej (web) aplikacji ? (Nie ma potrzeby, aby „omówić” high-end, ciężkie obciążenia webapps tutaj)


Uwaga, ja ostatecznie planuje użyć nawet ładniejszy podejścia z wykorzystaniem CDI aby uzyskać rejestrator slf4j jak

@Inject private final Logger log; 

jak opisano tutaj http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection, ale najpierw muszę wiedzieć o buforowaniu rejestratora.

Sub pytanie: czy jest to w ogóle możliwe, aby używać ?:

@Inject private static final Logger log; 

(dopiero zaczynają z CDI, aby być uczciwym)

+3

Należy pamiętać, że jeśli użyjesz 'getClass()' nazwa/kategoria rejestratora może się nieoczekiwanie zmienić w obecności podklas. – Thilo

+0

Dzięki. Właściwie szukam tutaj "wzorca tworzenia loggera", ale muszę przyznać, że nie jestem w 100% pewny co do mojego własnego przypadku użycia, czyli czy chcę, aby możliwe podklasy mogły uzyskać własne rejestratory lub jeśli chcę aby ponownie użyć jednego ze wspólnej super klasy. : -/ – Kawu

+0

Możesz w ogóle pozbyć się tej zmiennej, jeśli używasz [jcabi-log] (http://www.jcabi.com/jcabi-log/), statycznego opakowania wokół slf4j – yegor256

Odpowiedz

21

Napełnienie dla zmiennych rejestratora niestatycznego (instancji) powinno być pomijalne, chyba że wystąpi wiele, powiedzmy 10000 lub więcej wystąpień. Kluczowe słowo tutaj jest znikome. Jeśli zostanie utworzonych wiele (> 10000) obiektów, wpływ będzie prawdopodobnie możliwy do zmierzenia, ale nadal będzie niski.

Mówiąc dokładniej, rejestrator instancji zwiększa obszar pamięci o jeden punkt odniesienia (64 bity) na instancję obiektu. Po stronie procesora koszt jest jednym haszowaniem według instancji, tj. Kosztem wyszukania odpowiedniego rejestratora w tabeli mieszania (małe). Ponownie, oba koszty powinny być pomijalne, chyba że powstanie wiele obiektów.

To pytanie jest również omawiane w artykule SLF4J FAQ.

+0

Co z procesem/procesem wtrysku? Jakieś minusy? – Kawu

+0

Wyświetl moją zaktualizowaną odpowiedź. – Ceki

2

nie jestem pewien co do dokładnej napowietrznych przy użyciu LoggerFactory ale wątpię wpłynie na wydajność twojej aplikacji. Po prostu użyj statycznego lub nie statycznego, jak uważasz za stosowne.

Co powinno być zaletą korzystania z @Inject. The LoggerFactory już zapewnia i abstrahuje od konkretnej impl. W każdym razie będzie o wiele wolniej niż LoggerFactory.

Składnia jest bardziej zwięzła, gdy używasz @Inject, która jest prawdziwa. Ale wyobraź sobie, że używasz klasy w teście. Następnie musisz ustawić wtrysk, aby uzyskać rejestrację. Z normalnym LoggerFactory dobrze działa również w testach. Jeśli java miałby ogólny mechanizm dla @Inject, to działałby świetnie, ale ponieważ jest to konfiguracja jest trudniejsza.

+0

To tylko kolejna rzecz, która nie ma dbać o to: jeśli możesz (w zasadzie) użyć prywatnego dziennika końcowego @ @ Inject, dlaczego powinienem użyć "prywatnego statycznego dziennika końcowego logującego" = LoggerFactory.getLogger (MyClass.class); (w większości przypadków nie można zauważyć napowietrznych jak stwierdził Ceki)? – Kawu