本文的运行环境为:IDEA + Maven,有关Maven框架的使用可自行百度。
1. 导入log4j包
在项目的pom.xml的<dependencies>标签下添加如下代码,然后等待Maven将log4j的包下载完成。
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2. 配置日志输出路径
(1)首先在项目的Resource目录下新建一个properties文件:log4j.properties。
项目路径如下图:
(2)在properties文件中进行配置,配置相关代码如下:
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出INFO信息到/Users/zhuyidi/WorkSpace/log4j/logs/info.log ###
log4j.appender.stdout = org.apache.log4j.DailyRollingFileAppender
log4j.appender.stdout.File = /Users/zhuyidi/WorkSpace/log4j/logs/info.log
log4j.appender.stdout.Append = true
log4j.appender.stdout.Threshold = INFO
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%C %t:%r ] - [ %p ] %m%n
### 输出DEBUG 级别以上的日志到/Users/zhuyidi/WorkSpace/log4j/logs/debug.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /Users/zhuyidi/WorkSpace/log4j/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%C %t:%r ] - [ %p ] %m%n
### 输出ERROR 级别以上的日志到/Users/zhuyidi/WorkSpace/log4j/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = /Users/zhuyidi/WorkSpace/log4j/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%C %t:%r ] - [ %p ] %m%n
其中ConversionPattern是用来定义日志输出格式,下面是有关输出格式的转换字符的说明:
c:category的名称,可使用{n}限制输出的精度。例如:logger名为"a.b.c",%c{2}将输出"b.c"。
C:产生log事件的java完全限定类名。可使用{n}限制输出的精度。例如:“org.apache.xyz.SomeClass”,%C{2}将输出“SomeClass”。
d:时间和日期的输出格式,例如:%d{yyyyMMddHH:mm:ss,SS},可不带后面的日期格式字符。
F:产生log事件的java源文件名,带“.java”后缀及包名称。
l:log发生位置的详细描述,包括方法名、文件名及行号。
L:log发生在源文件中的位置。
m:log事件的消息内容。
M:log发生时所在的方法名称。
n:根据所运行的平台输出相应的行分隔字符。
p:log事件的级别。
r:自程序运行至log事件产生所经过的时间。
t:产生log的线程名称。这里写自定义目录标题)
3. 一个小栗子
配置完成后,我们来写一个例子测试一下:
import org.apache.log4j.Logger;
/**
* by yidi on 3/5/19
*/
public class Test {
private static final Logger LOGGER = Logger.getLogger(Test.class);
public static void main(String[] args) {
Integer a = 1;
LOGGER.info("test info");
LOGGER.debug("test debug");
LOGGER.error("test error");
System.out.println("hello");
}
}
生成的日志文件如图:
log4j会在新的一天产生新的日志的时候,在之前生成的log文件名后增加日期后缀,比如:error.log.2019-03-10,最新的日志的文件名是没有日期后缀的。
生成的日志文件的内容格式如下:
1. error.log
2019-03-11 10:07:41 [Test main:3 ] - [ ERROR ] test error
2. info.log
2019-03-11 10:07:41 [Test main:0 ] - [ INFO ] test info
2019-03-11 10:07:41 [Test main:3 ] - [ ERROR ] test error
3. debug.log
2019-03-11 10:07:41 [Test main:0 ] - [ INFO ] test info
2019-03-11 10:07:41 [Test main:3 ] - [ DEBUG ] test debug
2019-03-11 10:07:41 [Test main:3 ] - [ ERROR ] test error
4. 关于日志埋点的必要性
在开发一个项目或者系统的时候,往往都会有比较复杂的用户行为或者逻辑处理,这些行为的成功和失败、逻辑的处理结果,可能会在前端造成不同的错误;如果没有前端没有给出足够的错误信息,我们很难从前端的错误定位到后端具体的代码。所以,日志埋点就是为了解决这个问题。
在代码里合理的埋点,能帮助我们快速准确的定位错误、解决问题。通常情况下,我们会在try catch块的catch块中记录error日志,在用户行为结束的代码节点中记录info日志。
总而言之,日志埋点在我们的开发过程中,是非常有用且有必要的!