Ваша проблема, скорее всего, не с рамками регистрации, но с макетом.
Конкретный пример
so35592962/App.java
package so35592962;
import org.apache.logging.log4j.*;
import so35592962.sub.OtherClass;
public class App {
public static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.error("in App.main");
OtherClass.act();
}
}
so35592962/sub/OtherClass.java
package so35592962.sub;
import static so35592962.App.logger;
public class OtherClass {
public static void act() {
logger.error("OtherClass.act");
}
}
Таким образом, вы можете видеть, что это абсолютно то, что вы хотите: классы, которые используют один регистратор. Для этого можно использовать Log4J2.
Теперь я добавить файл Magic log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Запуск этого напечатает:
12:05:28.834 [main] ERROR so35592962.App - in App.main
12:05:28.836 [main] ERROR so35592962.sub.OtherClass - OtherClass.act
Посмотрите, есть разные имена классов здесь! Тем не менее я использовал Log4J2.
Что здесь произошло?
Обратите внимание на шаблон, используемый в PatternLayout
тег:
%d{HH:mm:ss.SSS} [%t] %-5level %C{36} - %msg%n
Стандартные примеры и то, что вы обычно видите в Интернете все используют %L
шаблон. Этот шаблон должен отображать имя регистратора. Но ты сказал, что не хочешь этого. К счастью, существуют другие шаблоны. %C
покажет имя класса вместо имени регистратора. Это шаблон, который используется здесь.
Согласно the PatternLayout
documentation, то %C
модель делает следующее:
Выходы полное имя класса вызывающего абонента, выдавшего запрос протоколирования.
Важное примечание, также упоминается в документации:
Генерирование имя класса вызывающего абонента (информация о местоположении) в является дорогостоящей операцией и может повлиять на производительность. Используйте с осторожностью.
Это полностью зависит от вас (в любой из этих структур), как вы определяете и называете своих регистраторов. У вас может быть только один для всего вашего приложения или вызов 'getLogger' при любом вызове. – Thilo
Связанные: http://stackoverflow.com/questions/26600757/standard-way-to-implement-a-logger-across-classes-in-java?rq=1 http://stackoverflow.com/questions/27038694/ rc = 1 – Thilo
@Thilo, имеющий один для всего приложения, сделает все журналы с тем же именем. Кого я не ищу. Вместо этого структура должна отображать имя класса вызывающего. – Edi