前言

​记录应用系统曰志主要有三个原因 记录操作轨迹、监控系统运行状况、回溯系统故障。记录操作行为及操作轨迹数据,可以数据化地分析用户偏好,有助于优化业务逻辑,为用户提供个性化的服务。例如,通过 access.log 记录用户的操作频度和跳转链接,有助于分析用户的后续行为。

​全面有效的日志系统有助于建立完善的应用监控体系,由此工程师可以实时监控系统运行状况,及时预警,避免故障发生。监控系统运行状况,是指对服务器使用状态,如内存、 CPU 等使用情况,应用运行情况 如响应时间 QPS 等交互状态;应用错误信息,如空指针、 SQL 异常等的监控。例如,在 CPU 使用率大于 60%, 四核服务器中load 大于4时发出报警,提醒工程师及时处理,避免发生故障。

​当系统发生线上问题时,完整的现场日志有助于工程师快速定位问题。例如当系统内存溢出时,如果日志系统记录了问题发生现场的堆信息,就可以通过这个曰志分析是什么对象在大量产生并且没有释放内存,回溯系统故障,从而定位问题。

日志规范

推荐日志文件命名方式

推荐的日志文件命名方式为appName_logType_logName.log 其中 logType为日志类型,推荐分类有 stats monitor visit等, logName 为日志描述。这种命名的好处是通过文件名就可以知道曰志文件属于什么应用,什么类型 ,什么目的,也有利于归类查找。例如, mppserver 应用中单独监控时区转换异常的日志文件名定义为mppserver__monitor_timeZoneConvert.log

推荐曰志文件保存时间

代码规约推荐曰志文件至少保存15天,可以根据日志文件的重要程度、文件大小及磁盘空间再自行延长保存时间。

预先判断曰志级别

对DEBUG 、INFO 级别的日志,必须使用条件输出或者使用占位符的方式打印。该约定综合考虑了程序的运行效率和日志打印需求。例如 在某个配置了打印日志级别为WARN 的应用中,如果针对 DEBUG 级别的日志,仅仅在程序中写出 logger.debug(”Processing trade with id:” + id + ” and symbol:"+ symbol);,那么该日志不会被打印但是会执行字符串拼接操作,如果 symbol 是对象 还会执行 toString() 方法

白白浪费了系统资源。如下示例代码为正确的打印日志方式

//使明条件判断形式

if (logger.isDebugEnabled()) {

logger.debug ("Processing trade with id:" + id + "and symlbol:" + symbol) ;

//使用占位符形式

logger.debug ("Processing trade with id: {} and symbol: {}",id, symbol);

避免无效日志打印

生产环境禁止输出 DEBUG 曰志且有选择地输出 INFO日志。使用 INFO、WARN 级别来记录业务行为信息时,一定要控制日志输出量,以免磁盘空间不足。同时要为曰志文件设置合理的生命周期及时清理过期的日志。避免重复打印,务必在日志配置文件中设置 additivity=false

区别对待错误日志

WARN、ERROR 都是与错误有关的日志级别,但不要一发生错误就笼统地输出ERROR 级别日志。 一些业务异常是可以通过引导重试就能恢复正常的,例如用户输入参数错误。在这种情况下,记录日志是为了在用户咨询时可以还原现场,如果输出ERROR 级别就表示一旦出现就需要人为介入,这显然不合理。所以,ERROR只记录系统逻辑错误、异常或者违反重要的业务规则,其他错误都可以归为 WARN级别。

保证记录内容完整

曰志记录的内容包括现场上下文信息与异常堆栈信息,所以打印时需要注意以下两点:

记录异常时一定要输出异常堆栈,例如 logger.error("xxx" +e.getMessage(),e)

曰志中如果输出对象实例,要确保实例类重写了 toString()方法,否则只会输出对象的 hashCode 没有实际意义。

日志框架分类与选择

日志门面(日志的抽象层)

日志实现

JCL(Jakarta Commons Logging)(2014年后不再维护)

jboss-logging (不适合企业项目开发使用)

SLF4J(Simple Logging Facade for java)

Log4j

JUL(java.util.logging)(java.util.logging)(担心被抢市场,推出的)

Log4j2( apache开发的很强大,借了log4j的名,但很多框架未适配上)

Logback(Log4j同一个人开发的新框架,做了重大升级)

日志门面

​门面设计模式是面向对象设计模式中的一种,日志框架采用的就是这种模式,类似JDBC 的设计理念。它只提供一套接口规范,自身不负责日志功能的实现。目的是让使用者不需要关注底层具体是哪个日志库来负责日志打印及具体的使用细节等。目前用得最为广泛的曰志门面有两种 slf4j和commons -logging

日志库

​负责实现日志相关功能,主流日志库有三个,分别为:log4j、log-jdk(java.util.logging.Logger)、logback。logback是最晚出现的,与log4j同一个作者,是log4j的升级版且本身实现了slf4j的接口。

日志适配器

​分为:日志门面适配器(日志库适配slf4j),日志库适配器(slf4j适配日志库)。

日志门面适配器

老工程用的日志库没有实现slf4j接口,如log4j;这时候工程里想使用slf4j+log4j的模式,就额外需要一个适配器(slf4j+log4j12)来解决接口不兼容问题

日志库适配器

老工程直接使用日志库API完成日志打印,要改成业界标准的门面模式(如slf4j+logback),但是老工程代码打印日志地方太多难以改动,这是就需要一个适配器来完成从旧日志库的API到slf4j的路由,这样在不改动原有代码的情况下也能使用slf4j来统一管理日志(如:log4j-over-slf4j),后续自由替换具体日志库也不成问题。

Spring Boot 采用了 slf4j+logback 的组合形式,Spring Boot也提供对JUL、log4j2、Logback提供了默认配置

SpringBoot默认日志配置

新建springboot项目,引入web启动项,其他默认即可

package com.lzy.logdemo.controller;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**

* @Author: Luzy

* @Date: 2020-07-17 10:16

* @Description:

*/

@RequestMapping

@RestController

public class LogController {

private static final Logger logger = LoggerFactory.getLogger(LogController.class);

@GetMapping("/log")

public String logTest1(String name) {

// 由低到高:trace < debug < info < warn < error

//2. Spring Boot默认设定的是 info 级别日志,(日志默认级别也称为root级别)。可修改默认级别日志:logging.level.root=级别名

//3. 可以进行调整日志级别,设定某个级别后,就只打印设定的这个级别及后面高级别的日志信息。没有指定级别的就用SpringBoot默认规定的级别:root级别

//4. 可修改指定包的日志级别:指定某个包下面的所有日志级别:logging.level.包名=级别名

logger.info("------------info--------------{}",name);

logger.error("------------error--------------{}",name);

logger.debug("------------debug--------------{}",name);

logger.trace("------------trace--------------{}",name);

logger.warn("------------warn--------------{}",name);

return "log test..."+name;

}

}

url输入http://localhost:8080/log?name=lzy,控制台输出

修改日志默认配置

修改日志文件生成路径

logging.file.name

logging.file.path

示例

说明

(none)

(none)

只在控制台输出

指定文件名

(none)

demo.log

输出到当前项目根路径下的 demo.log 文件中

(none)

指定目录

logs/log_lzy

输出到当前项目所在磁盘根路径下的/logs/log_lzy目录中的 spring.log 文件中

指定文件名

指定目录

当两个同时指定时,采用的是logging.file.name 指定。推荐使用logging.file.name 设置即可,因为它可自定义文件名

logging:

file:

name: demo.log

# path: logs/log_lzy

修改日志输出格式

logging:

file:

name: demo.log

pattern:

console: '%clr(%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n)'

file: '%d{yyyy-MM-dd HH:mm:ss.SSS} >>> [%thread] >>> %-5level >>> %logger{50} >>> %msg%n'

# path: logs/log_lzy

注意:如上,yml文件中首尾加上单引号可解决识别不了%的问题,properties不需要加

分析日志底层实现

org.springframework.boot

spring-boot-starter-web

spring-boot-starter-web 中引入了 spring-boot-starter 启动器

org.springframework.boot

spring-boot-starter

2.3.1.RELEASE

compile

spring-boot-starter 中引入了 spring-boot-starter-logging 日志启动器

org.springframework.boot

spring-boot-starter-logging

2.3.1.RELEASE

compile

spring-boot-starter-logging 日志启动器 采用的是 logback 日志框架

ch.qos.logback

logback-classic

compile

总结:SpringBoot中默认日志启动器为 spring-boot-starter-logging ,默认采用的是 logback 日志框架

在 spring-boot-2.3.1.RELEASE.jar! \org\springframework\boot\logging\logback\base.xml 做了日志的默认配置

日志文件采用方式为:滚动文件追加器

在下面类中会读取上面xml中配置的信息

如果spring boot的日志功能无法满足我们的需求(比如异步日志记录等),我们可以自已定义的日志配置文件

自定义日志配置

自定义Logback日志配置

在类路径下,存放对应日志框架的自定义配置文件即可;SpringBoot就不会使用它默认的日志配置文件了

Logging System

Customization

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

Log4j2

log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)

logging.properties

logback.xml

%d{yyyy-MM-dd HH:mm:ss.SSS} - [%thread] - %-5level - %logger{50} - %msg%n

${LOG_HOME}/${appName}.log

${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log

30

10MB

%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n

关于logback.xml与logback-spring.xml的说明

logback.xml :是直接就被日志框架加载了。

logback-spring.xml:配置项不会被日志框架直接加载,而是由 SpringBoot 解析日志配置文件

logback.xml加载早于application.properties,所以如果你在logback.xml使用了变量时,而恰好这个变量是写在application.properties时,那么就会获取不到,只要改成logback-spring.xml就可以解决。

官网上说明如下:

因为logback-spring.xml是由 SpringBoot 解析日志配置文件,故可以使用SpringBoot 的 Profifile 特殊配置

logback-spring.xml 使用 Profile 特殊配置

指定运行环境: --spring.profifiles.active=dev

注意

若使用 logback.xml 作为日志配置文件,还指定 Profifile 特殊配置,则会有以下错误,便也证明前面所说logback.xml是直接就被日志框架加载。

更换为log4j2日志实现

修改pom依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-logging

org.springframework.boot

spring-boot-starter-log4j2

配置文件

运行结果如下

补充

若日志配置文件名字随意取得,需要在springboot配置文件yml中指明:

logging:

file:

name: demo.log

pattern:

console: '%clr(%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n)'

file: '%d{yyyy-MM-dd HH:mm:ss.SSS} >>> [%thread] >>> %-5level >>> %logger{50} >>> %msg%n'

# path: logs/log_lzy

config: classpath:logconfig.xml

至此,SpringBoot整合日志已总结完毕,后续若有补充再更新。

springboot日志配输出路径配置_SpringBoot日志配置详解相关推荐

  1. springboot日志配输出路径配置_Spring Boot 日志配置方法(超详细)

    默认日志 Logback : 默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台.在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了. 从上图 ...

  2. 修改Keepalived配置文件位置以及重定向Keepalived日志的输出路径

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. java 某个类 单独输出日志_log4j实现特定功能的日志单独输出到指定的日志文件...

    如何实现按需要,使某个功能的日志单独输出到指定的日志文件呢? 其实只要在现有的log4j基础上稍加配置即可实现这一功能. 1.常用配置如下: #Level log4j.rootLogger = deb ...

  4. 虚拟机2012搭建DNS服务器,Windows Server2012 安装配置DNS服务器方法详解

    Windows Server2012 安装配置DNS服务器方法详解 在云服务器 Windows Server2012 上安装配置DNS服务器方法,安装与配置非常简单,在这里写个完整教程方便大家查询 一 ...

  5. replica文件服务器,MongoDB_mongodb replica set 配置高性能多服务器详解,mongodb的多服务器配置,以前写 - phpStudy...

    mongodb replica set 配置高性能多服务器详解 mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:详解mongodb 主从配置.master-s ...

  6. Win7系统Visual Studio 2013配置OpenCV3.1图文详解

    Win7系统Visual Studio 2013配置OpenCV3.1图文详解 OpenCV3.1对硬件加速和移动开发的支持相对于老版本都有了较大改进,支持新的开发工具,更易于扩展,配置方式也比以前简 ...

  7. pycharm导入python环境是空的_PyCharm导入python项目并配置虚拟环境的教程详解

    PyCharm导入python项目并配置虚拟环境的教程详解 进入PyCharm后,点击File→Open,然后在弹窗中选择需要导入项目的文件夹: 打开了python项目后,需要配置该项目对应的pyth ...

  8. eclipse配置python开发环境_Eclipse中配置python开发环境详解

    Eclipse中配置python开发环境详解 1.下载python安装包.python-2.6.6.msi.并安装. 默认python会安装在C:\Python26下,查看环境变量,如果没有在path ...

  9. java spring mvc 上传_Java Spring MVC 上传下载文件配置及controller方法详解

    下载: 1.在spring-mvc中配置(用于100M以下的文件下载) 下载文件代码 @RequestMapping("/file/{name.rp}") public Respo ...

最新文章

  1. JAVA移慎_谨慎使用Java8的默认方法
  2. DIV同时使用两个class
  3. python整数和浮点数相乘_python中整数除法和浮点数到整数转换之间的区别是什么原因?...
  4. boost::contract模块实现check宏的测试程序
  5. PHP后门新玩法:一款猥琐的PHP后门分析
  6. Firefox常用插件
  7. 读取扫码枪输入_为何超市“扫码枪”这么强?不输密码钱就没了,现在知道还不晚...
  8. 请简述什么是spring的ioc和di_小编Spring是什么、spring容器、IOC和DI
  9. django request对象和HttpResponse对象
  10. FOREACH的遍历
  11. BZOJ4170 极光
  12. 毕设中涉及层次分析法的EXCEL处理步骤
  13. Web前端 Js文件上传类型限制(根据文件头信息判断)
  14. JAVA 图片格式转换 jpg、jpeg、png格式互转
  15. AutoSAR入门到精通讲解 (AppL) 2.1 AutoSAR-CP AppL概述
  16. 2020年7月 leetcode每日一题 C语言版本
  17. 11. JS编程之查找元素在数组中的位置
  18. win10系统自带的日历hover效果
  19. 如何使用Python打开一个TXT文件
  20. pandas中如何选取某几列_Pandas 2:如何在数据集中选取列

热门文章

  1. 作者:男,博士,西南财经大学经济数学学院讲师、硕士生导师
  2. 作者:王学志(1979-),男,中国科学院计算机网络信息中心副研究员
  3. 【Servlet】Servlet显示时间和IP等信息
  4. 洛谷 P5708、P5714、P5720、P5725、P5726、P5732、P5738 题解
  5. 贪心策略构筑“奶牛铁塔”(洛谷P2676题题解,Java语言描述)
  6. 【Python】Python里的复数运算
  7. C++学习笔记系列二
  8. ViewPager做出广告轮播特效
  9. hibernate多对一和一对多关联
  10. 关于虚拟机linux密码的那点事