springboot日志配置及输出

新建一个springboot项目
目录如下:
这里写图片描述

建立一个全局异常处理类:GlobalExceptionHandler

package com.hll.demo.handler;

import...

import com.hll.demo.exception.MyException;
import com.hll.demo.model.JsonResult;

/**
 * 异常处理拦截器
 * @author hll
 * @date 2018年5月25日
 */
@CrossOrigin
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    private static final String logExceptionFormat = "Capture Exception By GlobalExceptionHandler: Code: %s Detail: %s";

    private static Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    //运行时异常
    @ExceptionHandler(RuntimeException.class)
    public String runtimeExceptionHandler(RuntimeException ex) {
        return exceptionFormat(1, ex);
    }

    //空指针异常    
    @ExceptionHandler(NullPointerException.class)  
    public String nullPointerExceptionHandler(NullPointerException ex) {  
        return exceptionFormat(2, ex);  
    }  

    //类型转换异常    
    @ExceptionHandler(ClassCastException.class)  
    public String classCastExceptionHandler(ClassCastException ex) {  
        return exceptionFormat(3, ex);  
    }  

    //IO异常    
    @ExceptionHandler(IOException.class)  
    public String iOExceptionHandler(IOException ex) {  
        return exceptionFormat(4, ex);  
    }  

    //未知方法异常    
    @ExceptionHandler(NoSuchMethodException.class)  
    public String noSuchMethodExceptionHandler(NoSuchMethodException ex) {  
        return exceptionFormat(5, ex);  
    }  

    //数组越界异常    
    @ExceptionHandler(IndexOutOfBoundsException.class)  
    public String indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException ex) {  
        return exceptionFormat(6, ex);  
    }  

    //400错误    
    @ExceptionHandler({HttpMessageNotReadableException.class})  
    public String requestNotReadable(HttpMessageNotReadableException ex) {  
        System.out.println("400..requestNotReadable");  
        return exceptionFormat(7, ex);  
    }  

    //400错误    
    @ExceptionHandler({TypeMismatchException.class})  
    public String requestTypeMismatch(TypeMismatchException ex) {  
        System.out.println("400..TypeMismatchException");  
        return exceptionFormat(8, ex);  
    }  

    //400错误    
    @ExceptionHandler({MissingServletRequestParameterException.class})  
    public String requestMissingServletRequest(MissingServletRequestParameterException ex) {  
        System.out.println("400..MissingServletRequest");  
        return exceptionFormat(9, ex);  
    }  

    //405错误    
    @ExceptionHandler({HttpRequestMethodNotSupportedException.class})  
    public String request405(HttpRequestMethodNotSupportedException ex) {  
        return exceptionFormat(10, ex);  
    }  

    //406错误    
    @ExceptionHandler({HttpMediaTypeNotAcceptableException.class})  
    public String request406(HttpMediaTypeNotAcceptableException ex) {  
        System.out.println("406...");  
        return exceptionFormat(11, ex);  
    }  

    //500错误    
    @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})  
    public String server500(RuntimeException ex) {  
        System.out.println("500...");  
        return exceptionFormat(12, ex);  
    }  

    //栈溢出  
    @ExceptionHandler({StackOverflowError.class})  
    public String requestStackOverflow(StackOverflowError ex) {  
        return exceptionFormat(13, ex);  
    }  

    //其他错误  
    @ExceptionHandler({Exception.class})  
    public String exception(Exception ex) {  
        return exceptionFormat(14, ex);  
    }

    //自定义异常捕获
    @ExceptionHandler({MyException.class})
    public String myException(MyException ex) {
        System.out.println("1111111111111111111");
        return exceptionFormat(999, ex);
    }

    private <T extends Throwable> String exceptionFormat(Integer code, T ex) {  
        log.error(String.format(logExceptionFormat, code, ex.getMessage()));  
        return JsonResult.failed(code, ex.getMessage());  
    }
}

建立JsonResult:
@Data 注解是 Lombok 项目的注解,不用手动的去添加setter,getter

package com.hll.demo.model;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSON;

import lombok.Data;

@Data
public class JsonResult {

    private int code;   //返回码 非0即失败  
    private String msg; //消息提示  
    private Map<String, Object> data; //返回的数据  

    public JsonResult(){};  

    public JsonResult(int code, String msg, Map<String, Object> data) {  
        this.code = code;  
        this.msg = msg;  
        this.data = data;  
    }  

    public static String success() {  
        return success(new HashMap<>(0));  
    }  
    public static String success(Map<String, Object> data) {  
        return JSON.toJSONString(new JsonResult(0, "解析成功", data));  
    }  

    public static String failed() {  
        return failed("解析失败");  
    }  
    public static String failed(String msg) {  
        return failed(-1, msg);  
    }  
    public static String failed(int code, String msg) {  
        return JSON.toJSONString(new JsonResult(code, msg, new HashMap<>(0)));  
    }
}

自定义一个自己的异常类:MyException

package com.hll.demo.exception;

/**
 * 自定义异常
 * @author hll
 * @date 2018年5月25日
 */
public class MyException extends Exception {

    private static final long serialVersionUID = 1L;

    private String code;
    private String msg;

    public MyException() {}

    public MyException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

}

application.yml配置

#引入日志配置文件
#=====================================  log  =============================
logging:
  config: classpath:logback-boot.xml

log配置文件

<configuration>
    <!-- %m输出的信息, %p日志级别, %t线程名, %d日期, %c类的全名, %i索引 -->
    <!-- appender是configuration的子节点,是负责写日志的组件 -->
    <!-- ConsoleAppender把日志输出到控制台 -->
<!--    <property name="CONSOLE_LOG_PATTERN" -->
<!--               value="%date{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/> -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!--<pattern>${CONSOLE_LOG_PATTERN}</pattern> -->
            <pattern>%date{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) (%file:%line\)- %m%n</pattern>
            <!-- 控制台也要使用utf-8,不要使用gbk -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 -->
    <!-- 1.先按日期存日志,日期变了,将前一天的日志文件名重命名为xxx%日期%索引,新的日志仍然是sys.log -->
    <!-- 2.如果日期没有变化,但是当前日志文件的大小超过1kb时,对当前日志进行分割 重名名 -->
    <appender name="syslog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${catalina.base}/mylog/sys.log</File>
        <!-- rollingPolicy:当发生滚动时,决定 RollingFileAppender 的行为,涉及文件移动和重命名。 -->  
        <!-- TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 活动文件的名字会根据fileNamePattern的值,每隔一段时间改变一次 -->  
            <!-- 文件名:log/sys.2017-12-05.0.log -->
            <fileNamePattern>${catalina.base}/mylog/sys.%d.%i.log</fileNamePattern>
            <!-- 每产生一个日志文件,该日志文件的保存期限为30天 -->
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">      
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->    
                <maxFileSize>1KB</maxFileSize>      
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>      
            <!-- pattern节点,用来设置日志的输入格式 -->  
            <pattern>      
                %d %p (%file:%line\)- %m%n    
            </pattern>      
            <!-- 记录日志的编码 -->  
            <charset>UTF-8</charset> <!-- 此处设置字符集 -->     
        </encoder>
    </appender>
    <!-- 控制台日志输出级别 -->
    <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 指定项目中某个包,当有日志操作行为时的日志记录级别 -->  
    <!-- com.appley为根包,也就是只要是发生在这个根包下面的所有日志操作行为的权限都是DEBUG -->  
    <!-- 级别依次为【从高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->  
    <logger name="com.hll.demo" level="DEBUG">      
        <appender-ref ref="syslog" />      
    </logger>
</configuration>

开始测试:LogTestController

package com.hll.demo.controller;

import java.util.HashMap;

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

import com.hll.demo.exception.MyException;
import com.hll.demo.model.JsonResult;

/**
 * 日志测试controller
 * @author hll
 * @date 2018年5月26日
 */
@RestController
public class LogTestController {

    protected static Logger logger = LoggerFactory.getLogger(LogTestController.class);

    @RequestMapping("/logtest")
    public JsonResult Test(@RequestParam(value = "role") Integer role) throws Exception {
        logger.info("访问了controller");
        int i = role;

        //Exception异常会自动拦截,这里只是做个测试自定义异常
        if (i<0) {
            //int j = i / 0;
            throw new MyException("999", "异常");
        } else {
            return new JsonResult(200, "成功", new HashMap<>(0));
        }
    }
}

打开浏览器输入地址:http://localhost:8080/demo/logtest
在tomcat路径下,会有mylog文件夹,查看里面的日志会看到下面的信息,该Controller有个必填的请求参数,如果没写就会有Required Integer parameter ‘role’ is not present
这里写图片描述
在tomcat路径下,会有mylog文件夹,查看里面的日志会看到下面的信息

打开浏览器输入地址:http://localhost:8080/demo/logtest?role=-1
接着测试,role为-1时就会进自定义异常
这里写图片描述

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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.hll</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <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-jta-narayana</artifactId>
        </dependency>
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

项目中的ServletInitializer类,springboot本身是直接通过main方法启动自带的tomcat运行项目的。如果想通过自己的tomcat启动springboot项目。建立一个ServletInitializer类:
然后就可以和普通的web项目一样启动起来了。

package com.hll.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;

/**
 * @author hll
 * @date 2018年6月15日
 */
public class ServletInitializer extends SpringBootServletInitializer{

    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(DemoApplication.class);
    }
}

猜你喜欢

转载自blog.csdn.net/sinat_33151213/article/details/80805276