为什么我的 log4j class 只记录 FATAL 消息?
Why is my log4j class only logging FATAL messages?
我有以下 log4j Java class:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Level;
public class HelloWorldLog4J {
private static final Logger logger = LogManager.getLogger("HelloWorld");
public static void main(String[] args) {
System.out.println("pre_loggerDOTinfo");
System.out.println();
//logger.setLevel(Level.FATAL); //used to be..
logger.info("Hello, this is an INFO message");
logger.warn("Hello, this is an WARN message");
logger.fatal("Hello, this is an FATAL message");
logger.fatal("Hello, this is an FATAL message ALSO, #2");
logger.fatal("Hello, this is an FATAL message ALSO, #3");
logger.fatal("Hello, this is an FATAL message ALSO, #4");
logger.debug("Hello, this is an FATAL message");
logger.info("Hello, this is an INFO message");
logger.info("Hello, this is an INFO message");
System.out.println();
System.out.println("post_loggerDOTinfo");
}
}
在同一目录中,我有一个 log4j 属性文件:
# Root logger option
log4j.rootLogger=WARN, Console
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File= C:\Users\adel\Desktop\Misc_Stuff\Java_Code\logging.log
log4j.appender.file.MaxFileSize=1MB
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
如您所见,我注释掉了 logger.setLevel(Level.FATAL)
代码,因为它导致我的程序崩溃(说它找不到 setLevel,甚至当我尝试 toLevel 时它也不起作用)
我的输出是这样的:
pre_loggerDOTinfo
16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL
message 16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL
message ALSO, #2
16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL
message ALSO, #3
16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL
message ALSO, #4
post_loggerDOTinfo
我对 class 中使用的是哪个属性文件有点困惑。有没有办法追溯我使用的 log4j 版本,以及从哪里获取 log4j 属性信息?
感谢任何提示,谢谢!~
您的应用程序使用 log4j2 类(包是 org.apache.logging.log4j
,而 log4j-1.x 在 org.apache.log4j
命名空间中)。
但是你的配置是一个针对log4j的properties文件-1.x.
Log4j2 不理解基于属性文件的配置。您必须提供 XML(或 Jason 或 YAML)配置文件。 Log4j2 将在类路径中查找名为 log4j2.xml 的配置文件。如果你把它放在别处,你需要使用 log4j.configurationFile
系统 属性.
告诉 log4j2 路径
log4j2manual has many examples configurations (the docs are much better than for log4j-1.x); I suggest starting with the example config shown for the RollingFile appender.
如果 Log4j2 找不到配置,它将使用默认配置,该配置仅在 ERROR 和 FATAL 级别记录到控制台。
最后,请注意,对于 log4j2,您 need 类路径中的 log4j-api 和 log4j-core jar 文件。
如果您使用的是 IntelliJ,请确保 log4j2.xml 位于 src/main/resource 文件夹中。如果项目只记录 FATAL 消息,这通常意味着您将 log4j2.xml 文件放在错误的位置(或者在项目的不同位置有 2 个同名文件等)并且框架 log4j 找不到它并且默认仅打印致命消息。
project (root)
|_src
|_main
|_java
|_resource (add log4j2.xml here)
|_test
|_java
|_resource
我正在使用 IntelliJ,最新的 log4j-core 并从以下位置获取配置文件示例:
http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender
我有以下 log4j Java class:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Level;
public class HelloWorldLog4J {
private static final Logger logger = LogManager.getLogger("HelloWorld");
public static void main(String[] args) {
System.out.println("pre_loggerDOTinfo");
System.out.println();
//logger.setLevel(Level.FATAL); //used to be..
logger.info("Hello, this is an INFO message");
logger.warn("Hello, this is an WARN message");
logger.fatal("Hello, this is an FATAL message");
logger.fatal("Hello, this is an FATAL message ALSO, #2");
logger.fatal("Hello, this is an FATAL message ALSO, #3");
logger.fatal("Hello, this is an FATAL message ALSO, #4");
logger.debug("Hello, this is an FATAL message");
logger.info("Hello, this is an INFO message");
logger.info("Hello, this is an INFO message");
System.out.println();
System.out.println("post_loggerDOTinfo");
}
}
在同一目录中,我有一个 log4j 属性文件:
# Root logger option
log4j.rootLogger=WARN, Console
# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File= C:\Users\adel\Desktop\Misc_Stuff\Java_Code\logging.log
log4j.appender.file.MaxFileSize=1MB
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
如您所见,我注释掉了 logger.setLevel(Level.FATAL)
代码,因为它导致我的程序崩溃(说它找不到 setLevel,甚至当我尝试 toLevel 时它也不起作用)
我的输出是这样的:
pre_loggerDOTinfo
16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL message 16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL message ALSO, #2
16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL message ALSO, #3
16:47:09.575 [main] FATAL HelloWorld - Hello, this is an FATAL message ALSO, #4
post_loggerDOTinfo
我对 class 中使用的是哪个属性文件有点困惑。有没有办法追溯我使用的 log4j 版本,以及从哪里获取 log4j 属性信息?
感谢任何提示,谢谢!~
您的应用程序使用 log4j2 类(包是 org.apache.logging.log4j
,而 log4j-1.x 在 org.apache.log4j
命名空间中)。
但是你的配置是一个针对log4j的properties文件-1.x.
Log4j2 不理解基于属性文件的配置。您必须提供 XML(或 Jason 或 YAML)配置文件。 Log4j2 将在类路径中查找名为 log4j2.xml 的配置文件。如果你把它放在别处,你需要使用 log4j.configurationFile
系统 属性.
log4j2manual has many examples configurations (the docs are much better than for log4j-1.x); I suggest starting with the example config shown for the RollingFile appender.
如果 Log4j2 找不到配置,它将使用默认配置,该配置仅在 ERROR 和 FATAL 级别记录到控制台。
最后,请注意,对于 log4j2,您 need 类路径中的 log4j-api 和 log4j-core jar 文件。
如果您使用的是 IntelliJ,请确保 log4j2.xml 位于 src/main/resource 文件夹中。如果项目只记录 FATAL 消息,这通常意味着您将 log4j2.xml 文件放在错误的位置(或者在项目的不同位置有 2 个同名文件等)并且框架 log4j 找不到它并且默认仅打印致命消息。
project (root)
|_src
|_main
|_java
|_resource (add log4j2.xml here)
|_test
|_java
|_resource
我正在使用 IntelliJ,最新的 log4j-core 并从以下位置获取配置文件示例: http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender