参考Spring Boot官方文档 日志部分
Spring Boot默认情况下,当使用"Starters" 使用Logback输出日志
, 还包括适当的Logback路由, 确保其他的日志框架(Java Util Logging, Commons Logging, Log4j, SLF4J)都能正常使用
Sping Boot文档的 26.5 Custom Log Configuration 章节,说明了自定义日志配置方法
多样的日志系统可以通过
- 添加适当的日志框架库到classpath
- 适当的配置配置文件加入到classpath的根目录 或者 其他的本地目录, 使用Spring配置
loggin.config
配置指定配置文件
依赖于开发者选择的日志框架. 这些对应的配置文件会被加载
日志框架 | 配置文件 |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml , logback.groovy |
Log4j2 | log4j2-spring.xml , log4j2.xml |
JDK(JAVA Util Logging) | logging.properties |
引入Log4j2日志框架
Log4j2为何物就不介绍了. Log4j2官网
配置的方案 在官方文档 77.2 Configure Log4j for Logging
1. Maven依赖配置
pom.xml
中去掉Logback, 引入log4j2
<!-- 节选 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
2. 配置文件
2.1 log4j2.xml
使用xml格式配置文件, 无需添加额外的依赖库.
2.2 log4j2.yaml / log4j2.yml
使用 yaml/yml格式配置文件. 需要额外引入依赖库
<!-- 解析yml配置 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
2.3 log4j2.json
使用 json 格式配置文件, 需要额外引入依赖库
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
3. 修改spring boot配置
指定spring boot配置文件
application.yaml
文件配置如下
logging:
config: classpath:log4j2.xml
Log4j2日志配置
如需了解Log4j2详尽的配置, 可访问官方文档
概述
大概介绍一下Log4j2的基本信息
日志的Level分为:
- trace (追踪)
- debug (调试)
- info (信息)
- warn (警告)
- error (错误)
- fatal (严重错误)
这里介绍一下博主经常使用的一种日志方式 RollingFileAppender
以一个具体的配置为例
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="trace" strict="true" name="LogConfig">
<Properties>
<Property name="filepath">/tmp/log4j2</Property>
</Properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout>
<Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
</PatternLayout>
</Console>
<RollingFile name="logService"
fileName="${filepath}/logService.log"
filePattern="${filepath}/bak/logService-%d{yy-MM-dd HH:mm:ss}.log.gz">
<PatternLayout>
<Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
</PatternLayout>
<Policies>
<CronTriggeringPolicy schedule="1 * * * * ?" evaluateOnStartup="true"/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="fileLogger" level="debug" additivity="false">
<AppenderRef ref="logService"/>
<AppenderRef ref="STDOUT"/>
</Logger>
<Root level="trace">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
</Configuration>
1. Configuration 参数
status
: Level枚举型, 控制输出Log4j事件信息, 默认 errorname
: 配置名称strict
: 是否使用严格的XML格式. 推荐使用, 规范开发者的配置编写, 不支持jsonp配置- ... 其他几个配置可以参考官方文档
2. Properties
设置配置文件全局的参数变量. 用于减少自定义配置信息的重复编码.
<Properties>
<Property name="filepath">/tmp/log4j2</Property>
</Properties>
配置下文中, 可以使用 ${filepath}
来代替 /tmp/log4j2
3. Appenders
Log4j2提供了丰富的Appender
- AsyncAppender 设置appender异步方式输出日志
- CassandraAppender 输出至Cassandra存储
- ConsoleAppender 输出控制台
- FailoverAppender 设置appender错误重试
- FileAppender 输出至文件
- FlumeAppender 输出至Flume
- JDBCAppender 输出至JDBC连接的关系型数据库表
- JMS Appender 输出至消息服务
- JPAAppender 输出至使用JPA连接的关系行数据库
- HttpAppender 输出至Http Service
- KafkaAppender 输出至Kafka
- MemoryMappedFileAppender 输出至内存
- NoSQLAppender 输出至NoSQL数据库
- OutputStreamAppender File/Socket类型的Appender
- RandomAccessFileAppender 性能是FileAppder的0.2-2倍
- RollingFileAppender 输出至文件, 文件能按照规则打包文件
- RollingRandomAccessFileAppender 同上
- SMTPAppender 邮件形式输出
- SocketAppender socket方式发送日志
项目中比较常用的是 ConsoleAppender
和 RollingFileAppender
.
接下来对上述的Appender配置参数的说明
<Appenders>
<!-- ConsoleAppender -->
<!-- name Appender名称 -->
<!-- target 枚举型(SYSTEM_OUT, SYSTEM_ERR). 默认 SYSTEM_OUT -->
<Console name="STDOUT" target="SYSTEM_OUT">
<!-- 输出格式 详细配置见下文 -->
<PatternLayout>
<Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
</PatternLayout>
</Console>
<!-- RollingFileAppender -->
<!-- fileName 输出的问题名称, 使用绝对路径确保日志位置的正确性, 并且确保目录有进程用户可写权限 -->
<!-- filePattern 日志回滚的文件命名规则 -->
<RollingFile name="logService"
fileName="${filepath}/logService.log"
filePattern="${filepath}/bak/logService-%d{yy-MM-dd HH:mm:ss}.log.gz">
<PatternLayout>
<Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
</PatternLayout>
<Policies>
<!-- 按Cron定时任务回滚文件-->
<!-- schedule Cron表达式 -->
<!-- evaluateOnStartup (规则: 启动时,检查判断目标文件最后的修改时间, 如果cron规则判断该文件需要回滚,则直接回滚文件.) 是否开启该规则操作 -->
<CronTriggeringPolicy schedule="1 * * * * ?" evaluateOnStartup="true"/>
</Policies>
</RollingFile>
</Appenders>
3.2 日志输出规则 Layouts
Layout有多种格式输出
- CSV
- GELF
- HTML
- JSON
- Pattern
- ....
项目中一般使用Pattern 按行输出逐条信息, 配置如下:
<!-- 节选配置 -->
<PatternLayout>
<Pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</Pattern>
</PatternLayout>
%
+ char/word
代表一种输出的信息或者格式
时间 %d / %date
格式 | 输出 |
---|---|
%d, %d{DEFAULT} | 2012-11-02 14:34:02,781 |
%d{UNIX} | 1351866842 |
%d{UNIX_MILLIS} | 1351866842781 |
%d{yyyy-MM-dd HH:mm:ss,SSS} | 2012-11-02 14:34:02,781 |
类 %c / %logger
输出调用的类名
%c{number} , 控制类型的长度
等级 %level
输出等级 TRACE, DEBUG, INFO, WARN, ERROR, FATAL
颜色格式 %highlight
%heighlight{xxx}
xxx将会带有颜色样式, 并且和Level相关, 一般用于debug调试信息使用
日志内容 %m / %msg / %message
可添加文本样式
换行 %n
根据操作系统的输出不同的换行标识符用户日志换行, 最好别使用 \n
, \r\n
等换行符号
其他还有很多标识符号, 参考 官方文档
4. Loggers
- 必须包含一个
Root
元素, 不设置Root
元素, 将会默认使用类似如下的配置
<Root level="error">
<AppenderRef ref="Console" />
</Root>
- 配置其他开发者自定义的
Logger
<Loggers>
<!-- name 必填且唯一 -->
<!-- level 设置输出最低级别 默认error -->
<!-- additivity 是否在父Logger输出, 默认 true -->
<Logger name="fileLogger" level="debug" additivity="false">
<!-- 上文中定义的Appender name -->
<AppenderRef ref="logService"/>
<AppenderRef ref="STDOUT"/>
</Logger>
<Root level="ERROR">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
使用Logger
以demo为例
package info.chiwm.log4j2.service;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;
/**
* @author chiwm@kuyumall.com
* @ClassName: Log4j2ServiceImpl
* @Description:
* @date 2018/1/4 上午11:10
*/
@Service
public class Log4j2ServiceImpl implements Log4j2Service {
// 使用LogManager获取配置Logger
private static Logger logger = LogManager.getLogger("fileLogger");
@Override
public void info(String msg) {
// 输出日志
// 特别注意 不要使用 `+` 去拼接信息, 这样在控制输出级别之后, 有些日志操作不会打印, 但是它去操作了新字符串创建, 使用 `{}` 去代替 `+`
logger.info("info {}", msg);
}
@Override
public void error() {
logger.error("error");
}
@Override
public void warn() {
logger.warn("warn");
}
@Override
public void debug() {
logger.debug("debug");
}
@Override
public void trace() {
logger.trace("trace");
}
}
总结
前面的配置步骤,配置,使用步骤,大概描述了Log4j2的使用.
欢迎评论区指出错误或者探讨相关的问题
转载于:https://blog.51cto.com/11931236/2058708