Java Log4J 工作不正常?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23614191/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-14 00:19:36  来源:igfitidea点击:

Log4J not working properly?

javalog4j

提问by Doug Hauf

I am new to Log4J. i am trying to get this logger to work. i downloaded the .JAR file and I have built that into the Referenced Libraries and can open the folder and see it in there. So I think it is built into my project.

我是 Log4J 的新手。我试图让这个记录器工作。我下载了 .JAR 文件,并将其构建到引用库中,可以打开文件夹并在其中查看。所以我认为它内置于我的项目中。

I think that I am missing how to declare the logger so that i can use it below. Some of the code I got from stackoverflow.

我想我缺少如何声明记录器以便我可以在下面使用它。我从stackoverflow获得的一些代码。

Question: Which part of the Log4J declaration am I missing so that I can use it as a logger in my simple example?

问题:我遗漏了 Log4J 声明的哪一部分,以便在我的简单示例中将其用作记录器?

Code:

代码:

import java.io.*;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class TestLogs {
    private static Logger logger = Logger.getLogger(FileChooserDemo.class.getName());

    FileHandler fh;   

    public TestLogs() {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
            fh = new FileHandler("C:\Users\itpr13266\Desktop\MyNewLogFile.log");   
            logger.addHandler(fh);
            logger.info("Logging an INFO-level message");
            logger.warning("Your file cannot be written!!");
        } catch (Exception ex) {
            Logger.getLogger(FileChooserDemo.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void LogTester() {
         Logger.getRootLogger().getLoggerRepository().resetConfiguration();
         ConsoleAppender console = new ConsoleAppender(); //create appender
          //configure the appender
          String PATTERN = "%d [%p|%c|%C{1}] %m%n";
          console.setLayout(new PatternLayout(PATTERN)); 
          console.setThreshold(Level.FATAL);
          console.activateOptions();
          //add appender to any Logger (here is root)
          Logger.getRootLogger().addAppender(console);

          FileAppender fa = new FileAppender();
          fa.setName("FileLogger");
          fa.setFile("mylog.log");
          fa.setLayout(new PatternLayout("%d %-5p [%c{1}] %m%n"));
          fa.setThreshold(Level.DEBUG);
          fa.setAppend(true);
          fa.activateOptions();

          //add appender to any Logger (here is root)
          Logger.getRootLogger().addAppender(fa)    
    }

    public static void main(String[] args) {
       TestLogs tls = new TestLogs();
       tls.LogTester();
     }
}

enter image description here

在此处输入图片说明

new image- I rebuilt the paths and it put them in a slightly different position in the file structure. But the error still persists.

新图像 - 我重建了路径,并将它们放在文件结构中略有不同的位置。但错误仍然存​​在。

enter image description here

在此处输入图片说明

Code that works --- But how do I log it to a text file on my computer.

有效的代码 --- 但是我如何将它记录到我计算机上的文本文件中。

package TestMenu;

import org.apache.log4j.*;

import javax.swing.*;

public class TestLogs {
    private static Logger logger = Logger.getLogger(TestLogs.class.getName());

    public TestLogs() {
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
        } catch (Exception ex) {
        }
    }

    private void LogTester() {
         logger.info("It works");
         TestLogs tls = new TestLogs();
    }

    public static void main(String[] args) {
       TestLogs tls = new TestLogs();
       tls.LogTester();
     }
}

At least the log4j is working but how to change the properties file around so that I can log all warnings, info and to a file not to the console?

至少 log4j 正在工作,但是如何更改属性文件以便我可以将所有警告、信息和文件记录到一个文件而不是控制台?

Log4j Properties:

Log4j 属性:

# 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

new image -- not working -- error shown on bottom

新图像——不工作——底部显示错误

enter image description here

在此处输入图片说明

enter image description here

在此处输入图片说明

Errors:

错误:

log4j:WARN No appenders could be found for logger (TestMenu.TestLogs).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

enter image description here

在此处输入图片说明

采纳答案by vkg

You are trying to use java util logging not log4j. you need to import

您正在尝试使用 java util logging 而不是 log4j。你需要导入

import org.apache.log4j.Logger;

Another thing I see that is wrong in your code is

我在您的代码中看到的另一件事是

change this:

改变这个:

private static Logger logger = Logger.getLogger(FileChooserDemo.class.getName());

To

private static Logger logger = Logger.getLogger(TestLogs.class.getName());

Here is a sample

这是一个示例

package com.vkg;

import org.apache.log4j.Logger;

public class TestLogs {
    private static Logger logger = Logger.getLogger(TestLogs.class.getName());

    public static void main(String[] args) {
        logger.info("It works");
        TestLogs tls = new TestLogs();
    }
}

A basic log4j config file

一个基本的 log4j 配置文件

  # Root logger 
log4j.rootLogger=INFO, file, stdout

# Write to file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=[sompath to your log file e.g. C:\mylog.log]
log4j.appender.file.MaxFileSize=50MB
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

# Write to console
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

And output

和输出

2014-05-12 13:18:01 INFO  TestLogs:9 - It works

Image below shows where to keep log4j.properties

下图显示了保存 log4j.properties 的位置

enter image description here

在此处输入图片说明

回答by gatkin

You should be importing org.apache.log4j.Logger, and nothing from java.util.logging.

你应该导入org.apache.log4j.Logger,而不是从java.util.logging.