Mam następujący problem: Chcę użyć java.util.logging.Logger
. Nie znalazłem różnych zasobów 1, 2, 3, jak można modyfikować zachowanie rejestratora.Jak poprawnie zainicjować rejestratory?
Szczególnie w kwestii 2 (w mojej opinii) podano dobrą strukturę do zainicjowania rejestratorów zgodnie z nazwą klasy. Umożliwia to również modyfikowanie gadatliwości na poziomie pakietu w celu debugowania w razie potrzeby.
Po drobnym wykopaniu problemu dowiedziałem się, że globalny program rejestrujący i "pusty" rejestrator (o nazwie ""
) to nie to samo. Zobacz także poniższy przykład. Właśnie utworzyłem program rejestrujący foo.Bar
, który jest zakotwiczony w pustym rejestratorze zamiast w rejestratorze o nazwie foo
. Tylko jeśli najpierw utworzę rejestrator bar
, rejestrator bar.Baz
jest zakotwiczony do niego poprawnie.
To sprawia, że podejście w this question jest głównie bezużyteczne, ponieważ nie można założyć, że rejestratory nadrzędne mają zostać utworzone wcześniej. Trzeba przeanalizować nazwę klasy i utworzyć rejestratory w miarę potrzeb, o ile widzę.
Czy mam rację, że muszę dodać kod static {...}
, aby zainicjować rejestratory w sposób rekursywny przed zainicjowaniem własnego rejestratora? Czy ma to jakiś negatywny wpływ, jeśli wiele klas wywołuje metodę Logger.getLogger(String)
dla rejestratorów pakietów (co powoduje ogólne połączenia, np. bar.Baz
i bar.FooBaz
uzyskać rejestrator bar
)?
import java.util.Enumeration;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class TestLogger
{
public static void main(String[] args)
{
// Create the logger directly
Logger.getLogger("foo.Bar");
// Create the logger objects step-by-step
Logger.getLogger("bar");
Logger.getLogger("bar.Baz");
// Put the available loggers to output
Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
while(e.hasMoreElements())
{
String s = e.nextElement();
Logger l = Logger.getLogger(s);
String p = (l.getParent() == null ? "none" : "'" + l.getParent().getName() + "'");
System.out.println("'" + s + "': " + p);
}
}
}
Wyjście programu jest
'bar': ''
'global': ''
'foo.bar': ''
'bar.baz': 'bar'
'': none
'java.utils.Logger's może być trudny. Chociaż nie w pełni rozumiem, jakie jest aktualne pytanie, (prawdopodobnie) ważna informacja dodatkowa: osoby rejestrujące mogą być zbiorem śmieci. Kiedy piszesz 'Logger.getLogger (" foo ") setLevel (x)' w swojej metodzie 'main', a następnie uzyskaj logger z' Logger.getLogger ("foo") 'gdzie indziej, to ** może ** być innym przykładem! Logger uzyskany w 'main' może już być śmieciem zebranym, a drugie wywołanie' getLogger ("foo") 'następnie utworzy nowe wystąpienie. – Marco13