实验4要求生成日志,参考了一下网上的说明,感觉 log4j 应该会比较好,下面开始详细配置的使用教程
注意: 本文使用的log4j 2.x不能向下兼容1.x版本,比如org.apache.log4j.SimpleLayout
在2.x中被移除
STEP 0. log4j基础知识
一个完整的日志系统包括Appender
,Layout
,Logger
三部分,缺一不可
-
Layout
日志的类型
包括CSV Layout
,GELF Layout
,HTML Layout
,JSON Layout
,Pattern Layout
,RFC5424 Layout
.其中HTML Layout
产生html格式的日志,Pattern Layout
产生格式化字符串内容的日志,本文主要使用这种格式,下面是Pattern Layout
的简单使用方法:
参数(大小写敏感) | 表示的意思 |
---|---|
%m | 日志内容 |
%M | 输出当前的方法名 |
%C | 输出当前的类名 |
%d{时间样式} | 日志产生时间,时间样式由y,M,d,H,m,s,S组成,分别表示一位年,月,日,时,分,秒,毫秒.比如%d{yyyy.MM.dd HH:mm:ss} |
%p | 日志优先级(下面会讲到) |
%l | 日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 ) |
%n | 换行符 |
%-20.30c | 用法同C语言的printf |
详细使用方法: Pattern Layout API
-
Appender
日志的输出端
看名字就知道这个是用来添加到什么地方的(其实是添加到Logger里的),每个Appender有且仅有一个Layout,即只能有一个日志格式,而不同的Appender代表了不同的输出,可以是一个文件(FileAppender
),也可以是标准输出(ConsoleAppender
).
Appender还有很多其他子类,这里不再赘述,详细使用方法:Appender API
本文主要使用FileAppender
,ConsoleAppender
. -
Logger
产生日志
所在包:org.apache.log4j.Logger
Logger对象不能通过new
获得,只能通过Logger.getRootLogger()
方法或者Logger.getLogger(balabala)
(有三个重载版本,目前用法还不太清楚详细用法,而且第一个就暂时够用了)设置好配置文件后可以直接使用Logger.getRootLogger()
来获得Logger.
日志记别
日志有7种级别,从高到低为:
级别 | 描述 | 生成方法 |
---|---|---|
OFF | 最高等级,用于关闭所有日志记录。 | - |
FATAL | 指出每个严重的错误事件将会导致应用程序的退出。 | logger.fatal(Object message) |
ERROR | 指出虽然发生错误事件,但仍然不影响系统的继续运行。 | logger.error(Object message) |
WARN | 表明会出现潜在的错误情形。 | logger.warn(Object message) |
INFO | 一般和在粗粒度级别上,强调应用程序的运行全程。 | logger.info(Object message) |
DEBUG | 一般用于细粒度级别上,对调试应用程序非常有帮助。 | logger.debug(Object message) |
ALL | 最低等级,用于打开所有日志记录。 | - |
以上都为org.apache.log4j.Logger
包中的枚举类型
可以通过logger.setLevel(Level)方法来设置日志的最低等级,低于这个等级的日志不会被记录,也可以在配置文件中设置默认的日志记别
一个Logger可以添加多个Appender,可以在配置文件中添加,也可以用logger.addAppender()方法添加.Logger生成的日志会输出到所有的Appender.
STEP 1. 下载&配置
- 下载后解压文件夹
apache-log4j-2.11.0-bin
到Lab4/lib/
目录,打开Eclipse,refresh一下,然后设置Build Path
,将apache-log4j-2.11.0-bin
下所有的jar文件添加到libraries中 (Tips: 按住shift
选择首尾两个文件) - 我配置好了运行时 发生异常
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassCastException: org.apache.logging.slf4j.SLF4JLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext
google之后发现在上一步移除log4j-to-slf4j-2.11.0.jar
即可
附:参考链接
3.在src目录下新建Main.java文件,输入
import org.apache.log4j.Logger;
如果编译器不报错,说明配置成功。
- 在src(任意一个BuildPath)下新建一个
log4j2.xml
文件,该文件为log4j
的配置文件,复制以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%m%n" />
</Console>
<File name="log" fileName="log/graph.log" append="false">
<PatternLayout pattern="%d{yyyy.MM.dd HH:mm:ss} %5p %C %M %m%n"/>
</File>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console" />
<AppenderRef ref="log" />
</Root>
</Loggers>
</Configuration>
如果不存在该文件,运行时就会在System.err
输出
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
第一个名为Console
的ConsoleAppender
(输出到标准输出)使用PatternLayout
, 输出的日志格式为"%m%n"
第二个名为log
的FileAppender
(输出的文件log/graph.log)也使用PatternLayout
,输出的日志格式为"%d{yyyy.MM.dd HH:mm:ss} %5p %C %M %m%n"
,即时间 等级 日志内容 类名 方法名\n
Loggers
标签里的代码将Console
和log
两个Appender
对象添加到Root
中,因此产生的log不仅会在控制台上显示,也输出到log/graph.log
文件中
下面结合程序来解释
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Main {
static Logger logger = Logger.getRootLogger();
public static void main(String... args) {
logger.setLevel(Level.INFO); //可以去掉
logger.info("this is an info");
logger.warn("this is a warn");
logger.error("this is an error");
logger.fatal("this is a fatal");
}
}
控制台输出:
this is an info
this is a warn
this is an error
this is a fatal
log/graph.log
文件:
2018.05.19 16:06:32 INFO Main main this is an info
2018.05.19 16:06:32 WARN Main main this is a warn
2018.05.19 16:06:32 ERROR Main main this is an error
2018.05.19 16:06:32 FATAL Main main this is a fatal
STEP 2.使用
到此你已经完成了90%,如果SETP 1一切正常,就可以开始使用了.
新建一个Log类,添加public static
属性的域logger
package log;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log {
public static final Logger logger = Logger.getRootLogger();
/*以下语句块可以删除*/
static {
logger.setLevel(Level.INFO);
}
}
你还可以在static语句块内设置logger
的其他属性,static public
属性保证你可以在整个Project的所有地方生成日志
以上是我对log4j用法的说明,因为第一次写博客所以难免有错误之处.所以本人不保证任何一句话的正确性,如有错误之处还请指出.
参考链接:
http://logging.apache.org/log4j/2.x/manual/appenders.html
http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/SimpleLayout.html
https://blog.csdn.net/womeng2009/article/details/53510913
https://blog.csdn.net/u011781521/article/details/55002553
https://www.yiibai.com/log4j/log4j_patternlayout.html