2016-02-24 1 views
7

Я попытался следующие регистраторырамки регистрации Java, которая не требует объявления РЕГИСТРАТОР на каждом классе

  • Java Logging API
  • LOG4J
  • SLF4J

Все это требует заявления РЕГИСТРАТОР на уровне класса, например, ниже

private final static java.util.logging.Logger.Logger LOGGER = java.util.logging.Logger.Logger.getLogger(MyClass.class.getName()); 
private final Logger slf4jLogger = LoggerFactory.getLogger(SLF4JHello.class); 
private final static Logger log4jLogger = Logger.getLogger(Log4jHello.class); 

Это выглядит отвратительно для меня, есть ли в java инфраструктура logger, которая не требует этого объявления?

То, что я ищу, я могу иметь глобальное заявление как

private final static Logger Logger = Logger.getLogger(MyApp.class); 

Но когда я называю Logger.log (..) из класса XXX.class то Logger должен использовать имени XXX.класса.

+2

Это полностью зависит от вас (в любой из этих структур), как вы определяете и называете своих регистраторов. У вас может быть только один для всего вашего приложения или вызов 'getLogger' при любом вызове. – Thilo

+0

Связанные: 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

+0

@Thilo, имеющий один для всего приложения, сделает все журналы с тем же именем. Кого я не ищу. Вместо этого структура должна отображать имя класса вызывающего. – Edi

ответ

2

Ваша проблема, скорее всего, не с рамками регистрации, но с макетом.

Конкретный пример

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 модель делает следующее:

Выходы полное имя класса вызывающего абонента, выдавшего запрос протоколирования.

Важное примечание, также упоминается в документации:

Генерирование имя класса вызывающего абонента (информация о местоположении) в является дорогостоящей операцией и может повлиять на производительность. Используйте с осторожностью.

+0

Но если у вас есть только один регистратор, вы не можете назначать разные уровни журналов (или разные форматы или разные приложения) для разных регистраторов. – Thilo

+0

Правильно, но это отвечает на начальный вопрос, я считаю. Один уникальный регистратор, используя имя класса. –

+2

Кроме того, этот ответ не является «да, непременно, сделайте это», но «ваш запрос может быть выполнен, вот как». Я лично не одобряю это, но если ti работает для OP, я рад, что помог! –

1

Вы можете изменить их оба на аннотации класса с помощью Lombok.

Смежные вопросы