#java #logging #log4j
#java #ведение журнала #log4j
Вопрос:
Я пытаюсь настроить log4j для записи сообщений в файл. Прямо сейчас файл создается с именем, которое я предоставляю, но журналы не записываются в файл. Мой код:
public class Main extends Application
{
private static Logger logger = Logger.getLogger( Main.class.getName() );
@Override
public void start(Stage primaryStage) throws Exception
{
logger.warning("test");
logger.severe("oh noes");
}
public static void main(String[] args) {
launch(args);
}
}
Содержимое моего log4j.properties
файла:
# Root logger option
log4j.rootLogger=INFO, file, stdout
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log.log
log4j.appender.file.MaxFileSize=1024MB
log4j.appender.file.MaxBackupIndex=1
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
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
Когда я запускаю это, я получаю этот вывод в консоли:
Jun 23, 2014 3:19:16 AM com.foo.Main start
WARNING: test
Jun 23, 2014 3:19:16 AM com.foo.Main start
SEVERE: oh noes
Файл log.log
создается в моем главном каталоге. Но он пуст.
Есть идеи, что я делаю не так? Я использую log4j версии 1.2.17.
Комментарии:
1. Вы уверены, что импортируете
Logger
класс Log4J, а неjava.util.logging.Logger
?
Ответ №1:
Вывод, по-видимому, имеет формат по умолчанию, который выдает стандартная платформа ведения журнала Java (JUL).
Итак, есть две возможности (которые приходят на ум):
- Ваш код импортирует
java.util.logging.Logger
, а неorg.apache.log4j.Logger
. - В вашем classpath существует какая-то библиотека, которая перехватывает вызовы Log4J и преобразует их в вызовы JUL.
Комментарии:
1. Спасибо, так оно и было. Но я замечаю, что только мои
error
или более поздние сообщения записываются в файл или в консоль. Есть идеи, как заставить его регистрировать все уровни?2. Способ, которым задана ваша конфигурация (возможно, вы изменили ее с момента публикации здесь?), Log4J будет печатать только сообщения, которые являются
info
и выше, и он будет печатать их как в консоль, так и в файл. Вы можете изменить это поведение, изменивINFO
наALL
inlog4j.rootLogger
. Если это не сработает, добавьте-Dlog4j.debug=true
в свои аргументы JVM — это заставит Log4J выдавать отладочные сообщения о себе (в System.out), чтобы вы могли видеть, что происходит.3. Если это сценарий № 2, есть ли способ определить, кто ввел перехватчик, и каков рекомендуемый способ его изменения?
Ответ №2:
У меня была та же проблема, что и у вас. Файл был создан, но без каких-либо журналов в нем только в консоли. И это было из-за неправильных зависимостей в проекте maven в моем случае.
Мой log4j.properties
файл был:
# Root logger option
log4j.rootLogger=DEBUG, file
# Direct log messages to a log file
# configuration to print into file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10
# Define the layout for file appender
log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=[%t] %-5p %c %x - %m%n
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Set the name of the file
log4j.appender.file.File=C:\log\logging.log
# Set the append to false, overwrite
log4j.appender.file.Append=false
И я использовал в POM:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Да, он создал для меня файл, в котором я нуждался, но журналы были в консоли. Затем я изменил его на другую зависимость, например:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
И я, наконец, получил его в файле вместо консоли. Даже без каких-либо явных команд, таких как PropertyConfigurator.configure()
.
Ответ №3:
У меня такая же проблема, и я ее решил. Когда я изменил информацию о форме уровня для ОТЛАДКИ в строке файла свойств:
log4j.rootLogger=DEBUG, file, stdout
и чем я написал в скрипте:
logger.debug("Hello world");
все было сохранено в файле.
Ответ №4:
ИМЯ ФАЙЛА ЗДЕСЬ НА САМОМ ДЕЛЕ ЯВЛЯЕТСЯ ПАКЕТОМ КЛАССА LOGGER
logger.file.name =»имя вашего пакета в java»