Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Объяснение ведения журнала Java

Автор вопроса: nfvindalooОтветов: 3

Это то, что я никогда не понимал полностью, интересно, может ли кто-нибудь объяснить это?

У меня есть весеннее приложение, использующее спящий режим. Иногда я запускаю его на коте, иногда на пристани. Я получаю вывод журнала из спящего режима и весны в порядке. Я понимаю, что есть несколько вариантов ведения журнала java, например java.logging, slf4j, log4j и т. д.; но на самом деле вообще не занимался настройкой ведения журнала. Теперь, когда я хочу настроить вывод журнала ehcache, мне нужно!

Мой вопрос в том, как в моем приложении узнать, какой тип ведения журнала он использует, и как его настроить и настроить? Это зависит от сервера приложений? Или это spring или hibernate, который использует собственную реализацию ведения журнала. Просматривая мое дерево зависимостей maven, я вижу, что hibernate-validator извлекает org.jboss.logging, и для этой весны требуется регистрация общих ресурсов. У меня также есть slf4j, потому что для нескольких пакетов требуются разные его версии, поэтому я вручную установил последнюю версию.

Зависимости Maven

[INFO] +- org.hibernate:hibernate-core:jar:3.6.10.Final:compile
[INFO] |  +- antlr:antlr:jar:2.7.6:compile
[INFO] |  +- commons-collections:commons-collections:jar:3.1:compile
[INFO] |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  +- org.hibernate:hibernate-commons-annotations:jar:3.2.0.Final:compile
[INFO] |  +- org.hibernate.javax.persistence:hibernate-jpa-2.0-api:jar:1.0.1.Final:compile
[INFO] |  \- javax.transaction:jta:jar:1.1:compile
[INFO] +- org.hibernate:hibernate-c3p0:jar:3.6.10.Final:compile
[INFO] |  \- c3p0:c3p0:jar:0.9.1:compile
[INFO] +- org.slf4j:slf4j-api:jar:1.5.8:compile
[INFO] +- org.slf4j:jcl-over-slf4j:jar:1.5.8:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.5.8:compile
[INFO] +- net.sf.ehcache:ehcache-core:jar:2.6.6:compile
[INFO] +- xerces:xercesImpl:jar:2.10.0:compile
[INFO] |  \- xml-apis:xml-apis:jar:1.4.01:compile
[INFO] +- com.vividsolutions:jts:jar:1.13:compile
[INFO] +- org.hibernatespatial:hibernate-spatial-postgis:jar:1.1:compile
[INFO] |  \- org.hibernatespatial:hibernate-spatial:jar:1.1:compile
[INFO] +- postgresql:postgresql:jar:9.1-901-1.jdbc4:compile
[INFO] +- org.postgis:postgis-jdbc:jar:1.3.3:compile
[INFO] |  \- org.postgis:postgis-stubs:jar:1.3.3:compile
[INFO] +- org.springframework:spring-expression:jar:3.1.2.RELEASE:compile
[INFO] |  \- org.springframework:spring-core:jar:3.1.2.RELEASE:compile
[INFO] |     \- commons-logging:commons-logging:jar:1.1.1:compile
[INFO] +- org.springframework:spring-beans:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-aop:jar:3.1.2.RELEASE:compile
[INFO] |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] +- org.springframework:spring-context:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-context-support:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-tx:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-jdbc:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-orm:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-oxm:jar:3.1.2.RELEASE:compile
[INFO] |  \- commons-lang:commons-lang:jar:2.5:compile
[INFO] +- org.springframework:spring-web:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-webmvc:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-aspects:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-instrument:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-instrument-tomcat:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-jms:jar:3.1.2.RELEASE:compile
[INFO] +- org.springframework:spring-asm:jar:3.1.4.RELEASE:compile
[INFO] +- org.aspectj:aspectjrt:jar:1.7.1:compile
[INFO] +- org.aspectj:aspectjweaver:jar:1.7.1:compile
[INFO] +- cglib:cglib:jar:2.2.2:compile
[INFO] |  \- asm:asm:jar:3.3.1:compile
[INFO] +- org.springframework.security:spring-security-core:jar:3.1.3.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-web:jar:3.1.3.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-config:jar:3.1.3.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-aspects:jar:3.1.3.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-taglibs:jar:3.1.3.RELEASE:compile
[INFO] |  \- org.springframework.security:spring-security-acl:jar:3.1.3.RELEASE:compile
[INFO] +- org.springframework.security:spring-security-crypto:jar:3.1.3.RELEASE:compile
[INFO] +- org.hibernate:hibernate-validator:jar:4.3.1.Final:compile
[INFO] |  +- javax.validation:validation-api:jar:1.0.0.GA:compile
[INFO] |  \- org.jboss.logging:jboss-logging:jar:3.1.0.CR2:compile
[INFO] +- org.hibernate:hibernate-validator-annotation-processor:jar:4.3.1.Final:compile
[INFO] +- com.fasterxml.jackson.core:jackson-core:jar:2.1.1:compile
[INFO] +- com.fasterxml.jackson.core:jackson-databind:jar:2.1.1:compile
[INFO] +- com.fasterxml.jackson.core:jackson-annotations:jar:2.1.1:compile
[INFO] +- org.apache.velocity:velocity:jar:1.7:compile
[INFO] +- joda-time:joda-time:jar:2.1:compile
[INFO] +- javax.mail:mail:jar:1.4.5:compile
[INFO] |  \- javax.activation:activation:jar:1.1:compile
[INFO] +- jstl:jstl:jar:1.2:compile
[INFO] +- javaxt:javaxt-core:jar:1.5.10:compile
[INFO] +- commons-fileupload:commons-fileupload:jar:1.2.2:compile
[INFO] +- commons-io:commons-io:jar:2.4:compile
[INFO] +- org.springframework:spring-test:jar:3.1.2.RELEASE:test
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] +- org.mockito:mockito-all:jar:1.9.5:test
[INFO] +- org.glassfish:javax.servlet:jar:3.0:test
[INFO] +- javax:javaee-web-api:jar:6.0:provided
[INFO] \- javassist:javassist:jar:3.12.1.GA:compile

Привет, НВФ

javaloggingspringjettytomcat

Ответы

Ответ 1 · Ralph

Мой вопрос: как в моем приложении узнать, какой тип ведения журнала он использует, и как его настроить и настроить?

Прежде всего, вы должны заметить, что ведение журналов Commons не является структурой ведения журналов, это просто мост/фасад между различными средами ведения журналов. Поэтому, если одна структура использует ведение журнала общих ресурсов, вы можете "настроить" ведение журнала общих ресурсов для пересылки операторов ведения журнала в реальную структуру ведения журнала (log4j, slf4j, ведение журнала java...)

Во-вторых, вы должны знать, что если один фреймворк (spring, hibernate, ...) использует loggingframework X, то вы не можете об этом заикаться. Вам необходимо предоставить эту структуру ведения журнала. Но есть одна хитрость.

Slf4j предоставляет трюк для "замены" других фреймворков, предположим:

  • у вас есть фреймворк X, который использует, например, Log4j
  • но вы поставляете не log4j с вашим приложением, а другую библиотеку, которая реализует шаблон моста (у него тот же интерфейс (интерфейсы и классы), что и у Log4j, но внутри он перенаправляет операторы ведения журнала в slf4j. (Например: log4j-over- slf4j)

С помощью этого трюка вы можете объединить все операторы ведения журналов из разных фреймворков, которые реализованы для использования разных фреймворков ведения журналов, в одну структуру ведения журналов.

BTW: вы должны знать, что сам Slf4j - это всего лишь Facade/Bridge, как ведение журнала общих ресурсов: - вы можете пересылать операторы ведения журнала в специальную структуру ведения журнала, которую вы хотите, - или в собственный журнал реализации.

Я настоятельно рекомендую прочитать руководство по slf4j и Соединение устаревших API

Зависит ли это от сервера приложений? Я могу говорить только за Tomcat (вы упомянули об этом): Tomcat по умолчанию не предоставляет Logging Framework для вашего приложения.

Кстати: Tomcat - это контейнер сервлетов, а не сервер приложений.


Согласно Документация Ehcache (первое обращение в Google по запросу "Журналирование Ehcache"), он использует slf4j.

Ответ 2 · gerrytan

Это не так просто, как вы думаете, одного списка зависимостей maven недостаточно. Вы должны открыть исходный код своего класса и посмотреть, какой Logger он использует.

В качестве примера следующий класс использует slf4j:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Foo {

  private static final Logger logger = LoggerFactory.getLogger(Foo.class);

  public void sayHello() {
    logger.debug("hello");
    ...
  }

  ...
}

Но чтобы усложнить ситуацию, slf4j - это обобщенная структура ведения журналов, которая может быть подключена к log4j, ведению журналов java commons и т. д.

Так что да, у вас может быть другой класс в одном приложении, использующем другую структуру входа в систему. Также вы можете сделать так, чтобы ваш контейнер веб-приложения использовал другую структуру ведения журнала, чем ваше веб-приложение.

Ответ 3 · рейтинг -1 · Stimpson Cat

Вы можете найти структуру ведения журнала, запустив отладчик;) Это ответ, который решает проблему.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы