一、日志使用简介
1、开发中日志使用必要性(这里推荐使用lockback)
- 在开发中不建议使用System.out,因为大量的使用会增加资源的消耗。因为使用System.out是在当前线程执行的,写入文件也是写入完毕之后才继续执行下面的程序。而使用Log工具不但可以控制日志是否输出,怎么输出,它的处理机制是通知写日志(异步的),继续执行后面的代码不必等日志写完。
- springboot提供了一套日志系统,logback是优先的选择。spring-boot默认支持logback,所以无需引用任何以来只需要,配置application.properties即可,如果要功能丰富些,则配置下logback.xml。
注意:application.properties 的优先级高于 logback.xml * - 推荐使用slf4j的logback日志输出,效率更好,同时 LogBack官方建议配合Slf4j使用,这样可以灵活地替换底层日志框架
2、logback,slf4j,log4j之间的关系
- Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog...);
- LogBack和Log4j都是开源日记工具库。LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。
二、logback配置详解
1、Logger、appender及layout
- Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
- Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
- Layout 负责把事件转换成字符串,格式化的日志信息的输出。
2、logger context
- 各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各logger。其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
3、有效级别及级别的继承
- Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root logger 默认级别是 DEBUG。
4、打印方法与基本的选择规则
打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR
三、Springboot默认的日志配置
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化。root logger 默认级别是 DEBUG。
四、Springboot中自定义日志实现
1、配置logback-spring.xml文件(官方优先推荐使用-spring.*的配置方式)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="logPath" value="/data/log/blog/"/>
<property name="blogLogFile" value="blog"/>
<!--Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。 -->
<!--负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名-->
<appender name="BLOGHOME"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/${blogLogFile}.log</file>
<!--指定日志分割策略-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logPath}/${blogLogFile}-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<maxFileSize>300MB</maxFileSize>
<maxHistory>20</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
</appender>
<!--其他-->
<springProfile name="bloglog">
<!-- 日志输出级别LEVEL:选项TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="BLOGHOME"/>
</root>
</springProfile>
</configuration>
2.java中输出
public class Logback {
private static String patter = "blog:{@author}";
private final static Logger logger = LoggerFactory.getLogger(Logback.class);
public static void main(String[] args) {
// logback测试
logger.info(patter.replace("{@author}", "qiuxiaowei"));
}
}
3、结果
19:47:36.154 [main] INFO com.qiu.blog.Logback - blog:qiuxiaowei