Чтобы инициализировать Log4j внутри класса, программисту необходимо предоставить экземпляр Class
(или имя строки, которое представляет его). Код будет выглядеть так:Почему Log4j требуется имя класса?
public class MyClass {
private static Log logger = Logger.getLogger(MyClass.class);
[...]
}
Log4j затем предоставит выход на основе параметров, заданных программистом. Результат будет выглядеть примерно так:
[INFO] [MyClass:124] Foobar
Мой вопрос: если Log4j знает, что номер строки заявления лесозаготовительной является(), то почему это нужно имя класса (MyClass)? Мне кажется, что если он сможет выяснить первое, он должен уметь выяснить последнее.
Редактировать: Это тоже не проблема; большинство из нас видели код, где программист случайно копирует и вставляет код инициализации из другого класса, но забывает изменить имя класса в инициализаторе. Это приводит к тому, что Log4j создает запутанный вывод.
(Конечно, в моем вопросе не указана конкретная проблема, но мне полезно понять, как работают Log4j и, возможно, отражение Java).
Первое решение не работает при использовании статического регистратора, который необходим в статических классах. Второй момент, который вы сделали: не вызовет ли проблем с номером строки в таких регистраторах? И почему бы не использовать метод по умолчанию, который инициализируется вызывающим классом? – patstuart
1. Правильно, это не будет работать для статического класса. 2. Это зависит от того, как ваш формат выводит ваш журнал. Номер строки исходит из исходного имени файла. Но включение номера строки «чрезвычайно медленно» (http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html). 3. Да, вы могли бы это сделать. – brandonjsmith