一、Logback简介

Logback是由log4j创始人设计的又一个开源日志组件。

1、logback当前分成三个模块:logback-core,logback- classic和logback-access。

1)logback-core是其它两个模块的基础模块。

2)logback-classic是log4j的一个改良版本,完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。

3)logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

2、Logback是要与SLF4J结合起来用两个组件的官方网站如下:

logback的官方网站: http://logback.qos.ch

SLF4J的官方网站:http://www.slf4j.org

3、用到的jar包(原文写于2011年,jar内容和pom内容可能有所变化)

logback-access-1.0.0.jar(这个可以不用)

logback-classic-1.0.0.jar

logback-core-1.0.0.jar

slf4j-api-1.6.0.jar

POM:

<!-- logback+slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.6.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>0.9.28</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>0.9.28</version>
<type>jar</type>
</dependency>

二、Logback的配置介绍

1、logger、appender以及layout

logger:作为日志的记录器,把它关联到应用的对应的context后,主要用于存放日志对象,也可以定义日志类型、级别。

appender:主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、MySQL、PostreSQL、

Oracle和其他数据库、JMS和远程UNIX Syslog守护进程等。

layout:负责把事件转换成字符串,格式化日志信息的输出

2、logger context

各个logger都被关联到一个loggerContext中,loggerContext负责制造logger,也负责以树结构排列个logger。

logger的取得:通过org.slf4j.LoggerFactory的getLogger()方法取得,getLogger()方法有两种实现形式,getLogger(Class obj)方式是通过传入一个类的形式来进行logger对象和类的绑定;getLogger(String name)方式是通过传入一个contextName的形式来指定一个logger,用同一个名字调用该方法获取的永远都是同一个logger对象的引用。

3、logger级别及继承

logger可以被分配级别,级别包括:TRACE<DEBUG<INFO<WARN<ERROR,定义于ch.qos.logback.classic.Level类中。

如果logger没有被分配级别,name它将从有被分配级别的最近的父类那里继承级别,root logger默认级别是DEBUG。

4、打印方法及基本的选择规则

打印方法决定记录请求的类别。例如,如果L是一个logger实例,那么logger.info("...")表明这是一条级别为INFO的记录请求。记录请求

级别在高于或等于其logger的有效级别时为启用,否则为禁用。只有在请求级别大于有效级别时,该请求才会被执行。

级别的排序为:TRACE<DEBUG<INFO<WARN<ERROR。

5、logback的默认配置

Logback默认配置步骤

(1) 尝试在classpath下查找文件logback-test.xml

(2) 如果文件不存在,则查找文件logback.xml

(3) 如果两个文件都不存在,则用BasicConfigurator自动对自己进行配置,把记录输出到控制台

输出模式:%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n

输出模式解释:时间日期格式-调用的线程-日志界别-调用对象-日志信息-换行

三、logback配置文件示例

1、常用配置详解

(1)根节点<configuration>,其下包含以下三个属性

scan:此属性为true时,配置文件如果发生改变,将会重新加载,默认值为true。

scanPeriod:设置监测配置文件是否有修改的时间间隔,当scan为true时,该属性生效。默认的时间间隔为1分钟。在设置

时,如果没有指定时间单位,默认时间单位是毫秒。

debug:当此属性为true时,将打印出logback内部日志信息,实时查看logback运行状态。

示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false">

<!-- 其他配置信息 -->

</configuration>

(2)子节点<contextName>用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。可以用<contextName>

其他名称来区分不同应用程序的记录,一旦设置,不能修改。

示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <contextName>myName</contextName>

</configuration>

(3)子节点<property>用来定义变量值,通过该标签定义的值会被插入到logger上下文中,可以用"${变量的name}"来取得变量的值,其下

有两个属性:name表示变量的名称,每一个变量有一个唯一的名称;value表示变量的值,不同的变量可以有相同的值。

示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <property name="pName" value="pValue" />

    <contextName>${pName}</contextName>

</configuration>

这样我们的contextName就是我们上面定义的变量的值了。

(4)子节点<timestamp>用于获取时间戳字符串,有两个基本属性:key用来标识此<timestamp>的名字,datePattern设置当前时间转化

为字符串的模式,遵循java.txt.SimpleDateFormat的格式。

示例:

<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <property name="pName" value="pValue" />

    <contextName>${pName}</contextName>

    <timestamp name="stampName" datePattern="yyyy-MM-dd"/>

</configuration>

(5)子节点<appender>用于配置写日志的组件,有两个必要属性:name用于指定appender的名称,每一个appender的名称

唯一,class指定appender的全限定名。appender有三种类型,分别是:ConsoleAppender、FileAppender、RollingFileAppender,

ConsoleAppender是把日志输出到控制台,FileAppender是把日志添加到文件,而RollingFileAppender是把日志输出到文件并且定期

进行清理。三种类型需要配置的子节点如下:

1)ConsoleAppender

i.<encoder>用于对日志的格式进行格式化

ii.<target>字符串System.out(默认)或者System.err()

2)FileAppender

i.<file>用于指定文件的输出路径

ii.<append>用于设置日志是否追加到文件结尾,如果是false则清空现存文件,如果为true则直接追加到文件结尾

iii.<encoder>用于对日志的格式进行格式化

iv.<prudent>用于多线程,保障日志会被安全的写入文件,效率低,默认为false

3)RollingFileAppender

i.<file>用于指定文件的输出路径

ii.<append>用于设置日志是否追加到文件结尾,如果是false则清空现存文件,如果为true则直接追加到文件结尾

iii.<rollingPolicy>用于设置滚动策略,涉及文件移动和重命名。最常用的滚动策略是:ch.qos.logback.core.rolling.TimeBasedRollingPolicy,

该策略根据时间来指定滚动策略,其下有两个子节点:

a.<fileNamePattern>用于格式化根据时间滚动的日志的名称

b.<maxHistory>用于设置日志的清理周期,超出数量就删除最旧的那个文件

(6)子节点<logger>用于设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。<logger>有三个属性:name用来指定受此logger

约束的某一个包或某一个具体的类;level用来设置打印级别,大小写无关;addtivity用于设置是否向上一级logger传递打印信息。

(7)子节点<root>是所有logger的上级,只有一个level属性,level属性用来设置打印级别,除了普通的打印级别外,还支持ALL和OFF,不能设置为

INHERITED或者同义词NULL。默认是DEBUG。

2.配置文件示例

1)

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="c:/log" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<Encoding>UTF-8</Encoding>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Encoding>UTF-8</Encoding>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/myApp.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" /> <!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root> <!--日志异步到数据库 -->
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<!--日志异步到数据库 -->
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
<!--连接池 -->
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>

2)

<?xml version="1.0" encoding="UTF-8"?>
<!-- scan属性未true时,如果配置文档发生改变将会进行重新加载 -->
<!-- scanPeriod属性设置监测配置文件修改的时间间隔,默认单位为毫秒,在scan为true时才生效 -->
<!-- debug属性如果为true时,会打印出logback内部的日志信息 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义参数常量 -->
<!-- 日志级别:TRACE<DEBUG<INFO<WARN<ERROR,其中常用的是DEBUG、INFO和ERROR -->
<property name="log.level" value="debug" /> <!-- 文件保留时间 -->
<property name="log.maxHistory" value="30" /> <!-- 日志存储路径 -->
<property name="log.filePath" value="${catalina.base}/logs/webapps" /> <!-- 日志的显式格式 -->
<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}-%msg%n"></property> <!-- 用于说明输出介质,此处说明控制台输出 -->
<appender name="consoleAppender"
class="ch.qos.logback.core.ConsoleAppender"> <!-- 类似于layout,除了将时间转化为数组,还会将转换后的数组输出到相应的文件中 -->
<encoder>
<!-- 定义日志的输出格式 -->
<pattern>${log.pattern}</pattern>
</encoder>
</appender> <!-- DEBUG,表示文件随着时间的推移按时间生成日志文件 -->
<appender name="debugAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件路径 -->
<file>${log.filePath}/debug.log</file> <!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/debug/debug.%d{yyyy-MM-dd}.log.gz
</fileNamePattern> <!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy> <encoder>
<pattern>${log.pattern}</pattern>
</encoder> <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置日志级别 -->
<level>DEBUG</level> <!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch> <!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- INFO,表示文件随着时间的推移按时间生成日志文件 -->
<appender name="infoAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件路径 -->
<file>${log.filePath}/info.log</file> <!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/info/info.%d{yyyy-MM-dd}.log.gz
</fileNamePattern> <!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy> <encoder>
<pattern>${log.pattern}</pattern>
</encoder> <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <!-- 设置日志级别 -->
<level>INFO</level> <!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch> <!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- ERROR,表示文件随着时间的推移按时间生成日志文件 -->
<appender name="errorAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件路径 -->
<file>${log.filePath}/error.log</file> <!-- 滚动策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 设置文件名称 -->
<fileNamePattern>
${log.filePath}/error/error.%d{yyyy-MM-dd}.log.gz
</fileNamePattern> <!-- 设置最大保存周期 -->
<MaxHistory>${log.maxHistory}</MaxHistory>
</rollingPolicy> <encoder>
<pattern>${log.pattern}</pattern>
</encoder> <!-- 过滤器,过滤掉不是指定日志水平的日志 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 设置日志级别 -->
<level>ERROR</level> <!-- 如果跟该日志水平相匹配,则接受 -->
<onMatch>ACCEPT</onMatch> <!-- 如果跟该日志水平不匹配,则过滤掉 -->
<onMismatch>DENY</onMismatch>
</filter>
</appender> <!-- 用于存放日志对象,同时指定关联的package位置 -->
<!-- name指定关联的package -->
<!-- level表明指记录哪个日志级别以上的日志 -->
<!-- appender-ref指定logger向哪个文件输出日志信息 -->
<!-- additivity为true时,logger会把根logger的日志输出地址加入进来,但logger水平不依赖于根 logger -->
<logger name="com.campus.o2o" level="${log.level}" additivity="true">
<appender-ref ref="debugAppender" />
<appender-ref ref="infoAppender" />
<appender-ref ref="errorAppender" />
</logger> <!-- 特殊的logger,根logger -->
<root lever="info"> <!-- 指定默认的日志输出 -->
<appender-ref ref="consoleAppender" />
</root> </configuration>

四、在程序用引用Logback

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class BlogAction{
//定义一个全局的记录器,通过LoggerFactory获取
private static final Logger logger = LoggerFactory.getLogger(BlogAction.class);
/**
* @param args
*/
public static void main(String[] args) {
logger.info("logback 成功了");
logger.error("logback 成功了");
}
}

原文出处:

[1] weixin_39413952, Logback的基本使用方法, https://blog.csdn.net/weixin_39413952/article/details/78884119

[2] Jim, Java日志框架-logback的介绍及配置使用方法(纯Java工程)(转), https://www.cnblogs.com/EasonJim/p/7800880.html

Reference:

[3] Evankaka, logback与Spring、SpringMVC结合使用教程, https://blog.csdn.net/evankaka/article/details/50637994

Logback的基本使用方法的更多相关文章

  1. logback日志项目使用方法 - 150205交易模块添加日志信息logback,orderNo订单号为log主键便于跟踪,数字常量化,解决取消支付BUG,弱网络环境原因

    1.项目里面的日志,便于跟踪数据的变更和异常错误信息产生.生产环境的日志级别是INFO,测试环境日志级别DEBUG,如果生产环境的日志级别是DEBUG,虽然方便查询问题,可以看到SQL语句等信息,但是 ...

  2. logback自定义格式转换器

    创建自定义格式转换符有两步. 首先,必须继承ClassicConverter类.ClassicConverter对象负责从ILoggingEvent 提取信息,并产生一个字符串.例如,LoggerCo ...

  3. Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

    Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...

  4. 在SpringBoot中使用logback优化异常堆栈的输出

    一.背景 在我们在编写程序的过程中,无法保证自己的代码不抛出异常.当我们抛出异常的时候,通常会将整个异常堆栈的信息使用日志记录下来.通常一整个异常堆栈的信息是比较多的,而且存在一些没用的信息.那么我们 ...

  5. SLF4j 居然不是编译时绑定?日志又该如何正确的分文件输出?——原理与总结篇

    各位新年快乐,过了个新年,休(hua)息(shui)了三周,不过我又回来更新了,经过前面四篇想必小伙伴已经了解日志的使用以及最佳实践了,这个系列的文章也差不多要结束了,今天我们来总结一下. 概览 这篇 ...

  6. sprint-boot 日志

    市面上的日志框架: JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.... SpringBoot:底层是Spring框架,Spring框架默认是用JC ...

  7. spring-boot-learning 日志相关

    sprint-boot 日志   市面上的日志框架: JUL.JCL.Jboss-logging.logback.log4j.log4j2.slf4j.... SpringBoot:底层是Spring ...

  8. javaSE27天复习总结

    JAVA学习总结    2 第一天    2 1:计算机概述(了解)    2 (1)计算机    2 (2)计算机硬件    2 (3)计算机软件    2 (4)软件开发(理解)    2 (5) ...

  9. java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext问题原因及解决方法

    一.错误信息 java.lang.ClassCastException: org.slf4j.impl.Log4jLoggerFactory cannot be cast to ch.qos.logb ...

随机推荐

  1. 2019 草花手游java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.草花手游等公司offer,岗位是Java后端开发,因为发展原因最终选择去了草花手游,入职一年时间了,也成为了面 ...

  2. Java 面向对象(八) 权限修饰符 和 final、native 关键字

    一.权限修饰符 1.概述 在 Java 中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限: public:公共的: protected:受保护的: default: ...

  3. JavaScript 之 Array 对象

    Array 对象 之前已经了解了 Array(数组)的定义和基本操作.数组的基本操作. 下面来学习更多的方法. 检测一个对象是否是数组 instanceof // 看看该变量是否是该对象的实例 Arr ...

  4. java虚拟机类加载机制和双亲委派模型

    java虚拟机类加载机制:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型. 类的生命周期是从类被加载到虚拟机内存中,到卸 ...

  5. linux shell的输出效果

    在linux系统命令行界面默认目录颜色是蓝色,在黑色底色上无法看清 原来效果图: 最终效果图: 大致步骤:1.复制配置文件到个人用户的根目录下2.修改配置文件中字体颜色的设置3.重新启动窗口,输入ls ...

  6. windows安装mysql8详解

    MySQL的安装过程还是比较繁琐,为了以后安装节约时间,将其详细安装过程总结如下: 1>下载对应版本 下载地址:https://dev.mysql.com/downloads/mysql/ 百度 ...

  7. C语言几个术语: 数据对象,左值,右值

    1. 数据对象 赋值表达式语句的目的是把值存储到内存位置上. 用于存储值的数据存储区域统称为数据对象. 2. 左值 左值是C语言的术语, 用于标识特定数据对象的名称或表达式. 对象指的是实际的数据存储 ...

  8. 看TED演讲——Why you will fail to have a great career

    讲者的名字叫Larry Smith,看起来很严肃很认真,有点黑色幽默的意思,演讲风格是非常让人喜欢的. 拿来howie老师的说法,拉老师给的你为什么没有一个great career的原因: 1. 知道 ...

  9. CentOS 7.2搭建FastDFS 分布式文件系统,实现高可用集群

    分布式集群搭建结构 双Tracker 2组Group 轮询存储策略 Keepalived+Nginx高可用 Nginx缓存 4个存储节点 一. 集群规划清单 1.安装清单 软件名称 版本 百度云盘存放 ...

  10. 怎么查看一个进程里fork多少个子进程

    怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 怎么查看一个进程里fork多少个子进程 ? ? ?