JDK Logging
//jdk内置日志工具
//配置需要在JVM启动时传递参数
import java.util.logging.Logger;
public class Hello {
public static void main(String[] args) {
Logger logger = Logger.getGlobal();
logger.info("start process...");
}
}
Commons Logging 和 Log4j
//Commons Logging 是一种日志接口,Log4j是接口具体实现
//这里省略配置文件
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main {
public static void main(String[] args) {
Log log = LogFactory.getLog(Main.class);
log.info("start...");
log.warn("end.");
}
}
SLF4J(Simple Logging Facade for Java) 和 Logback
//SLF4J 是另一种日志接口,Logback是具体实现(此外还有slf4j-simple、slf4j-log4j12)
//比Commons Logging多了占位符,且Log改成Logger
//这里省略配置文件
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
final Logger logger = LoggerFactory.getLogger(Main.class);
logger.info("start...");
logger.warn("end.");
logger.info("Set score {} for Person {} ok.", "99", "foobar"); //占位符
}
实际应用
- Commons Logging (这里不讨论,主要以slf4j为主)
可参考:https://blog.csdn.net/l1028386804/article/details/80464909 - SLF4J
Spring Boot默认的slf4j日志框架,1.4x版本后内置Logback
//maven依赖
//可引入spring-boot-starter-logging,含有logback
//其中 spring-boot-starter 含有spring-boot-starter-logging
//spring-boot-starter-thymeleaf 含有 spring-boot-starter
//项目中注意即可,有必要要进行依赖排除
//日志级别 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
//spring核心开启debug级别,包含嵌入式容器、hibernate、spring会输出更多内容
//application.properties中
debug=true
//常规写法外,可用注解,但需要引入lombok
@Slf4j //引入注解后
...
//可直接代码中使用,并可用占位符
logger.info("Set score {} for Person {} ok.", "99", "foobar");
//日志配置
//输出文件,默认Spring Boot将日志输出到控制台,不会写到日志文件
//在application.yml中
logging:
pattern:
console: "%d - %msg%n" //输出到控制台的格式
path: /var/log/ //有此属性则会生成文件,默认spring.log,默认10MB会切分
file: /var/log/spring.log //有此属性则path属性将无效
level: //默认级别info即输出error、warn、info(以下建议用自定义配置)
root: warn //结合下面的自定义配置文件理解logger和根logger,向上匹配不到包,最终会以此级别
org.springframework.web: debug //设置logger的具体包的级别,下同
org.hibernate: error
com.xiaofeng.LoggerTest: debug
//自定义配置文件
//首先在application.yml中定义,环境和日志路径
spring:
profiles:
active: dev
logback:
logdir: /var/log
appname: xxx
//创建logback-spring.xml放到src/main/resources
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--application.yml 传递参数,不能使用logback 自带的<property>标签 -->
<springProperty scope="context" name="appname" source="logback.appname"/>
<springProperty scope="context" name="logdir" source="logback.logdir"/>
<contextName>${appname}</contextName>
<!--输出到控制台 ConsoleAppender-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--展示格式 layout-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</pattern>
</layout>
</appender>
<!-- 输出到文件 -->
<appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logback.logdir}/${logback.appname}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logback.logdir}/${logback.appname}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<!--<totalSizeCap>1GB</totalSizeCap>-->
</rollingPolicy>
<!--日志输出编码格式化-->
<encoder>
<charset>UTF-8</charset>
<pattern>%d [%thread] %-5level %logger{36} %line - %msg%n</pattern>
</encoder>
</appender>
<!-- 开发环境. 多个使用逗号隔开. -->
<springProfile name="dev">
<!-- logger指定到具体包,additivity为是否向上传递,默认为true则会向上匹配到根root-->
<logger name="com.example.demo.controller" level="DEBUG" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
<!--指定根logger的日志输出级别-->
<root level="INFO">
<appender-ref ref="consoleLog"/>
</root>
</springProfile>
<!-- 生产环境. -->
<springProfile name="prod">
...
</springProfile>
</configuration>
参考
https://www.cnblogs.com/xrq730/p/8619156.html
https://www.liaoxuefeng.com/wiki/1252599548343744/1264739155914176
https://www.jianshu.com/p/eb7d76633acb
https://blog.csdn.net/l1028386804/article/details/80464909
https://www.jianshu.com/p/f67c721eea1b
https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-logging.html
https://www.cnblogs.com/xrq730/p/8628945.html