一个好的日志格式对问题定位很有帮助,学好日志管理是学Java 的必修课。
一、Java自带Logger类:java.util.logging
1.新建LogFormatter类,继承Formatter,设置日志格式
public class LogFormatter extends Formatter {
@Override
public String format(LogRecord record) {
Date date = new Date();
String sDate = date.toString();
return "[" + sDate + "]" + "[" + record.getLevel() + "]"
+ record.getClass() + ": " +record.getMessage() + "\n";
}
}
2.Logger使用
Logger log = Logger.getLogger("testlog");
log.setLevel(Level.ALL);
FileHandler fileHandler = new FileHandler("testlog.log");
fileHandler.setLevel(Level.ALL);
fileHandler.setFormatter(new LogFormatter());
log.addHandler(fileHandler);
log.info("This is a test java util log");
该代码实现往控制台和文件写日志。效果如下:
二、log4j
log4j是Apache的一个开源项目。可以从文件配置log,十分方便。
1.添加log4j的maven依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.添加log4j.properties文件到resources文件夹
内容如下:
#设置日志级别
log4j.rootLogger=info,stdout,logfile
#输出到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%p]%l: %m%n
注意rootLogger为根日志,后面的第一个参数为日志显示级别,后面的是appender名称,日志打印位置。后面均为日志相关配置。
3.使用log4j
注意选择包
import org.apache.log4j.Logger;
使用如下:
Logger log = Logger.getLogger("rootLogger");
log.debug("Here is some DEBUG");
log.info("Here is some INFO");
log.warn("Here is some WARN");
log.error("Here is some ERROR");
log.fatal("Here is some FATAL");
log4j总共有5个级别,其级别是fatal > error > warn > info > debug。
4.输入如下:
注意其中没有显示debug级别的日志信息。
三、commons-logging
commons-logging是一个日志共用接口,需要和log4j配合使用。
1.添加commons-logging和log4j依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.使用
Log log = LogFactory.getLog(LogDemo.class);
其效果和log4j一样,这里就不展示了。
四、slf4j
slf4j是Simple Logging Facede for java(简单日志门面)的简称。其提供了统一记录日志的接口,对日志的实现进行抽象,无需关心日志是通过哪个日志系统,以什么风格输出的。
1.添加slf4j-api和slf4j-log4j12的依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
2.配置log4j.properties,设置输出流和输出格式,同上。
3.使用
Logger log = LoggerFactory.getLogger(LogDemo.class);
注意使用的是下面的包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
效果同上。
五、log4j2
1. 依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.10.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
2. 配置
(1)log4j2.yaml
Configuration:
status: warn
appenders:
Console:
name: Console
target: SYSTEM_OUT
PatternLayout:
Pattern: "%m%n"
Loggers:
Root:
level: info
AppenderRef:
ref: Console
(2) log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration>
<Properties>
<property name="LOG_PATTERN">%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
</Console>
</Appenders>
<Loggers>
<Root level="info">
<appender-ref ref="Console"/>
</Root>
</Loggers>
</Configuration>
3. 使用
Logger log = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
log.trace("trace level");
log.info("info level");
六、多个log实现信息分流
配置log4j.properties文件,如下:
#设置日志级别
log4j.rootLogger=info,console,logfile
log4j.logger.Logger1 = debug,file1
log4j.logger.Logger2 = debug,file2
#日志1输出到日志文件
log4j.appender.file1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.file1.file = file1.log
log4j.appender.file1.layout = org.apache.log4j.PatternLayout
log4j.appender.file1.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%5p]%l: %m%n
其中Logger1,和Logger2就是另外的日志配置,后面是选择输出到file1,当然也可以输出到控制台。
调用如下:
Logger log1 = Logger.getLogger("Logger1");
Logger log2 = Logger.getLogger("Logger2");
log1.debug("log1: Here is some DEBUG");
log1.info("log1: Here is some INFO");
log1.warn("log1: Here is some WARN");
log1.error("log1: Here is some ERROR");
log2.debug("log2: Here is some DEBUG");
log2.info("log2: Here is some INFO");
log2.warn("log2: Here is some WARN");
log2.error("log2: Here is some ERROR");
然后消息就被输出到相应的文件里了。