Как правильно инициализировать log4j?

280

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

log4j: ПРЕДУПРЕЖДЕНИЕ Не удалось найти ни одного дополнительного устройства для ведения журнала (slideselector.facedata.FaceDataParser).
log4j: WARN Пожалуйста, правильно инициализируйте систему log4j.

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

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

Януш
источник
49
для всех таких парней как я: поместите log4j.properties в src / main / resources !!
Карусселл
Документация log4j содержит очень простой пример файла log4j.xml .
Кен Блум
Это очень полезно , чтобы перейти на короткое руководство по Log4j: logging.apache.org/log4j/1.2/manual.html
Саад

Ответы:

278

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
Полярный медведь
источник
43
Поэтому для загрузки файла конфигурации из файла, который не находится на пути к классам, вы должны сделать это следующим образом: -Dlog4j.configuration = file: / c: /my/folder/log4j.properties, который фактически является URL-адресом.
bbcooper
15
Небольшой совет, который может быть кому-то полезен: вы также можете включить отладчик log4j , включив соответствующее свойство в коде - System.setProperty ("log4j.debug", "");
XXL
Куда ты положил java -Dlog4j.configuration=customName? Я попробовал Project / Preferences / Run / Debug Settings, выбрал некоторые конфигурации, нажал Edit, вкладку Arguments, аргументы VM. Включает ли customName расширение .xml?
Нумен
2
После нескольких попыток это сработало: -Dlog4j.configuration = file: /// C: /mydir/subdir/log4j.properties Пример выше: -Dlog4j.configuration = file: / c: /my/folder/log4j.properties не смогли.
user1062589
1
Я действительно хотел бы, чтобы руководства подчеркивали больше, что -Dlog4j.debugможет помочь отладить вашу конфигурацию.
Шридхар Сарнобат
239

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

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

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

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

Питер Линд
источник
Привет а3. 14_Infinity, где я должен использовать это? я не могу понять даже я дал больше ответов на этот вопрос. Пожалуйста, помогите мне
Рави Потнуру
5
Имейте в виду, что по умолчанию это ведение журнала на уровне отладки, что может быть нежелательно. Вы можете изменить это так:Logger.getRootLogger().setLevel(Level.INFO);
forresthopkinsa
Предупреждения не просто исчезли, но я получил полезную информацию об отладочной информации в окне консоли
Baked Inhalf
2
так иронично .. мы используем это на производственном состоянии
aswzen
25

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

org.apache.log4j.BasicConfigurator.configure(new NullAppender());
user831217
источник
20

Согласно странице Apache Log4j FAQ :

Почему я вижу предупреждение о том, что «не найдены приложения для регистратора» и «Пожалуйста, настройте 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 .

Путь к классам

Вот несколько советов команд в 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, вы можете поместить его log4j.propertiesв: /usr/share/tomcat?/lib/или /var/lib/tomcat?/webapps/*/WEB-INF/lib/папку.

Solr

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

#  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. ;)


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

kenorb
источник
12

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

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

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

Сыпь
источник
1
Хммм, класс не найден. importЗаявление всегда полезно , как код завершения не все , что надежно.
Мартин
11

Найдите в Интернете файл 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 МБ, особенно для отладки.

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

JeeBee
источник
9

Другой способ сделать это, не помещая файл свойств в путь к классам, - установить свойство непосредственно из кода 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.");
}

}

stones333
источник
6

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

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

Например:

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

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

TRACE,

ОТЛАЖИВАТЬ,

ИНФОРМАЦИЯ,

WARN,

ОШИБКА и

FATAL

В соответствии с руководством службы регистрации

математический
источник
6
import org.apache.log4j.BasicConfigurator;

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

BasicConfigurator.configure();
Уинсон Со
источник
Именно об этом пишет System.out. Javadoc для метода настройки без аргументов гласит:Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.
sunil
3

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

Фэн Чжан
источник
1

Чем ты занимаешься? Вы используете Apache Tomcat?

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n

У меня есть такие свойства в моем приложении Java.

Стивен
источник
1

Мой log4j был исправлен с помощью файла свойств ниже:

## 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=./logs/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
Kanishk
источник
Привет, как я могу добавить config это для отладки на консоль и ошибки в файл?
Джонариас
1

Я создал файл log4j.properties в папке ресурсов рядом с файлом hibernate.cfg.xml и заполнил его текстом ниже:

log4j.rootLogger=INFO, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n

теперь я избавился от предупреждений и ошибок

Айбек Коканбеков
источник
1

Просто создайте log4j.properties в папке src / main / assembly. В зависимости от того, хотите ли вы, чтобы сообщения журнала отображались в консоли или в файле, вы изменяете свой файл. Следующее покажет ваши сообщения в консоли.

# Root logger option
log4j.rootLogger=INFO, stdout

# 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.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
NSonmez
источник
1

Как объяснено ранее, есть 2 подхода

Во-первых, просто добавьте эту строку в ваш основной метод:

BasicConfigurator.configure();

Второй подход заключается в добавлении этого стандартного файла log4j.properties в ваш путь к классам:

При втором подходе необходимо убедиться, что файл инициализирован правильно.

Например.

Properties props = new Properties();

props.load(new FileInputStream("log4j property file path"));

props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");

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

AkashK
источник
1

Попробуйте установить атрибут отладки в log4j: узел конфигурации в значение true.

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

Он выводит информацию, когда файл конфигурации читается и используется для настройки среды log4j. Вы можете получить более подробную информацию для решения вашей проблемы.

atom88
источник
Кто-нибудь знает? Можно ли использовать эту же опцию в конфигурации свойств, не возвращаясь к параметру -Dlog4j.debug = true при запуске?
JFK
1

Logging API - Java Logging API облегчает обслуживание и обслуживание программного обеспечения на объектах заказчика, создавая отчеты журнала, пригодные для анализа конечными пользователями, системными администраторами, инженерами по обслуживанию на местах и ​​командами разработчиков программного обеспечения. API-интерфейсы ведения журнала собирают такую ​​информацию, как сбои безопасности, ошибки конфигурации, узкие места производительности и / или ошибки в приложении или платформе. Базовый пакет включает в себя поддержку доставки записей журнала в формате обычного текста или XML в память, выходные потоки, консоли, файлы и сокеты. Кроме того, API журналирования способны взаимодействовать со службами журналирования, которые уже существуют в операционной системе хоста.

Пакет java.util.logging «Предоставляет классы и интерфейсы основных средств ведения журнала платформы Java.


Log4j 1.x «log4j - популярная утилита ведения журналов на основе Java. Log4j - проект с открытым исходным кодом, основанный на работах многих авторов. Это позволяет разработчику контролировать, какие операторы журнала выводятся в различные места, используя Appenders [консоль, файлы, БД и электронная почта]. Он полностью настраивается во время выполнения с использованием внешних файлов конфигурации.

Log4j состоит из трех основных компонентов:

  • Регистраторы - [OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE]
  • Appenders

    • Ведение журнала Apache Commons: ConsoleAppender, FileAppender, RollingFileAppender, DailyRollingFileAppender, JDBCAppender- Driver, SocketAppender

    • Log4J Appender для MongoDB: MongoDbAppender -Driver

  • Макеты - [PatternLayout, EnhancedPatternLayout]

Файлы конфигурации могут быть записаны в формате XML или в формате свойств Java (ключ = значение).

  1. log4j_External.properties «Формат свойств Java (ключ = значение)

Строка между открывающим " $ { " и закрывающим " } " интерпретируется как ключ. Значение заменяемой переменной может быть определено как системное свойство или в самом файле конфигурации. Установите определенные параметры приложения. «Log4j.appender.appenderName.option = value, для каждого именованного appender вы можете настроить свой макет.

log4j.rootLogger=INFO, FILE, FILE_PER_SIZE, FILE_PER_DAY, CONSOLE, MySql

#log.path=./
log.path=E:/Logs

# https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
# {%-5p - [WARN ,INFO ,ERROR], %5p 0- [ WARN, INFO,ERROR]}
log.patternLayout=org.apache.log4j.PatternLayout
log.pattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n

# System.out | System.err
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.err
log4j.appender.CONSOLE.layout=${log.patternLayout}
log4j.appender.CONSOLE.layout.ConversionPattern=${log.pattern}

# File Appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log.path}/logFile.log
#log4j:ERROR setFile(null,false) call failed. - Defaults setFile(null,true)
#log4j.appender.FILE.Append = false
log4j.appender.FILE.layout=${log.patternLayout}
log4j.appender.FILE.layout.ConversionPattern=${log.pattern}

# BackUP files for every Day.
log4j.appender.FILE_PER_DAY=org.apache.log4j.DailyRollingFileAppender
# [[ Current File ] - logRollingDayFile.log ], { [BackUPs] logRollingDayFile.log_2017-12-10, ... }
log4j.appender.FILE_PER_DAY.File=${log.path}/logRollingDayFile.log
log4j.appender.FILE_PER_DAY.DatePattern='_'yyyy-MM-dd
log4j.appender.FILE_PER_DAY.layout=${log.patternLayout}
log4j.appender.FILE_PER_DAY.layout.ConversionPattern=${log.pattern}

# BackUP files for size rotation with log cleanup.
log4j.appender.FILE_PER_SIZE=org.apache.log4j.RollingFileAppender
# [[ Current File ] - logRollingFile.log ], { [BackUPs] logRollingFile.log.1, logRollingFile.log.2}
log4j.appender.FILE_PER_SIZE.File=${log.path}/logRollingFile.log
log4j.appender.FILE_PER_SIZE.MaxFileSize=100KB
log4j.appender.FILE_PER_SIZE.MaxBackupIndex=2
log4j.appender.FILE_PER_SIZE.layout=${log.patternLayout}
log4j.appender.FILE_PER_SIZE.layout.ConversionPattern=${log.pattern}

# MySql Database - JDBCAppender
log4j.appender.MySql=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.MySql.driver=com.mysql.jdbc.Driver
log4j.appender.MySql.URL=jdbc:mysql://localhost:3306/automationlab
log4j.appender.MySql.user=root
log4j.appender.MySql.password=
log4j.appender.MySql.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.MySql.layout.ConversionPattern=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');
#log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');

# Direct log events[Messages] to MongoDB Collection - MongoDbAppender
log.mongoDB.hostname=loalhost
log.mongoDB.userName=Yash777
log.mongoDB.password=Yash@123
log.mongoDB.DB=MyLogDB
log.mongoDB.Collection=Logs

log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.hostname=${log.mongoDB.hostname}
log4j.appender.MongoDB.userName=${log.mongoDB.userName}
log4j.appender.MongoDB.password=${log.mongoDB.password}
log4j.appender.MongoDB.port=27017
log4j.appender.MongoDB.databaseName=${log.mongoDB.DB}
log4j.appender.MongoDB.collectionName=${log.mongoDB.Collection}
log4j.appender.MongoDB.writeConcern=FSYNCED

MySQL Table структура для таблицы logdata

CREATE TABLE IF NOT EXISTS `logdata` (
  `Logger_Level` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `DataTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ClassName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `MethodName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `LineNumber` int(10) NOT NULL,
  `Message` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  1. log4j_External.xml «XML log4j: конфигурация с открытым файлом DTD
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="false">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="file" value="E:/Logs/logFile.log" />
        <param name="append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="E:/Logs/logRollingFile.log" />
        <param name="immediateFlush" value="true"/>
        <param name="maxFileSize" value="100KB" />
        <param name="maxBackupIndex" value="2"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_DAY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="E:/Logs/logRollingDayFile.log" />
        <param name="datePattern" value="'_'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n"/>
        </layout>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_PER_SIZE" />
        <appender-ref ref="FILE_PER_DAY" />
    </root>
</log4j:configuration>

  1. Конфигурация Log4j из URL в программе Java:

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

когда файлы конфигурации по умолчанию "log4j.properties", "log4j.xml" недоступны

  • Для "log4j.properties" вы можете использовать метод PropertyConfigurator .configure (java.net.URL).
  • Для "log4j.xml" будет использоваться DOMConfigurator .
public class LogFiles {
    // Define a static logger variable so that it references the Logger instance named "LogFiles".
    static final Logger log = Logger.getLogger( LogFiles.class );

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        System.out.println("CONFIGURATION_FILE « "+LogManager.DEFAULT_CONFIGURATION_FILE);
        System.out.println("DEFAULT_XML_CONFIGURATION_FILE = 'log4j.xml' « Default access modifier");

        String fileName = //"";
                //"log4j_External.xml";
                "log4j_External.properties";
        String configurationFile = System.getProperty("user.dir")+"/src/" + fileName;

        if( fileName.contains(".xml") ) {
            DOMConfigurator.configure( configurationFile );
            log.info("Extension *.xml");
        } else if ( fileName.contains(".properties") ) {
            PropertyConfigurator.configure( configurationFile );
            log.info("Extension *.properties");
        } else {
            DailyRollingFileAppender dailyRollingAppender = new DailyRollingFileAppender();
            dailyRollingAppender.setFile("E:/Logs/logRollingDayFile.log");
            dailyRollingAppender.setDatePattern("'_'yyyy-MM-dd");

            PatternLayout layout = new PatternLayout();
            layout.setConversionPattern( "%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" );
            dailyRollingAppender.setLayout(layout);

            dailyRollingAppender.activateOptions();

            Logger rootLogger = Logger.getRootLogger();
            rootLogger.setLevel(Level.DEBUG);
            rootLogger.addAppender(dailyRollingAppender);

            log.info("Configuring from Java Class.");
        }

        log.info("Console.Message.");
        method2();
        methodException(0);
    }

    static void method2() {
        log.info("method2 - Console.Message.");
    }
    static void methodException(int b) {
        try {
            int a = 10/b;
            System.out.println("Result : "+ a);
            log.info("Result : "+ a);
        } catch (Exception ex) { // ArithmeticException: / by zero
            log.error(String.format("\n\tException occurred: %s", stackTraceToString(ex)));
        }
    }
    public static String stackTraceToString(Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        return sw.toString();
    }
}
Яши
источник
1

Для меня исправлением было поместить «log4j.properties» в папку «src».

Серебряный
источник
0

Если мы используем оболочку регистрации общих файлов Apache поверх log4j, то нам нужно, чтобы оба jar-файла были доступны в classpath. Также commons-logging.propertiesи log4j.properties/xmlдолжен быть доступен в classpath.

Мы также можем передать класс реализации и log4j.propertiesимя, JAVA_OPTSиспользуя либо -Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>. То же самое можно сделать через настройку JAVA_OPTSв случае приложения / веб-сервера.

Это поможет вывести свойства, которые можно изменить при развертывании.

Шив
источник
0

Это альтернативный способ использования .yaml

Логическая структура:

Configuration:
    Properties:
    Appenders:
    Loggers:

Образец:

Configutation:
    name: Default

    Properties:
        Property:
            name: log-path
            value: "logs"

    Appenders:

        Console:
        name: Console_Appender
        target: SYSTEM_OUT
        PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

       File:
          name: File_Appender
          fileName: ${log-path}/logfile.log
          PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    Loggers:

        Root:
            level: debug
            AppenderRef:
              - ref: Console_Appender

        Logger:
            - name: <package>.<subpackage>.<subsubpackage>.<...>
              level: debug
              AppenderRef:
                 - ref: File_Appender
                 level: error             

Ссылка: LOG4J 2 КОНФИГУРАЦИЯ: ИСПОЛЬЗОВАНИЕ YAML

emecas
источник
0

Для тестирования, быстрый способ, включая настройку уровня журнала:

org.apache.log4j.BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.WARN);

// set to Level.DEBUG for full, or Level.OFF..
Запеченный Inhalf
источник
0

Maven решение:

Я столкнулся с теми же проблемами, что и выше, и для решения maven я использовал 2 зависимости. Эта конфигурация предназначена только для быстрого тестирования, если вы хотите, чтобы в простом проекте использовался регистратор со стандартной конфигурацией. Я могу представить, что вы захотите создать файл конфигурации позже, если вам потребуется дополнительная информация и или отрегулируйте свои собственные уровни ведения журнала.

    <properties>
        <slf4jVersion>1.7.28</slf4jVersion>
    </properties>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>
Джаспер Ланкхорст
источник
0

Я только что сделал это, и проблема была исправлена.

Следил за блогом ниже

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206875685-How-to-fix-log4j-WARN-console-messages-when-running-an-Application-inside-IntelliJ- идея

Но здесь он говорит, как показано ниже

Чтобы это исправить, просто введите следующий файл log4j.resources в папку main / resources вашего проекта.

вместо создания log4j.resources создайте log4j.properties. Щелкните правой кнопкой мыши по ресурсу в IntelliJ -> Создать -> Пакет ресурсов - просто назовите его как log4j

user1753356
источник
0

Если у вас возникла эта ошибка в Intellij IDEA даже после добавления файла log4j.propertiesили log4j.xmlв тестовую папку ресурсов, возможно, Intellij IDEA еще не знает о существовании файла.

Итак, после добавления файла щелкните правой кнопкой мыши файл и выберите « Перекомпилировать log4j.xml» .

Dherik
источник