Log4J создает файл журнала, но не записывает в него

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

Итак, есть две возможности (которые приходят на ум):

  1. Ваш код импортирует java.util.logging.Logger , а не org.apache.log4j.Logger .
  2. В вашем classpath существует какая-то библиотека, которая перехватывает вызовы Log4J и преобразует их в вызовы JUL.

Комментарии:

1. Спасибо, так оно и было. Но я замечаю, что только мои error или более поздние сообщения записываются в файл или в консоль. Есть идеи, как заставить его регистрировать все уровни?

2. Способ, которым задана ваша конфигурация (возможно, вы изменили ее с момента публикации здесь?), Log4J будет печатать только сообщения, которые являются info и выше, и он будет печатать их как в консоль, так и в файл. Вы можете изменить это поведение, изменив INFO на ALL in log4j.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»