《SpringBoot2从入门到工程实战》第三篇:日志系统

本章介绍SpringBoot体系下的日志使用和处理。

日志,作为一种工程师记录业务工作状态的一种数据,他是如此重要,重要到,如果一个系统,没有好的日志,我们没有办法开展解决bug、调优、跟踪逻辑等很多工作。

他是如此的重要,所以我把SpringBoot的日志系统的使用,放在第三篇来写。

SpringBoot官方是支持Logback、Log4j、Log4j2等多种日志框架的。SpringBoot默认的日志框架为Logback,而且Logback与Log4j同为一个作者开发,架构和各种理念以及各种测试,Logback都会比Log4j更强大和易用,因此我们本章的例子,也使用Logback。

但更重要的是,Logback完整实现了Log4j的接口,包名、函数名基本都兼容,如果你项目中之前使用的是Log4j框架,那么你只需要替换掉基础的jar包和相关的配置,代码完全不用管。。。

本章示例工程名称:springboot_worker_logback

代码地址:https://github.com/stamhe/SpringBoot-Work-Example

目录结构如下:



注:如果没有src/main/resources目录,新建一个就行了。

pom.xml内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.stamhe</groupId>
  <artifactId>springboot_worker_logback</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>springboot_worker_logback</name>
  <url>http://maven.apache.org</url>


	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
	</properties>
  
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

  	<dependencies>
    	<dependency>
        	<groupId>org.springframework.boot</groupId>
        	<artifactId>spring-boot-starter-test</artifactId>
        	<scope>test</scope>
    	</dependency>
    
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	    </dependency>
	    
	    <dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-logging</artifactId>
		</dependency>
    
	    <dependency>
	    	<groupId>junit</groupId>
	      	<artifactId>junit</artifactId>
	      	<scope>test</scope>
	    </dependency>
	</dependencies>

	<!-- 
	使用Spring Boot微服务搭建框架,在eclipse和Idea下能正常运行,但是在打成jar包部署或者直接使用java -jar命令的时候,
	提示了xxxxxx.jar中没有主清单属性.
	添加 spring-boot-maven-plugin然后再执行mvn install 或者 mvn clean package 即可解决.
	-->
	<build>
	  <plugins>
	  	<plugin>
	  		<groupId>org.springframework.boot</groupId>
	 		<artifactId>spring-boot-maven-plugin</artifactId>
	  	</plugin>
	  </plugins>
 	</build>
</project>

新引入了一个 spring-boot-starter-logging 依赖,这个代表 logback,如果想使用log4j或者log4j2,则引入 spring-boot-starter-logging-log4j或者spring-boot-starter-logging-log4j2就行了。

App.java内容:

package com.stamhe.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App 
{
    public static void main( String[] args )
    {
    	SpringApplication.run(App.class, args);
    }
}

跟之前一样。

HelloController.java内容:

package com.stamhe.springboot.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {
	
	private Logger logger = LoggerFactory.getLogger(getClass());

	@RequestMapping("/world")
	public String worldAction()
	{
		logger.trace("trace 日志");
		logger.debug("debug 日志");
		logger.info("info 日志");
		logger.warn("warn 日志");
		logger.error("error 日志");
		return "Hello World";
	}
}

只是多了一个Logger,包名都是org.slf4j下面的,不管你是使用logback还是log4j还是log4j2

logback-spring.xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="60 seconds">
	<!-- http://www.cnblogs.com/lixuwu/p/5804793.html -->
    <!--定义日志文件的存储路径, 注意不要在 LogBack 的配置中使用相对路径-->  
    <property name="LOG_HOME" value="/data/logs/apiservice" />  
    <!-- 控制台输出 -->   
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
             <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度对齐,%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
    </appender>
    
    <!-- 按照每天生成日志文件 -->   
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/springboot_worker_logback_%d{yyyy-MM-dd}.log</FileNamePattern> 
            <!--日志文件保留天数-->
            <MaxHistory>10</MaxHistory>
        </rollingPolicy>   
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度对齐,%msg:日志消息,%n是换行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
        <!--日志文件最大的大小-->
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>100MB</MaxFileSize>
       </triggeringPolicy>
    </appender> 
    
    <springProfile name="prod">
	    <logger name="org.springframework.web" level="INFO" />
	    <logger name="com.stamhe" level="INFO"/>
	    
	    <root level="INFO">
	        <appender-ref ref="STDOUT" />
	        <appender-ref ref="FILE" />
	    </root>
    </springProfile>
    
    
    <springProfile name="dev,test">
	    <logger name="org.springframework.web" level="DEBUG" />
	    <logger name="com.stamhe" level="DEBUG"/>
	    
	    <root level="DEBUG">
	        <appender-ref ref="STDOUT" />
	        <appender-ref ref="FILE" />
	    </root>
    </springProfile>
    
</configuration>

实际项目中,根据需要调整参数,不同环境的log级别,使用springProfile来进行控制。

日志配置文件名称使用logback.xml或者logback-spring.xml都行,但是使用logback-spring.xml可以使用一些SpringBoot的特定参数做控制,所以推荐使用logback-spring.xml做配置文件名称。当然,你也可以自定义参数名称,通过在application.properties中指定就行,如下:

logging.config=classpath:logging-config.xml

application.properties内容:

spring.profiles.active=dev

修改此参数,可以切换项目的工作环境,如dev、test、prod环境,因为不同环境,日志的工作模式会有不一样,可以通过这个来配置。

按我们在第二章的讲解,实际项目中,配置文件和代码仓库都是分离的,所以,很容易通过*.properties来指定不同的环境,然后打包也只需要打包一次,各个环境通用一个jar包。

启动成功后,访问: http://localhost:8080/hello/world 即可得到下面的结果:

浏览器返回:

dev环境

命令行下提示日志:




prod环境

日志文件:/data/logs/apiservice/springboot_worker_logback_2019-03-22.log

dev环境


prod环境

可以看到,通过配置不同的开发环境,日志的输出控制目的已经达到。

日志对于实际的项目来说是如此的重要,建议都要认真了解学习。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

code

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据