本章内容
- 日志输出
- 连接mysql及使用JPA
- 使用alibaba.druid
- 开启事务
日志输出
在Spring Boot中默认使用的是slf4j+logback,并且spring boot规定配置文件的命名格式最好是xxx-spring.[xml,yml,properties],这样可以让boot来管理你的配置文件。但如果你坚持自定义命名,boot也可以帮你实现,通过在application.yml里配置logging.config=classpath:mylog-config.xml即可
基本配置
主要包含如下几个元素:
- logging.file,日志文件名称,如果没有配置,默认就是项目的目录下生成一个spring.log的日志文件,默认情况下是10MB切分一个文件。
- logging.path,日志目录,可以是绝对路径,也可骒相对路径,例如:/var/project/logs。
- logging.level,配置日志级别,配置粒度可以到包级别,例如:logging.level.com.xps=INFO意思就是com.xps包下的所有类的日志输出级别都是INFO。logging.level是日志级别的前缀。LEVEL选项包括:TRACE<DEBUG<INFO<WARN<ERROR<FATAL
如上,可以简单的输出日志信息,但如果我们想定义更为复杂的日志,例如我们要自定义日志格式并且不同的环境需要不同的输出内容等等,那么,我们就需要有一个logback-spring.xml的日志配置文件了。
logback日志文件格式
根节点是<configuration>,有以下几个属性:
- scan:默认为true,当为true时,配置文件如果发生改变,将会被重新加载。
- scanPeriod:监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认为毫秒。当scan为true时生效。默认为1分钟。
- debug:默认为false,当为true时将打印出logback内部日志信息,实时查看logback运行状态。
此外,它还有五个子节点
节点一<root>
必选节点,用来指定最基础的日志输出级别,有level属性,默认DEBUG。其它级别还有:TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF。其可以包含多个appender元素。例如:
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="fileInfoLog"/>
</root>
节点二<contextName>
logger上下文,默认的名称是"default",可以使用此节点设置其它名称,用于区分不同应用程序的记录。一旦设置不能修改,使用时,可以通过%contextName来打印日志上下文名称。(此属性不是必须的,可有可无,所以我们一般都不设置它)。
<contextName>my-project</contextName>
节点三<property>
主要用来定义属性键值对的,有name和value两个属性,通过定义的值可以插入到logger上下文中。定义的变量可以使用${}来获取变量。如果value的值通过application.yml传过来,使用springProperty。
<property name="logback.appName" value="app"/>
或者使用:
<springProperty scope="context" name="logAppName" source="log.app-name"/>
节点四<appender>
用来格式化日志输出,有俩个属性name和class,class用来指定哪种输出策略,常用的是控制台输出和文件输出。
控制台输出:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%level] [%class:%line] - %m %n</pattern>
</encoder>
</appender>
<appender name="STDOUT1" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %contextName [%level] [%class:%line] - %m %n</pattern>
</layout>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="STDOUT1"/>
</root>
<configuration>
可以看到有encoder和layout两种标签,它们都可以将事件轮换成格式化的日志,但是一般控制台输出使用layout,文件输出使用encoder。
输出到文件
随着项目的运行时间增长,日志文件也越来越大,所以需要把日志文件切分成多个文件以便于读取分析或复制保存。RollingFileAppender就是用来切分日志文件的:
<appender name="infoLogToFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高,所以我们使用下面的策略,可以避免输出 Error 的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--过滤 Error-->
<level>ERROR</level>
<!--匹配到就禁止-->
<onMatch>DENY</onMatch>
<!--没有匹配到就允许-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。
-->
<File>${logPath}/info.${logAppName}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/info.${logAppName}.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--只保留最近90天的日志-->
<maxHistory>90<