Як правильно ініціалізувати log4j?


280

Після додавання log4j до моєї програми я отримую такий результат кожного разу, коли виконую заявку:

log4j: ПОПЕРЕДЖЕННЯ Для реєстратора не знайдено додатків (slideselector.facedata.FaceDataParser).
log4j: УВАГА Будь ласка, ініціалізуйте систему log4j належним чином.

Здається, це означає, що файл конфігурації відсутній. Де повинен знаходитися цей конфігураційний файл і який хороший стартовий вміст?

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


49
для всіх хлопців Maven, як я: покладіть log4j.properties в src / main / ресурси !!
Каруссель

Документація log4j має дуже основний зразок файлу log4j.xml .
Кен Блум

Це дуже корисно , щоб перейти на короткий посібник з Log4j: logging.apache.org/log4j/1.2/manual.html
Саад

Відповіді:


278

Log4jза замовчуванням шукає файл з назвою log4j.propertiesабо log4j.xmlна шляху.

Ви можете керувати тим, який файл він використовує для ініціалізації, встановивши властивості системи, як описано тут (Шукайте розділ "Процедура ініціалізації за замовчуванням").

Наприклад:

java -Dlog4j.configuration=customName ....

Приведе log4jдо пошуку файлу під назвою customName на classpath.

Якщо у вас є проблеми, я вважаю корисним увімкнути 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 = файл: / c: /my/folder/log4j.properties, що насправді є URL.
bbcooper

15
одна невелика порада, яка, можливо, комусь стане корисною: ви також можете увімкнути налагоджувач log4j , увімкнувши відповідну властивість у коді - System.setProperty ("log4j.debug", "");
XXL

Куди кладеш java -Dlog4j.configuration=customName? Я спробував налаштування проекту / налаштувань / запустити / налагодити, вибрав деякі конфігурації, натиснув кнопку «Правка», вкладку «Аргументи», аргументи VM. Чи включає customName розширення .xml?
Номенон

2
Спробувавши багато варіантів, це спрацювало: -Dlog4j.configuration = файл: /// C: /mydir/subdir/log4j.properties Приклад вище: -Dlog4j.configuration = файл: / c: /my/folder/log4j.properties не вдалося.
користувач1062589

1
Я дуже хочу, щоб в посібниках було підкреслено більше, що -Dlog4j.debugможе допомогти налагодити вашу конфігурацію.
Шрідхар Сарнобат

239

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

Якщо так, виклик статичного методу

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

встановить основний журнал на консоль, і повідомлення про помилки не буде.


Привіт a3. 14_Інфініті, де я повинен це використовувати? я не можу зрозуміти навіть я нагадав більше відповідей на це питання. будь ласка, допоможіть мені
Раві Потнуру

5
Майте на увазі, що це буде за замовчуванням для налагодження на рівні налагодження, що може бути небажаним. Ви можете змінити це так:Logger.getRootLogger().setLevel(Level.INFO);
forresthopkinsa

Не тільки попередження відійшли, але я отримав корисний вихід інформації про налагодження у вікні консолі
Baked Inhalf

2
так іронічно .. ми використовуємо це у виробничому стані
aswzen

25

Якщо ви просто позбудетесь всього (наприклад, якщо ви проходите тести)

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

20

Відповідно до сторінки поширених запитань Apache Log4j :

Чому я бачу попередження про "Не знайдено жодних додатків для реєстратора" та "Будь ласка, налаштуйте log4j належним чином"?

Це відбувається, коли конфігураційні файлиlog4j.propertieslog4j.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, як визначити значення вашого курсу:

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


Дивитися також:


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 МБ, особливо для налагодження.

Особисто я налаштовував декілька реєстраторів і встановлював кореневий реєстратор для попередження або рівня помилок замість налагодження.


9

Ще один спосіб зробити це, не ставлячи файл власності на classpath, - встановити властивість безпосередньо з коду 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.");
}

}


6

Ви можете встановити рівень журналу, використовуючи setLevel () .

Рівні корисні для легкого встановлення виду інформації, яку ви бажаєте відображати в програмі.

Наприклад:

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

Набір можливих рівнів:

TRACE,

НАЛАГОДЖУВАТИ,

INFO,

УВАГА,

ПОМИЛКА та

FATAL

Відповідно до посібника з ведення журналів


6
import org.apache.log4j.BasicConfigurator;

Викличте цей метод

BasicConfigurator.configure();

Зокрема, це пише в System.out. Явадок для методу налаштування no-args говорить:Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.
суніль

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

Привіт, як я можу додати конфігурацію для налагодження консолі та помилки у файлі?
JhonArias

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

1

Як було пояснено раніше, існує два підходи

Перший - просто додати цей рядок до вашого основного методу:

BasicConfigurator.configure();

Другий підхід - додати цей стандартний файл log4j.properties до вашого classpath:

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

Напр.

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");

Переконайтеся, що ви створили необхідну папку для зберігання файлів журналів.


1

Спробуйте встановити налагодження attribut в log4j: вузол конфігурації на true.

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

Він виводить інформацію, коли файл конфігурації читається і використовується для налаштування середовища log4j. Можливо, ви отримаєте більше деталей, щоб вирішити свою проблему.


Хтось знає? Чи є той самий варіант, який також можна використовувати з конфігурації властивостей, не повертаючись до налаштування -Dlog4j.debug = вірно при запуску програми?
JFK

1

API ведення журналів - ведення журналів Java полегшує обслуговування програмного забезпечення та обслуговування на сайтах клієнтів, створюючи звіти журналів, придатні для аналізу кінцевими користувачами, системними адміністраторами, інженерами польових служб та командами з розробки програмного забезпечення. API ведення журналу фіксує інформацію, таку як збої безпеки, помилки конфігурації, вузькі місця та / або помилки в додатку чи платформі. Основний пакет включає підтримку доставки простого тексту або формату XML-журналів у пам'ять, вихідні потоки, консолі, файли та сокети. Крім того, API журналу можуть взаємодіяти з послугами журналу, які вже існують в хостній операційній системі.

Пакет java.util.logging «Надає класи та інтерфейси основних засобів реєстрації платформи Java.


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

Log4j має три основні компоненти:

  • Лісоруби - [OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE]
  • Додатки

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

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

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

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

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 для таблиці 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:

Для того щоб вказати власну конфігурацію із зовнішнім файлом, використовуваний клас повинен реалізувати інтерфейс Конфігуратора .

коли файли конфігурації за замовчуванням "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 commons поверх log4j, тоді нам потрібно мати обидва банки в класі. Також, commons-logging.propertiesіlog4j.properties/xml повинні бути доступні в класі.

Ми також можемо передавати клас реалізації та 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             

Ref: LOG4J 2 КОНФІГУРАЦІЯ: ВИКОРИСТАННЯ YAML


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..

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 / ресурси вашого проекту

замість створення log4j.resources, створіть log4j.properties. Клацніть правою кнопкою миші на Resource в IntelliJ -> New -> Resource Bundle - Просто назвіть його як log4j


0

Якщо у вас виникла помилка в Intellij IDEA навіть після додавання log4j.propertiesабоlog4j.xml файлу у тестову папку ресурсів, можливо, Intellij IDEA ще не знає про існування цього файлу.

Отже, після додавання файлу клацніть правою кнопкою миші на файлі та виберіть « Перекомпілювати log4j.xml» .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.