Ваша проблема, скорее всего, не в структуре ведения журнала, а в макете.
Конкретный пример
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.
Теперь добавляю волшебный файл 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
покажет имя класса вместо имени регистратора. Это шаблон, который здесь используется.
Согласно PatternLayout
документации, шаблон %C
выполняет следующий:
Выводит полное имя класса вызывающего объекта, отправившего запрос на ведение журнала.
Важное примечание, также упомянутое в документации:
Создание имени класса вызывающего абонента (информация о местоположении) - дорогостоящая операция и может повлиять на производительность. Используйте с осторожностью.
person
Olivier Grégoire
schedule
24.02.2016
getLogger
по любому вызову. - person Thilo   schedule 24.02.2016org.apache.commons.*
). Я бы просто придерживался установленного образца. Самый гибкий, простой, быстрый (и немного уродства, которое можно решить только с помощью макросов, препроцессоров или других мерзостей). - person Thilo   schedule 24.02.2016