日志可以记录我们应用程序的运行情况,我们可以通过日志信息去获取应用程序更多的信息。常用处理java日志的组件有:slf4j、log4j、logback、common-logging等。其中log4j是使用得最多的日志组件。

而LogBack是基于Log4j基础上大量改良的一种日志框架,但是它不能单独使用,推荐配合日志框架SLF4J来使用。

LogBack当前分成三个模块:logback-core、logback-classic和logback-access;其中logback-core是其它两个模块的基础,就像spring框架里的spring-core一样。


Logback的核心对象

  • Logger:日志记录器
  • Appender:指定日志输出的目的地,目的地可以是控制台,文件
  • Layout:日志布局,指定日志信息的输出的格式

日志级别

  • DEBUG
  • INFO
  • WARN
  • ERROR

DEBUG < INFO < WARN < ERROR

我们一般不会去选择DEBUG级别,因为DEBUG级别会输出很多信息,包括一些无用的信息。


Log4j转换到LogBack

因为目前使用得最广泛的还是Log4j,要想转换到LogBack,可以使用这个转换工具

比方说我们现在有一个log4j.properties文件。

### 设置日志记录器###
log4j.rootLogger = debug,stdout,D,E ### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n ### 输出DEBUG 级别以上的日志到=D://logs/error.log文件里 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 输出ERROR 级别以上的日志到=D://logs/error.log文件里 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =E://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

使用上面的转换工具可以快速的将log4j.properties转换为logback.xml格式的文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration> <!--输出到控制台 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.out</Target>
<!--encoder即layout布局 -->
<encoder>
<pattern>[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n</pattern>
</encoder>
</appender> <!--将DEBUG级别的日志输出到文件 -->
<appender name="D" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Append>true</Append>
<File>D://logs/log.log</File>
<encoder>
<pattern>%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
</appender> <!--将ERROR级别的日志输出到文件 -->
<appender name="E" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>E://logs/error.log</File>
<Append>true</Append>
<encoder>
<pattern>%-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender> <!--日志记录器 -->
<root level="debug">
<appender-ref ref="stdout"/>
<appender-ref ref="D"/>
<appender-ref ref="E"/>
</root>
</configuration>

可以看到转换前后的各个元素是相互对应的


SpringBoot整合LogBack

SpringBoot官方文档里面说:

There are a lot of logging frameworks available for Java. Do not worry if the above list seems confusing. Generally, you do not need to change your logging dependencies and the Spring Boot defaults work just fine

大致意思就是,SpringBoot整合了许多的日志框架,你可能不知道的到底应该选用哪个,但是SpringBoot为你考虑了,就用它默认的配置就OK,而它默认使用的就是LogBack。

1.1、日志格式(Log Format)

SpringBoot默认输出的日志格式是这样的。

2014-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms
2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

下面从左边开始依次做说明:

  • 日志产生的时间,精确到毫秒
  • 日志级别
  • PID:进程ID
  • 输出日志的线程名
  • 输出日志的完成类名
  • 详细信息

SpringBoot启动默认输出的 [INFO] 级别。

1.2、自定义日志格式

使用Log4j日志框架时,我们创建的是 log4j.properties 文件。现在SpringBoot默认使用的是LogBack框架,官方建议日志配置文件取名为 logback-spring.xml。

下面是随意写的一个日志的配置文件:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</layout>
</appender> <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</encoder>
<!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 输出路径 -->
<fileNamePattern>app_log/log/app.info.%d.log</fileNamePattern>
</rollingPolicy>
</appender> <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>
%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n
</pattern>
</encoder> <!-- 设置滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 路径 -->
<fileNamePattern>app_log/log/app.err.%d.log</fileNamePattern> <!-- 控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,
<maxHistory> 是1,则只保存最近1个月的文件,删除之前的旧文件 -->
<MaxHistory>1</MaxHistory>
</rollingPolicy>
</appender>
<!--注意这个节点要写在最后 -->
<root level="INFO">
<appender-ref ref="consoleApp"/>
<appender-ref ref="fileInfoApp"/>
<appender-ref ref="fileErrorApp"/>
</root>
</configuration>

< root level="INFO" > 的意思是,SpringBoot会输出INFO级别以上的日志信息。

下面我们来测试一下。

@RestController
public class LogBackTest {
//注意Logger和LoggerFactory类都是org.slf4j包里的。
private Logger logger = LoggerFactory.getLogger(this.getClass()); @RequestMapping("/log")
public String testLog(){
logger.debug("this is debug level");
logger.info("this is info level");
logger.error("this is error level");
logger.warn("this is warn level");
return "sussecc";
}
}

访问localhost:8080/log。控制台输出了三行自定义的日志:

2018-06-13 16:44:44.648 INFO [http-nio-8080-exec-3]com.example.demo.controller.LogBackTest.testLog:16 -this is info level
2018-06-13 16:44:44.649 ERROR[http-nio-8080-exec-3]com.example.demo.controller.LogBackTest.testLog:17 -this is error level
2018-06-13 16:44:44.651 WARN [http-nio-8080-exec-3]com.example.demo.controller.LogBackTest.testLog:18 -this is warn level

没有DEBUG级别的日志,是因为在日志配置文件中我们设置的是< root level="INFO" >

下面看日志信息输出到文件里的情况:

在app.err.2018-06-13.log文件中只有ERROR级别的信息,这是因为这个文件对应的appender中我们使用的的Filter是ch.qos.logback.classic.filter.ThresholdFilter

其中<level>ERROR</level>,意思是只接收ERROR级别的日志信息写入。

在app.info.2018-06-13.log文件中只有INFO和WARN级别的信息,这是因为虽然在文件对应的appender中我们使用的Filter是ch.qos.logback.classic.filter.LevelFilter,其中过滤规则是:

<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>

意思是只接收除了ERROR级别外的日志文件。当然不包括DEBUG级别,因为我们一开始在<root>节点里就没有让DEBUG级别的日志信息输出。

以上就是SpringBoot里使用LogBack的大致思路,更多的资料可以查阅SpringBoot的官方文档

SpringBoot整合日志框架LogBack的更多相关文章

  1. 【SpringBoot】整合日志框架

    一.日志框架概述 1.1 日志框架的产生 1.2 市面上的日志框架 二.SLF4j 使用与整合 2.1 如何在系统中使用SLF4j 2.2 如何整合日志框架 2.3 SpringBoot中的日志关系 ...

  2. SpringBoot整合日志log4j2

    SpringBoot整合日志log4j2 一个项目框架中日志都是必不可少的,随着技术的更新迭代,SpringBoot被越来越多的企业所采用.这里简单说说SpringBoot整合log2j2日志. 一. ...

  3. SpringBoot与日志框架2(日志内斗)

    一.SpringBoot如何引入slf4j+logback框架的呢? 在POM文件中 <dependency> <groupId>org.springframework.boo ...

  4. SpringBoot与日志框架1(基本使用)

    一.日志框架 1.无论在什么系统,日志框架都是一个重要角色,所以理解和用好日志框架是相当重要的:像JDBC一样,日志框架分为接口层的门面和具体的实现组成. 2.市面上的产品: 2.1门面:SLF4J( ...

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

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

  6. SpringBoot整合日志

    Java日志 日志的接口层.抽象层 日志的实现 JCL(Jakarta Commons Logging) SLF4J(Simple Logging Facade for Java) Jboss-Log ...

  7. SpringBoot日记——日志框架篇

    在项目的开发中,日志是必不可少的一个记录事件的组件,所以也会相应的在项目中实现和构建我们所需要的日志框架. 而市面上常见的日志框架有很多,比如:JCL.SLF4J.Jboss-logging.jUL. ...

  8. 为什么要用日志框架 Logback 基本使用

    [日志框架]以时间为单位描述应用项目运行状态:用户下线.接口超时.数据库崩溃等等一系列事件 [日志框架能力] 1.定制输出格式 2.定制输出目标 3.携带 Context 比如 HelloWorld. ...

  9. 初探日志框架Logback

    一. 背景 最近因为学习项目时需要使用logback日志框架来打印日志, 使用过程中碰到很多的疑惑, 而且需要在控制台打印mybatis执行的sql语句, 于是决定沉下心来 研究一下logback的使 ...

随机推荐

  1. Android 如何检索Android设备的唯一ID

    关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...

  2. c语言学习笔记(7)——数组

    一.为什么需要数组1.为了解决大量同类型的数据存储和使用2.为了模拟现实世界二.数组的分类1.一维数组为n个变量连续分配存储空间所有的变量数据类型必须相同所有变量所占的字节大小必须相等初始化:完全初始 ...

  3. 右键计算机->属性->高级系统设置->高级->环境变量,添加环境变量(推荐)

    (1)右键计算机->属性->高级系统设置->高级->环境变量,添加环境变量(推荐) QTDIR:D:\Software\Qt\Qt5.2.0\5.2.0\msvc2010_op ...

  4. kendo ui gird温馨提示(使用本地数据) 一个

    加入js引用 <link href="http://cdn.kendostatic.com/2014.2.716/styles/kendo.common.min.css" r ...

  5. SecureCRT下载/注册/安装镜像文件

    #$language = "VBScript" #$interface = "1.0" ' This automatically generated scrip ...

  6. JAVASCRIPT高程笔记-------JSON与AJAX

    json对象——语法 简单值:与JS相同语法,可以是字符串,数值,布尔值,null:但不支持undefined 对象: 复杂数据类型,表示一组有序的键值对,键值对的值可以是简单数据,也可以是复杂数据 ...

  7. 通通玩blend美工(7)——简约而不简单的块

    原文:通通玩blend美工(7)--简约而不简单的块 最近在研发一个WPF快速开发框架,满脑子都是各种逻辑各种模式,写一篇比较休闲娱乐的博客,宣泄下我对美工的热爱. 我一直以来有意无意在手机应用或者各 ...

  8. MVC 自动装配

    //HelloController.cs using FirstMVC.Models; using System;using System.Collections.Generic;using Syst ...

  9. 关于在.Net开发中使用Sqlite的版本选择问题

    原文:关于在.Net开发中使用Sqlite的版本选择问题 如果一个.NET应用要自适应32位/64位系统,只需要在项目的“目标平台”设置为“Any CPU”.但是如果应用中使用了SQLite,情况就不 ...

  10. 图像滤镜艺术---Photoshop实现Instagram之Sierra滤镜

    原文:图像滤镜艺术---Photoshop实现Instagram之Sierra滤镜 本文介绍PS实现Instagram中的Sierra滤镜,内容如下: 先看下效果图: 下面是具体实现步骤: 1. To ...