说在前面

这里日志分两种。一种是tomcat的输出(系统)日志,一种是自己定义的日志。

系统日志设置

目标

当springboot接收到请求时记录日志到文件中

实现

你只需要在你的绿叶application.properties配置文件中加入一下的配置

  1. system.root.path=D:
  2. server.tomcat.basedir=${system.root.path}/log/tomcat_log
  3. server.tomcat.accesslog.enabled=true
  4. server.tomcat.accesslog.pattern=%t %a "%r" %s %S (%D ms)
  • 1
  • 2
  • 3
  • 4

效果

它就会自动在D:/log/tomcat_log目录下生成所有请求的日志

  1. [26/Jul/2017:15:42:19 +0800] 0:0:0:0:0:0:0:1 "GET /assets/img/nav-expand.png HTTP/1.1" 404 - (72 ms)
  2. [26/Jul/2017:15:42:23 +0800] 0:0:0:0:0:0:0:1 "GET /assets/img/nav-expand.png HTTP/1.1" 404 - (6 ms)
  3. [26/Jul/2017:15:42:24 +0800] 0:0:0:0:0:0:0:1 "GET /view/recommendedSetting HTTP/1.1" 200 - (4 ms)
  4. [26/Jul/2017:15:42:24 +0800] 0:0:0:0:0:0:0:1 "GET /assets/css/bootstrap.css.map HTTP/1.1" 404 - (5 ms)
  5. [26/Jul/2017:15:42:24 +0800] 0:0:0:0:0:0:0:1 "GET /assets/img/nav-expand.png HTTP/1.1" 404 - (6 ms)
  6. [26/Jul/2017:15:42:25 +0800] 0:0:0:0:0:0:0:1 "GET /assets/img/nav-expand.png HTTP/1.1" 404 - (5 ms)
  7. [26/Jul/2017:15:42:26 +0800] 0:0:0:0:0:0:0:1 "GET /view/blank.html HTTP/1.1" 404 - (54 ms)
  8. [26/Jul/2017:15:42:29 +0800] 0:0:0:0:0:0:0:1 "GET /view/blank.html HTTP/1.1" 404 - (7 ms)
  9. [26/Jul/2017:15:42:29 +0800] 0:0:0:0:0:0:0:1 "GET /view/blank.html HTTP/1.1" 404 - (4 ms)
  10. [26/Jul/2017:15:42:30 +0800] 0:0:0:0:0:0:0:1 "GET /view/blank.html HTTP/1.1" 404 - (16 ms)
  11. [26/Jul/2017:15:42:30 +0800] 0:0:0:0:0:0:0:1 "GET /view/blank.html HTTP/1.1" 404 - (4 ms)
  12. [26/Jul/2017:15:42:31 +0800] 0:0:0:0:0:0:0:1 "GET /assets/css/bootstrap.css.map HTTP/1.1" 404 - (4 ms)
  13. [26/Jul/2017:15:42:32 +0800] 0:0:0:0:0:0:0:1 "GET /assets/img/nav-expand.png HTTP/1.1" 404 - (3 ms)
  14. [26/Jul/2017:15:42:33 +0800] 0:0:0:0:0:0:0:1 "GET /view/form_component.html HTTP/1.1" 404 - (9 ms)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

自定义日志设置(logback)

目标

当自己在写业务逻辑代码的时候,需要自己定义输出日志的内容。

实现

  1. resources目录下新建一个文件logback-spring.xml
  2. logback-spring.xml写入以下内容。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration debug="false">
  3. <contextName>Logback For demo Mobile</contextName>
  4. <!-- 设置log日志存放地址 -->
  5. <!--(改) 单环境设置 -->
  6. <property name="LOG_HOME" value="D:/log/tomcat_log" />
  7. <!-- 多环境设置 (如果你需要设置区分 生产环境,测试环境...)-->
  8. <!-- 如果需要设置多环境的配置,只设置以下注释内容是不够的,还需要给每个环境设置对应的配置文件如(application-dev.properties)-->
  9. <!--
  10. <springProfile name="linux">
  11. <property name="LOG_HOME" value="/home/logger/mobile_log" />
  12. </springProfile>
  13. <springProfile name="dev">
  14. <property name="LOG_HOME" value="D:/logger/log4j" />
  15. </springProfile>
  16. <springProfile name="test">
  17. <property name="LOG_HOME" value="D:/logger/log" />
  18. </springProfile>
  19. <springProfile name="prod">
  20. <property name="LOG_HOME" value="D:/logger/log" />
  21. -->
  22. <!-- 控制台输出 -->
  23. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  24. <!-- encoder默认配置为PartternLayoutEncoder -->
  25. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  26. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} -%msg%n</pattern>
  27. </encoder>
  28. <target>System.out</target>
  29. </appender>
  30. <!-- 按照每天生成日志文件 -->
  31. <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  32. <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  33. <!--日志文件输出的文件名 ,每天保存(侧翻)一次 -->
  34. <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.log</FileNamePattern>
  35. <!--日志文件保留天数 -->
  36. <MaxHistory>180</MaxHistory>
  37. </rollingPolicy>
  38. <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
  39. <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{25} -%msg%n</pattern>
  40. </encoder>
  41. <!--日志文件最大的大小 -->
  42. <triggeringPolicy
  43. class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
  44. <MaxFileSize>20MB</MaxFileSize>
  45. </triggeringPolicy>
  46. </appender>
  47. <!-- (改)过滤器,可以指定哪些包,哪个记录到等级, -->
  48. <!-- 运用的场景比如,你只需要com.demo.controller包下的error日志输出。定义好name="com.demo.controller" level="ERROR" 就行了 -->
  49. <logger name="com" level="ERROR">
  50. <appender-ref ref="ROLLING_FILE" />
  51. </logger>
  52. <!-- 全局,控制台遇到INFO及以上级别就进行输出 -->
  53. <root level="INFO">
  54. <appender-ref ref="STDOUT" />
  55. </root>
  56. </configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

3.怎么使用

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. public class ViewController
  4. // 日志记录工具,这些都是包里有的,直接用就行不用其他的实现。后面的类名是本类的类名
  5. private static final Logger log = LoggerFactory.getLogger(ViewController.class);
  6. // 首页
  7. @RequestMapping(value = "/index", method = RequestMethod.GET)
  8. public String index(HttpServletRequest request) {
  9. //这样调用
  10. log.error("自己定义的日志输出异常");
  11. return "index";
  12. }
  13. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

效果

就是在你设置的日志目录里有生成一个文件,里面会有你定义的日志。


扩展(全局异常捕捉,并通过日志输出)

目标

当我们服务器处理请求的时候,可能会产生一些我们没有捕捉到的异常。那么我们需要做的就是,设置全局的异常捕捉,并把异常的内容(堆栈信息)输出到日子文件中。

实现

1.新建一个类文件GlobalExceptionHandler写入以下内容

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3. import org.springframework.web.bind.annotation.ControllerAdvice;
  4. import org.springframework.web.bind.annotation.ExceptionHandler;
  5. import org.springframework.web.bind.annotation.ResponseBody;
  6. import javax.servlet.http.HttpServletRequest;
  7. import java.io.ByteArrayOutputStream;
  8. import java.io.IOException;
  9. /**
  10. * User: Qiu Nick
  11. * Date: 2017-07-26
  12. * Time: 15:49
  13. * Description: 全局异常捕获
  14. */
  15. @ControllerAdvice
  16. public class GlobalExceptionHandler {
  17. // 日志记录工具
  18. private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
  19. @ExceptionHandler(value = Exception.class)
  20. public void handleGlobalException(HttpServletRequest req, Exception ex) {
  21. //打印堆栈日志到日志文件中
  22. ByteArrayOutputStream buf = new ByteArrayOutputStream();
  23. ex.printStackTrace(new java.io.PrintWriter(buf, true));
  24. String expMessage = buf.toString();
  25. try {
  26. buf.close();
  27. } catch (IOException e) {
  28. e.printStackTrace();
  29. }
  30. //记录到日志
  31. log.error("GlobalExceptionHandler,捕获异常:"+ ex.getMessage() + ";eString:" + expMessage);
  32. }
  33. }

1

  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

效果

通过打印的日志你就能定位到出现错误的地方,非常方便。(这里模拟了一个除0的异常-ViewController.java:72)

  1. ===2017-07-26 16:43:45.018 ERROR com.demo.config.GlobalExceptionHandler Line:46 - GlobalExceptionHandler,捕获异常:/ by zero;eString:java.lang.ArithmeticException: / by zero
  2. at com.truesun.controller.ViewController.slideshowSetting(ViewController.java:72)
  3. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  5. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  6. at java.lang.reflect.Method.invoke(Method.java:498)
  7. at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
  8. at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
  9. at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
  10. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
  11. at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
  12. at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
  13. at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
  14. at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
  15. at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
  16. at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
  17. at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
  18. at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
  19. at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
  20. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
  21. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  22. at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
  23. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  24. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  25. at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
  26. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  27. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  28. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  29. at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
  30. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  31. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  32. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  33. at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
  34. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  35. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  36. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  37. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
  38. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
  39. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  40. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  41. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
  42. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  43. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
  44. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
  45. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
  46. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
  47. at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
  48. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
  49. at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
  50. at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  51. at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
  52. at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
  53. at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  54. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  55. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  56. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  57. at java.lang.Thread.run(Thread.java:748)

Spring Boot全日志设置的更多相关文章

  1. Spring Boot—16日志设置

    application.properties # server.address=0.0.0.0 server.port=8080 server.servlet.context-path=/test s ...

  2. Spring Boot默认日志logback配置解析

    前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...

  3. Spring Boot 之日志记录

    Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, ...

  4. Spring Boot系列——日志配置

    日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生 ...

  5. 【spring boot】8.spring boot的日志框架logback使用

    在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...

  6. 自定义的Spring Boot starter如何设置自动配置注解

    本文首发于个人网站: 在Spring Boot实战之定制自己的starter一文最后提到,触发Spring Boot的配置过程有两种方法: spring.factories:由Spring Boot触 ...

  7. Spring Boot 自定义日志详解

    本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...

  8. [Java] Spring boot 的maven设置阿里云仓库

    Spring boot 的maven设置阿里云仓库 打开根目录下的 pom.xml 文件,在对应为止出加入如下 红色 代码: <build> <plugins> <plu ...

  9. Spring Boot与日志

    目录 1.日志框架 2.市面上的日志框架 2.1 下表行间无任何对应关系 2.2 日志门面:slf4j 2.3 日志实现:logback 2.4 Spring Boot怎么做的呢? 3.slf4j的使 ...

随机推荐

  1. 【权值分块】bzoj1503 [NOI2004]郁闷的出纳员

    权值分块,离散化非常蛋疼,只能离散化搞…… 需要支持操作:删除<=某个值得所有权值==打标记 O(sqrt(n)) 码长和我的平衡树差不多……速度快3倍左右. #include<cstdi ...

  2. 查看Java代码对应的汇编指令又一利器,JITWatch 转

    http://www.tuicool.com/articles/IRrIRb3 时间 2015-05-13 08:00:00  Liuxinglanyue's Blog 原文  http://java ...

  3. csharp 面向对象编程

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shap ...

  4. C++发送HTTP请求---亲测可行(转)

    转自:http://hi.baidu.com/benbearlove/item/1671c23017575825b3c0c53f 环境:xp sp3,vs2008,在静态库中使用 MFC #inclu ...

  5. webpack配置:增加babel支持、打包后调试

    一.babel支持 Babel其实是几个模块化的包,其核心功能位于称为babel-core的npm包中,webpack可以把其不同的包整合在一起使用,对于每一个你需要的功能或拓展,你都需要安装单独的包 ...

  6. Java笔记2:Eclipse编写第一个Java程序

    1 下载并安装jdk 2 下载较新版本的eclipse,eclipse都是非安装版的,解压缩即可. 3 双击eclipse.exe,打开elipse软件 4 FileàNewàProject 5 选择 ...

  7. 【机器学习 & 数据挖掘 通俗介绍】

    如何向小白介绍何谓机器学习和数据挖掘?买回芒果他就懂了 JasonZheng • 2013-01-07 22:18   买芒果 嘴馋的你想吃芒果了,于是你走到水果摊,挑了几个让老板过过秤,然后你再根据 ...

  8. 倍福TwinCAT(贝福Beckhoff)基础教程7.1 TwinCAT如何简单执行NC功能块 TC2

    TC2的程序是在TC3的基础上稍作调整,只说明不同点,请先看TC3的. TC2中的一个原本是AXIS_REF类型变量被拆成了两个(PLCTONC_AXLESTRUCT和NCTOPLC_AXLESTRU ...

  9. There is insufficient memory for the Java Runtime Environment to continue问题解决

    在linux系统下长时间进行性能測试,连续几次发生server假死无法连接上的情况,无奈仅仅能重新启动server.在測试路径下发现hs_err_pid17285.log文件,打开文件查看其主要内容例 ...

  10. Excel 将换行符替换为空

          Step1:按快捷键Ctrl+H,打开"查找和替换"对话框:     Step2:选择"查找内容"后的文本框,按住Alt键,在数字键盘中输入&quo ...