框架-Log4j

abstract

添加依赖

pom.xml文件中添加如下依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- spring boot start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<!-- 排除自带的logback依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

<!-- springboot-log4j -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>

编辑配置文件

rootlogger

rootlogger主要定义log4j支持的日志级别及输出目的地,其语法为:

1
log4j.rootLogger = [ level ] , appenderName, appenderName, 

  • level 是日志记录的优先级,分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。
  • appenderName指定日志信息输出到哪个地方,可同时指定多个输出目的地。

例如:

1
log4j.rootLogger=info, stdout

有两个疑惑:

Level 代号
FATAL 0
ERROR 3
WARN 4
INFO 6
DEBUG 7
  1. 后面Threshold有限制输出范围,如果这里设置了ERROR,Threshold设置INfO,日志会输出WARN,和INFO级别的日志信息吗?
  2. 中间丢失的125对应什么级别,他们是被弃用了吗?我这里有酒,希望有了解的可以讲出他们的故事;

appender

appender附加器主要定义日志信息输出位置,输出格式等。主要语法为:

1
2
3
log4j.appender.appenderName = classInfo
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.optionN = valueN

这里的appenderNamerootlogger中的appenderName对应

appender的classInfo有如下选项:

  • org.apache.log4j.ConsoleAppender(控制台)
  • org.apache.log4j.FileAppender(文件)
  • org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
  • org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
  • org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

例如:

1
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

appender.option–File

File是日志输出的目的地。

例如:

1
log4j.appender.stdout.File=logs/log.log

appender.option–Threshold

输出等级限制,包含本身及以上。

例如:

1
2
## 输出DEBUG级别以上的日志
log4j.appender.stdout.Threshold=DEBUG

appender.option–Append

日志信息的追加方式。
true意味着,默认为true
fales意味着,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.qigou.b2cex.test;

import com.b2bex.goods.service.EsOrderIndexManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;

public class TestExcel{

private static final Logger logger = LoggerFactory.getLogger("BBDOG");

public static void main(String[] args) throws Exception {
logger.info("logger----Info");
logger.warn("logger----warn");
logger.debug("logger----debug");
logger.error("logger----error");
logger.info("-----------------------------分割线-----------------------------");
}
}

使用默认配置,配置文件中有如下信息:

再次执行,信息如下;

配置中增加

1
log4j.appender.bbdog.Append=fales

再次执行后,本想顺理成章的像其他博文一样展示只有一份信息。但学东西真的这么顺利过吗?

实际上控制台给我报错:

1
log4j:WARN Failed to set property [append] to value "fales".

然后发现呵呵呵呵!false写成了fales.修改后文件中确实只有最新的日志信息了:

appender.option–Encoding

日志信息的编码格式;

1
2
## 输出DEBUG级别以上的日志
log4j.appender.stdout.Encoding=UTF-8

appender.option–DatePattern

在DailyRollingFileAppender中可以指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个日志生成频度,这是通过为 DatePattern选项赋予不同的值来完成的。DatePattern选项的有效值为:

  • ‘.’yyyy-MM,对应monthly(每月)
  • ‘.’yyyy-ww,对应weekly(每周)
  • ‘.’yyyy-MM-dd,对应daily(每天)
  • ‘.’yyyy-MM-dd-a,对应half-daily(每半天)
  • ‘.’yyyy-MM-dd-HH,对应hourly(每小时)
  • ‘.’yyyy-MM-dd-HH-mm,对应minutely(每分钟)

DatePattern中不用处理的文字要放到单引号(‘)中,如上面的(.)。如果您对此有疑问可以查阅SimpleDateFormat的文档。DailyRollingFileAppender中使用这个类来处理DatePattern。

DatePattern格式化之后的文本作为文件名字的后缀。DailyRollingFileAppender不支持格式化之后的文本作为文件名字的前缀。

修改系统时间可以看到效果,当天的文件名为bbdog.log,之前的文件名会加上频度日期

appender.option–Layout

Layout 负责格式化Appender的输出。

Log4j提供的layout有以下几种:

  • org.apache.log4j.HTMLLayout(以HTML表格形式布局),
  • org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
  • org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
  • org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

例如:

1
2
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

其中ConversionPattern有如下解释

参数 含义
%m 输出代码中指定的消息
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日 22 : 10 : 28 , 921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )

这里只演示了DailyRollingFileAppender这种方式下的一些参数.

其他输出类型会有额外的参数,如RollingFileAppender下会有MaxFileSizeMaxBackupIndex,单个文件大小和备份数量

食用方法

参考资料

博客园-盖世圣猪-log4j配置详解(非常详细)

CSDN-谁动了我的bug-Log4j Append属性指定是否追加内容

ConversionPattern中的格式化参数详见Log4j补充