log4j学习笔记(1)

介绍

在编写大型项目时,日志输出是极其重要的一部分。而在Java项目中,常用的日志则是log4j和slf4j的组合。

log4j

Log For Java,Apache的一个开源项目,可以灵活地记录日志信息,我们可以通过log4j的配置文件灵活配置日志的记录格式、记录级别、输出格式,而不需要修改已有的日志记录代码。

官方网站:http://logging.apache.org/log4j/1.2/

slf4j

简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,slf4j是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。

在使用slf4j的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统,slf4j提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

官方网站:http://www.slf4j.org/

先从log4j学起

log4j的使用

配置文件

可以有两种配置方式:log4j.properties(键对的形式), log4j.xml

.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//定义两个INFO级别的appender
log4j.rootLogger = INFO,console,logFile
//org.apache.log4j.ConsoleAppender 输出到控制台
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - <%m>%n


//org.apache.log4j.FileAppender 输出到一个log文件
//org.apache.log4j.DailyRollingFileAppender 每天自动产生一个日志文件
log4j.appender.logFile = org.apache.log4j.FileAppender
log4j.appender.logFile.File=src/log/logging.log
log4j.appender.logFile.Append=false //是否追加
log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
log4j.appender.logFile.layout.ConversionPattern=%d %p [%c] - <%m>%n

.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?xml version="1.0"  encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<!--若干个appender的定义-->
<!--org.apache.log4j.ConsoleAppender 输出到控制台-->
<appender name="myConsole" class="org.apache.log4j.ConsoleAppender">
<!--输出格式-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>

<!--org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件-->
<appender name="myFile" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="output.log"/><!--文件位置-->
<param name="Append" value="true"/><!--是否选择追加-->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n"/>
</layout>
</appender>

<!--org.apache.log4j.RollingFileAppender 滚动日志文件输出 文件大小到达一定尺寸时重新产生新的文件-->
<!--<appender name="myFile" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="D:/output.log" />
<param name="Append" value="true" />
<param name="MaxFileSize" value="500KB"/>
<param name="MaxBackupIndex" value="10" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%p (%c:%L)- %m%n" />
</layout>
</appender>-->

<!--将各个包中的类日志输出到不同的日志文件中
这样可以便于日志的分类。
可以通过这个设置,把业务逻辑的日志添加到数据库。起到过滤的作用
-->
<!--这段配置的就是说把包名为“com.zjut.a1”且优先级为debug的日志通过myFile这个appender来处理。
-->
<category name="com.zjut.a1">
<priority value="debug"/>
<appender-ref ref="myFile"/>
</category>


<!-- 根logger的设置-->
<root>
<!--优先级设置,假设设置为“info”,则无法输出debug级别的日志-->
<priority value="debug"/>
<!--<priority value="info"/>-->
<!--<priority value="warn"/>-->
<!--<priority value="error"/>-->
<!--<priority value="fatal"/>-->

<!--添加刚才设置的appender-->
<appender-ref ref="myConsole"/>
<appender-ref ref="myFile"/>
</root>
</log4j:configuration>

配置文件存放位置

放在src下,不能是src下面的任一个文件夹下。

否则会报如下错

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

说明缺少log4j.properties这个文件或者他的存放的位置错误,导致找不到它。

还有另一个比较高阶的办法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//手动配置
public static void initLog() {
FileInputStream fileInputStream = null;
try {
Properties properties = new Properties();
fileInputStream = new FileInputStream("src/log/log4j.properties");
properties.load(fileInputStream);
PropertyConfigurator.configure(properties);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//在用logger之前,先initLog即可
public static void main(String[] args) {
initLog();
Logger logger=LogManager.getLogger(Mylog.class);
}

日志输出级别

log4j的日志级别如下表所示,其种从上至下等级越来越高,及配置了某一级别后,表格中处于它下边的位置级别的日志都会打印。

日志级别 说明
ALL 打印所有级别的日志
TRACE 指定细粒度比DEBUG更低的信息事件
DEBUG 指定细粒度信息事件是最有用的应用程序调试
INFO 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息
WARN 指定具有潜在危害的情况
ERROR 错误事件可能仍然允许应用程序继续运行
FATAL 指定非常严重的错误事件,这可能导致应用程序中止
OFF 这是最高等级,为了关闭日志记录

ConversionPattern参数的格式含义

log4j.appender.logFile.layout.ConversionPattern=%d %p [%c] - <%m>%n
%c 输出日志信息所属的类的全名
%d (datetime)输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28
%F 输出日志信息所属的类的类名
%L 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
%m 输出代码中指定的信息,如log(message)中的message
%n(new line) 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%p (priority) 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
%r (runtime) 输出自应用启动到输出该日志信息所耗费的毫秒数
%t 输出产生该日志事件的线程名

使用

使用起来可以说是简单了

1
2
3
4
5
6
7
public static void main(String[] args) {
//initLog(); //手动配置
Logger logger=LogManager.getLogger(Mylog.class);

logger.info("info");
logger.warn("warning");
}

结果

结果

slf4j

待补充

#
You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×