springboot2.0整合logback日志

阅读数:72 评论数:0

跳转到新版页面

分类

python/Java

正文

一、日志框架的介绍

Spring Boot 2.*默认采用slf4j+logback的形式,slf4j是个通用的日志门面,logback就是个具体的日志框架了。

二、logback的使用

springboot本身内置了日志功能,然而想要输入想要的日志,并且输出到磁盘。

(一)依赖

springboot的pom文件会引一个parent

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>

点进去这个parent,会有这个dependency

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
    </parent>

再点进去

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-logging</artifactId>
      <version>2.0.0.RELEASE</version>
      <scope>compile</scope>
    </dependency>

再点,这些都是原有的日志包,所以,不必再引依赖了,直接用就ok了。

<dependencies>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-to-slf4j</artifactId>
      <version>2.10.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jul-to-slf4j</artifactId>
      <version>1.7.25</version>
      <scope>compile</scope>
    </dependency>

(二)配置

1、官方推荐使用的xml名字的格式是:logback-spring.xml而不是logback.xml,因为带spring后缀的可以使用<springProfile>这个标签。

通过Profile可以针对不同运行时Profile使用不同的日志配置。

2、在resource下创建logback-spring.xml文件。

(1)Logback:logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy

(2)Log4j:log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml

(3)Log4j2: log4j2-spring.xml, log4j2.xml

(4)JDK(Java Util Logging):logging.properties

如果你不想使用上面推荐的名字,可以在application.yml中通过logging.config属性来指定自定义的名字

3、configuration根节点

(1)scan,默认值为true,当配置文件发生改变时,是否重新加载

(2)scanPeriod,设置监测配置文件是否修改的时间间隔,当scan为true时,此属性生效,默认时间单位是ms,默认的时间间隔是1分钟。

(3)debug,默认值为false,是否打印logback内部日志信息,用于实时查看logback运行状态。

4、子节点root

root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性。

level用来设置打印级别,大小写无关,trace->debug->info->warn->error->all->off,默认debug

可以包含零个或多个元素,标识这个appender将会添加到这个logger

<root level="debug">
 <appender-ref ref="console" />
 <appender-ref ref="file" />
</root>

5、子节点<contextName>

每个logger都关联到logger上下文,默认上下文名称为“default",但可以使用设置成其他名字,用于区分不同的应用程序的记录。一旦设置,不能修改,保以通过%contextName来打印日志上下文名称,一般来说我们不用这个属性,可有可无。

6、子节点<property>

用来定义变量值的标签,有两个属性,name和value,其中name的值是变量的名称,value的值是变量定义的值,通过定义的值会被插入到logger上下文件中,定义变量后,可以使用${}来使用变量。

<property name="logback.logdir" value="/Users/inke/dev/log/tomcat"/>
<property name="logback.appname" value="app"/>

7、子节点<appender>

appender用来格式化日志输出节点,有两个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。

(1)%d{HH: mm:ss.SSS} 日志输出时间

(2)%thread 输出日志的进程名字,这个Web应用以及异步任务处理中很有用。

(3)%-5level 日志级别,并且使用5个字符左对齐

(4)%logger{36} 日志输出者的名字

(5)%msg 日志消息

(6)%n 平台的换行符

(7)RollingFileAppender

用于切分文件日志

<appender name="fileInfoLog" 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>${logback.logdir}/info.${logback.appname}.log</File>
 <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
 <FileNamePattern>${logback.logdir}/info.${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>
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
 <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
 <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
 <level>Error</level>
 </filter>
 <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
 如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
 的日志改名为今天的日期。即,<File> 的日志都是当天的。
 -->
 <File>${logback.logdir}/error.${logback.appname}.log</File>
 <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
 <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
 <FileNamePattern>${logback.logdir}/error.${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>

(8)filter

有两种过滤器,分别是LevelFilter和ThresholdFilter。

其中LevelFilter为级别过滤器,根据日志级别进行过滤。其下有三个子节点,level表示过滤的级别,用于配置过滤条件的操作,ACCEPT日志会被立即处理,DENY拒绝输出。

ThresholdFilter为临界过滤器,过滤掉低于临界值的日志。

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>

8、子节点<logger>

用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>

(1)name:用来指定受此logger约束的某一个包或者具体的某一个类。

(2)level:用来设置打印级别,大小写无关。还有一个特殊的值inherited或同义词null,代表强制执行上级的级别,如果未设置此属性,那么当前logger将会继承上级的级别。

(3)additivity:是否向上级logger传递打印信息,默认true。

例子:

<logger name="com.dudu.controller" /> 

没有设置addtivity,默认为true,将此logger的打印信息向上级传递,没有appender,此logger本身不打印任何信息,所以会将日志信息传递给上级,一般为root,再交给root配置好的appender处理。

(4)多环境的日志输出

<configuration>
 ...
 <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
 <springProfile name="test,dev">
 <logger name="com.example.demo.controller" level="DEBUG" additivity="false">
  <appender-ref ref="consoleLog"/>
 </logger>
 </springProfile>
 <!-- 生产环境. -->
 <springProfile name="prod">
 <logger name="com.example.demo.controller" level="INFO" additivity="false">
  <appender-ref ref="consoleLog"/>
 </logger>
 </springProfile>
</configuration>

(5)logger的实际使用有两种情况

第一种是指定level,不指定appender

<root level="info">
    <appender-ref ref="console" />
    <appender-ref ref="file" />
</root>
<logger name="com.baiding.logging.SpringBootLoggingApplicationTests"/>

当SpringBootLoggingApplicationTest执行日志方法时,由此logger转交给root,它本身没有打印任何日志。

第二种是指定了level,指定了appender

<root level="info">
    <appender-ref ref="console" />
    <appender-ref ref="file" />
</root>
<!-- java中的包 -->
<logger name="com.baiding" level="warn" addtivity="false">
    <appender-ref ref="console" />
</logger>

此logger指定了level为warn,additivity为false,不再向上级传递打印信息,若设置了appender-ref属性,但没有设置additivity为false,则com.baiding包下的日志会先在名为console的appender记录一次,之后传递给上级,root又会在名为console和file的appender记录一次,这样就打印了两次了。

完整示例

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" debug="false">
	<property name="application.name" value="module-organizat-configure" />
	<property name="log.path" value="/home/logs" />
	<!--输出到控制台 -->
	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n</pattern>
		</encoder>
	</appender>
	<!-- info级别日志控制 -->
	<appender name="info_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.path}/${application.name}/info.log</file>
		<!-- 是否追加 默认为true -->
		<append>true</append>
		<!-- 滚动策略 日期+大小 策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/${application.name}/%d{yyyy-MM-dd}/info/info-%i.zip</fileNamePattern>
			<!-- 单个日志大小 -->
			<maxFileSize>50MB</maxFileSize>
			<!-- 日志保存周期 -->
			<maxHistory>7</maxHistory>
			<!-- 总大小 -->
			<totalSizeCap>2GB</totalSizeCap>
		</rollingPolicy>
		<!-- 格式化 -->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n</pattern>
		</encoder>
		<!-- 级别过滤 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>INFO</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<!-- warn级别日志控制 -->
	<appender name="warn_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.path}/${application.name}/warn.log</file>
		<!-- 是否追加 默认为true -->
		<append>true</append>
		<!-- 滚动策略 日期+大小 策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/${application.name}/%d{yyyy-MM-dd}/warn/warn-%i.zip</fileNamePattern>
			<!-- 单个日志大小 -->
			<maxFileSize>50MB</maxFileSize>
			<!-- 日志保存周期 -->
			<maxHistory>15</maxHistory>
			<!-- 总大小 -->
			<totalSizeCap>2GB</totalSizeCap>
		</rollingPolicy>
		<!-- 格式化 -->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n</pattern>
		</encoder>
		<!-- 级别过滤 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>WARN</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
	<!-- error级别日志控制 -->
	<appender name="error_file" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<!-- 文件路径 -->
		<file>${log.path}/${application.name}/error.log</file>
		<!-- 是否追加 默认为true -->
		<append>true</append>
		<!-- 滚动策略 日期+大小 策略 -->
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<fileNamePattern>${log.path}/${application.name}/%d{yyyy-MM-dd}/error/error-%i.zip</fileNamePattern>
			<!-- 单个日志大小 -->
			<maxFileSize>50MB</maxFileSize>
			<!-- 日志保存周期 -->
			<maxHistory>15</maxHistory>
			<!-- 总大小 -->
			<totalSizeCap>2GB</totalSizeCap>
		</rollingPolicy>
		<!-- 格式化 -->
		<encoder>
			<pattern>%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n</pattern>
		</encoder>
		<!-- 级别过滤 -->
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
	</appender>
 
	<!-- 特殊处理 -->
	<logger name="org.xnio.nio" level="warn" />
	<logger name="org.springframework" level="warn" />
	<logger name="com.netflix.discovery" level="warn" />
	<logger name="org.module.organizat.configure" level="info" />
 
	<!-- 开发、默认环境 只输出到控制台 -->
	<springProfile name="default,dev">
		<root level="info">
			<appender-ref ref="console" />
		</root>
	</springProfile>
	<!-- 测试环境 输出info及以上日志 -->
	<springProfile name="test">
		<root level="info">
			<appender-ref ref="info_file" />
			<appender-ref ref="warn_file" />
			<appender-ref ref="error_file" />
		</root>
	</springProfile>
	<!-- 正式环境 输出warn及以上日志 -->
	<springProfile name="prod">
		<root level="warn">
			<appender-ref ref="info_file" />
			<appender-ref ref="warn_file" />
			<appender-ref ref="error_file" />
		</root>
	</springProfile>
</configuration>

 




相关推荐

1、Logger.getLogger()和LogFactory.getLog()的区别 (1)Logger.getLogger()是使用log4j的方式记录日志; <p

很多应用程序使用Log4j记录日志,如何使用Kafka实时的收集与存储这些Log4j产生的日志呢?一种方案是使用其他组件(比如Flume,或者自己开发程序)实时监控这些日志文件,然后发送至Kaf

当我们进行web开发的时候总是看到配置的log4j日志在控制台无法显示mybatis的主要是指sql、参数、结果,出现这种问题有两种情况: 情部1:</strong

1、写一个转换器类,继承ClassicConvert package com.cj.log; import ch.q

一、概述 Druid(德鲁伊)是Java语言中的数据库连接池,Spring Boot 2.x默认使用Hikari数据源,虽然HikariCP的速度稍快,但是,Druid能够提供强大的监控和扩展功能。