Как правильно инициализировать log4j? - PullRequest
265 голосов
/ 17 июля 2009

После добавления log4j в мое приложение я получаю следующий вывод при каждом запуске приложения:

log4j:WARN No appenders could be found for logger (slideselector.facedata.FaceDataParser).
log4j:WARN Please initialize the log4j system properly.

Похоже, это означает, что файл конфигурации отсутствует. Где должен находиться этот конфигурационный файл и каков хороший стартовый контент?

Я использую обычный Java для разработки настольного приложения. Так что нет веб-сервера и т.д. ...

Ответы [ 20 ]

265 голосов
/ 17 июля 2009

Log4j по умолчанию ищет файл с именем log4j.properties или log4j.xml в пути к классам. Вы можете контролировать, какой файл он использует для инициализации, установив свойства системы, как описано здесь (см. Раздел «Процедура инициализации по умолчанию»)

Например:

java -Dlog4j.configuration=customName ....

Заставит log4j искать файл с именем customName в пути к классам.

Если у вас возникли проблемы, я считаю полезным включить log4j.debug:

-Dlog4j.debug

Он выведет в System.out много полезной информации о том, какой файл он использовал для инициализации, какие настроены регистраторы / приложения и как и т.д.

Файл конфигурации может быть файлом свойств Java или файлом XML. Вот пример формата файла свойств, взятый из страницы документации по log4j * :

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
227 голосов
/ 04 августа 2009

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

Если это так, вызов статического метода

org.apache.log4j.BasicConfigurator.configure();

настроит базовое ведение журнала на консоль, и сообщения об ошибках исчезнут.

25 голосов
/ 04 сентября 2012

Если вы просто избавитесь от всего (например, если будете на тестах)

org.apache.log4j.BasicConfigurator.configure(new NullAppender());
19 голосов
/ 09 апреля 2015

Согласно Страница часто задаваемых вопросов по Apache Log4j :

Почему я вижу предупреждение о том, что "не найдены приложения для регистратора" и "Пожалуйста, правильно настройте log4j"?

Это происходит, когда конфигурации по умолчанию файлы log4j.properties и log4j.xml не могут быть найдены и приложение не выполняет явную настройку. log4j использует Thread.getContextClassLoader().getResource() для поиска файлов конфигурации по умолчанию и напрямую не проверяет файловую систему. Знание подходящего места для размещения log4j.properties или log4j.xml требует понимания стратегии поиска используемого загрузчика классов. log4j не предоставляет конфигурацию по умолчанию, поскольку вывод в консоль или в файловую систему может быть запрещен в некоторых средах.

В основном предупреждение Не найдено ни одного добавочного файла для регистратора означает, что вы используете log4j систему ведения журнала, но вы не добавили никаких дополнительных (таких как FileAppender, ConsoleAppender, SocketAppender, SyslogAppender и т. Д.) В файл конфигурации или отсутствует файл конфигурации.

Существует три способа настройки log4j: с помощью файла свойств (log4j.properties), с XML-файлом и с помощью кода Java (rootLogger.addAppender(new NullAppender());).

log4j.properties

Если у вас есть файл свойств (например, при установке Solr), вам нужно поместить этот файл в каталог classpath .

1039 * классы * Вот несколько советов команд в Linux, как определить значение вашего classpath: $ echo $CLASSPATH $ ps wuax | grep -i classpath $ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat? или с Java: System.getProperty("java.class.path"). Log4j XML

Ниже приведен базовый XML-файл конфигурации для log4j в формате XML:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
  <appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <param name="Target" value="System.out"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>

</log4j:configuration>

Tomcat

Если вы используете Tomcat, вы можете поместить log4j.properties в папку /usr/share/tomcat?/lib/ или /var/lib/tomcat?/webapps/*/WEB-INF/lib/.

Solr

Для справки, по умолчанию Solr log4j.properties файл выглядит так:

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

Почему log4j не может найти мой файл свойств в приложении J2EE или WAR?

Краткий ответ: классы log4j и файл свойств не входят в сферу действия одного и того же загрузчика классов.

Log4j использует только механизм Class.forName() по умолчанию для загрузки классов. Ресурсы обрабатываются аналогично. См. Документацию для java.lang.ClassLoader для более подробной информации.

Итак, если у вас возникли проблемы, попробуйте загрузить класс или ресурс самостоятельно. Если вы не можете найти его, ни один не будет log4j. ;)


Смотри также:

12 голосов
/ 08 апреля 2014

Вы можете установить местоположение ваших log4j.properties изнутри вашего Java-приложения, используя:

org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)

Более подробная информация доступна здесь: https://logging.apache.org/log4j/1.2/manual.html

10 голосов
/ 17 июля 2009

Найдите log4j.properties или log4j.xml онлайн с корневым приложением и поместите его в свой путь к классу.

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout

войдет в консоль.Я предпочитаю ведение журнала в файл, чтобы потом можно было исследовать его.

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file

, хотя для приложений подробного ведения журналов обычно необходимо увеличить 100 КБ до 1 МБ или 10 МБ, особенно для отладки.

Лично я установилнесколько регистраторов и установите корневой журнал на предупреждение или уровень ошибки вместо отладки.

8 голосов
/ 25 апреля 2015

Другой способ сделать это, не помещая файл свойств в путь к классам, - установить свойство непосредственно из кода Java. Вот пример кода.

public class Log4JSample {

public static void main(String[] args) {
    Properties properties=new Properties();
    properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile");
    properties.setProperty("log4j.rootCategory","TRACE");

    properties.setProperty("log4j.appender.stdout",     "org.apache.log4j.ConsoleAppender");
    properties.setProperty("log4j.appender.stdout.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    properties.setProperty("log4j.appender.MyFile", "org.apache.log4j.RollingFileAppender");
    properties.setProperty("log4j.appender.MyFile.File", "my_example.log");
    properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB");
    properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1");
    properties.setProperty("log4j.appender.MyFile.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    PropertyConfigurator.configure(properties);

    Logger logger = Logger.getLogger("MyFile");

    logger.fatal("This is a FATAL message.");
    logger.error("This is an ERROR message.");
    logger.warn("This is a WARN message.");
    logger.info("This is an INFO message.");
    logger.debug("This is a DEBUG message.");
    logger.trace("This is a TRACE message.");
}

}

5 голосов
/ 26 февраля 2014

Вы можете установить уровень журнала, используя setLevel () .

Уровни полезны, чтобы легко установить вид информации, которую программа должна отображать.

Например:

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages

Набор возможных уровней:

TRACE

DEBUG

INFO

WARN

ОШИБКА и

FATAL

Согласно Руководство по ведению лесозаготовок

5 голосов
/ 24 августа 2017
import org.apache.log4j.BasicConfigurator;

Вызовите этот метод

BasicConfigurator.configure();
3 голосов
/ 25 июня 2014

Чтобы включить -Dlog4j.debug, я перехожу к Система, Расширенные настройки системы, Переменные среды и устанавливаю системную переменную _JAVA_OPTIONS в -Dlog4j.debug.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...