栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Logback日志框架使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Logback日志框架使用

目录

Logback简介

一、引入依赖

二、尝试生成一条日志

三、记录器

 四、每个记录器的属性

 五、XML配置文件配置框架

六、附加器Appender

        七、过滤器Filter


Logback简介

目前比较常用的ava日志框架:Logback、log4j、log4j2、JUL等等。


Logback是在log4j的基础上重新开发的一套日志框架,是完全实现SLF4J接口API(也叫日志门面)。


Logback 的架构非常通用,可以应用于不同的环境。目前logback分为三个模块,logback-core,logback-classic和logback-access。


logback-core模块为其他两个模块奠定了基础。logback-classic模块原生实现了SLF4JAPI,因此您可以轻松地在logback和其他日志记录框架(例如 log4j1.x或java.util.logging (JUL))之间来回切换。


logback-access模块与Tomcat和 Jetty 等 Servlet容器集成,以提供HTTP访问日志功能。请注意,您可以轻松地在logback-core之上构建自己的模块。

一、引入依赖

        1)创建一个maven项目

        2)引入logback依赖 

Maven Repository: logback (mvnrepository.com)

 

找个稳定版

 

        
            ch.qos.logback
            logback-classic
            1.2.11
            
        

二、尝试生成一条日志

 创建测试类

test.applog.java

创建一个记录器

用记录器生成日志

package test;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class applog {
    static Logger logger= LoggerFactory.getLogger("自定义日志名.test.applog");//名字同时代表了级别

    public static void main(String[] args) {
        logger.info("no1");
    }
}

 运行

 成功将日志输出到了控制台,因为我们没有做相关的配置,所以只能将debug及以上的日志输出到控制台(日志分为五个等级)

日志的五个等级

TRACE < DEBUG < INFO < WARN

拓展:日志一共分成5个等级,从低到高分别是:

DEBUG:详细的信息,通常只出现在诊断问题上


INFO:确认一切按预期运行


WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。


ERROR:更严重的问题,软件没能执行一些功能


CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行


这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,当在WARNING或之上时才被跟踪。
 

三、记录器

日志记录器(Logger):控制要输出哪些日志记录语句,对日志信息进行级别限制。如何生成记录器:


final static Logger logger = LoggerFactory.getLogger(“名称”);
 

        1)记录器层级结构

所有的记录器都是缓存在 Map中的,记录器的关系有点类似于继承,是由名称决定的 

 父记录器logger2和子记录器logger,如果没有.标记,顶层记录器继承自root根记录器。

    static Logger logger= LoggerFactory.getLogger("自定义日志名.test.applog");//名字同时代表了级别
    static Logger logger2= LoggerFactory.getLogger("自定义日志名.test");//名字同时代表了级别,父记录器

         2)子记录器会同时创建父类记录器

 当父记录器存在的时候,再次创建子记录器则只会创建子记录器。

 四、每个记录器的属性

name属性:记录器的名称        


level属性(可选):记录器的级别,允许的级别从低到高,TRACE         logger.setLevel() ;      设置日志级别。可以使用设置的以及以上的级别的日志 
        logger.getLevel();        查看设置的级别
        logger.getEffectiveLevel()        查看实际生效的级别,比如默认或者继承自父记录器的级别


additivity属性(可选):是否允许叠加打印日志, true或false


说明:
1)如果记录器未设置level属性,则该记录器的级别从上级记录器继承
2)如果想查看记录器的级别,应该通过logger.getEffectiveLevel()方法,同时要将Logger转为ch.qos.logback.classic.Logger类型,如下:
        ch.qos.logback.classic.Logger logger =
                (ch.qos.logback.classic.Logger)LoggerFactory.getLogger(App.class);

        1)简单演示修改日志级别

package test;

import ch.qos.logback.classic.Level;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class applog2 {



    public static void main(String[] args) {
        ch.qos.logback.classic.Logger logger= (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("自定义日志名");//名字同时代表了级别
        System.out.println("设置之前的级别");
        System.out.println(logger.getLevel());
        System.out.println(logger.getEffectiveLevel());
        logger.setLevel(Level.INFO);
        System.out.println("设置之后的级别");
        System.out.println(logger.getLevel());
        System.out.println(logger.getEffectiveLevel());
        logger.trace("no0");
        logger.debug("no1");
        logger.info("no2");
        logger.warn("no3");
        logger.error("no4");
        
    }
}

输出

设置之前的级别
null
DEBUG
设置之后的级别
INFO
INFO
23:47:37.632 [main] INFO 自定义日志名 - no2
23:47:37.647 [main] WARN 自定义日志名 - no3
23:47:37.647 [main] ERROR 自定义日志名 - no4

进程已结束,退出代码0

代码中我们将日志级别置为INFO,测试打印日志,打印出来了 INFO以及更高级别的日志记录,同时可以看到设置之前的日志级别和手动或执行后的日志级别。

         2)修改父类日志级别查看子类日志级别

package test;

import ch.qos.logback.classic.Level;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class applog3 {



    public static void main(String[] args) {
        ch.qos.logback.classic.Logger logger= (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("自定义日志名");//名字同时代表了级别
        ch.qos.logback.classic.Logger rootLogger=(ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);//获取Root根记录器
        rootLogger.setLevel(Level.INFO);
        System.out.println("设置之前的级别");
        System.out.println(logger.getLevel());
        System.out.println(logger.getEffectiveLevel());
        logger.setLevel(Level.INFO);
        System.out.println("设置之后的级别");
        System.out.println(logger.getLevel());
        System.out.println(logger.getEffectiveLevel());
        logger.trace("no0");
        logger.debug("no1");
        logger.info("no2");
        logger.warn("no3");
        logger.error("no4");
        
    }
}

输出 

设置之前的级别
null
INFO
设置之后的级别
INFO
INFO
00:00:27.430 [main] INFO 自定义日志名 - no2
00:00:27.437 [main] WARN 自定义日志名 - no3
00:00:27.437 [main] ERROR 自定义日志名 - no4

进程已结束,退出代码0
 

提前把Root根记录器的日志级别改为INFO后,可以看出子类的生效级别变成了INFO.

        3)层次结构

当前的记录器如果没有设置级别的话,就会向父类查询,如果父类也没有设置就向父类递归查询到ROOT记录器,默认DEBUG级别 

 五、XML配置文件配置框架

        1)创建配置文件 main-》resource->logback.xml





 如果命名空间和资源有问题的话,将光标移到xsd资源上按住 ALT+回车 手动设置外部资源,将外部资源导入就好了。

         2)设置ROOT级别

代码中加入





 测试java代码

package test;

import ch.qos.logback.classic.Level;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class applog4 {



    public static void main(String[] args) {

        ch.qos.logback.classic.Logger rootLogger=(ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);//获取Root根记录器
        rootLogger.setLevel(Level.INFO);
        System.out.println("设置之前的级别");
        System.out.println(rootLogger.getLevel());
        System.out.println(rootLogger.getEffectiveLevel());
        rootLogger.setLevel(Level.WARN);
        System.out.println("设置之后的级别");
        System.out.println(rootLogger.getLevel());
        System.out.println(rootLogger.getEffectiveLevel());
        rootLogger.trace("no0");
        rootLogger.debug("no1");
        rootLogger.info("no2");
        rootLogger.warn("no3");
        rootLogger.error("no4");
        
    }
}

输出

设置之前的级别
INFO
INFO
设置之后的级别
WARN
WARN

进程已结束,退出代码0

可以看到默认的ROOT记录器日志级别从DEBUG变成了配置文件里的INFO。 

        3)设置其他记录器级别

修改配置文件加入




    

    

使用java程序测试 

package test;

import ch.qos.logback.classic.Level;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class applog5 {



    public static void main(String[] args) {
        ch.qos.logback.classic.Logger logger= (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.aa");//名字同时代表了级别

        System.out.println("com.aa级别");
        System.out.println(logger.getLevel());
        System.out.println(logger.getEffectiveLevel());
        ch.qos.logback.classic.Logger logger2= (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com");//名字同时代表了级别
        System.out.println("com的级别");
        System.out.println(logger2.getLevel());
        System.out.println(logger2.getEffectiveLevel());

        
    }
}

输出

com.aa级别
DEBUG
DEBUG
com的级别
null
INFO

进程已结束,退出代码0

在这里可以看到,提前设置好 ,那么以com.aa命名的记录器将不受ROOT记录器影响,在创建后就被就设置了日志级别。但是父记录器com依然是继承自ROOT的INFO级别。

六、附加器Appender

 什么是附加器?


记录器会将输出日志的狂务交给附加器完成,不同的附加器会将日志输出到不同的地方,比如控制台附加器、文件附加器、网络附加器等等。


常用的附加器


控制台附加器:             ch.qos.logback.core.ConsoleAppender

文件附加器:                ch.qos.logback.core.FileAppender
滚动文件附加器:         ch.qos.logback.core.rolling.RollingFileAppender

实际上仅仅有记录器是不能写日志的 ,附加器才是日志输出的工具。实现附加器需要设置附加器名字和Class实现类,并且要配置编码器模板,配置完成后将附加器放到记录器里面

        1)控制台附加器输出 



        
            %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        
    

将附加器放到纪录器里,可以放多个附加器。 


        
        
    

测试:

完整的xml



    
        
            %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        
    

    
        
    

java程序

package test;

import org.slf4j.LoggerFactory;


public class applog6 {



    public static void main(String[] args) {
        ch.qos.logback.classic.Logger logger= (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.aa");//名字同时代表了级别

        System.out.println("com.aa级别");
        System.out.println(logger.getLevel());
        System.out.println(logger.getEffectiveLevel());
        logger.trace("no0");
        logger.debug("no1");
        logger.info("no2");
        logger.warn("no3");
        logger.error("no4");

        
    }
}

输出:

com.aa级别
DEBUG
DEBUG
00:46:30 [main] DEBUG com.aa - no1
00:46:30 [main] INFO  com.aa - no2
00:46:30 [main] WARN  com.aa - no3
00:46:30 [main] ERROR com.aa - no4

进程已结束,退出代码0

        2)pattern标签

Pattern由文字文本和转换说明符的格式控制表达式组成。您可以在其中自由插入任何文字文本。每个转换说明符都以百分号"%',后跟可选的格式修饰符、转换字和大括号之间的可选参数。转换字控制要转换的数据字段,例如记录器名称、级别、日期或线程名称。格式修饰符控制字段宽度、填充以及左对齐或右对齐。

         3)文件附加器输出

需要多配置一个file标签,用于存放文件

    
        myApp.log
        
            %date %level [%thread] %logger{10} [%file:%line] %msg%n
        
    

 完整xml



    
        
            %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        
    
    
        myApp.log
        
            %date %level [%thread] %logger{10} [%file:%line] %msg%n
        
        true
        
    

    
        
        
    

依然执行上一个测试用例

输出了一个日志文件

 这个方法生成的日志会不断叠加,更多的使用的是滚动文件附加器,可以设置时间和大小生成多个文件,方便阅读调阅。

        4)滚动文件附加器 

滚动策略


1.基于时间的滚动策略
ch.qos.logback.core.rolling.TimeBasedRollingPolicy
2.基于大小和时间的滚动策略
ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy
 

                (1)基于时间的 

    
    
        mylog2.log

        
        
            %50date %msg
        
        
        
        
            %d{yyyy-mm-dd HH-mm-ss}.log
            10
            5GB
        
    

 这里面的mylog2.log指的是当前正在工作的日志文件,当满足设定条件后就重构重命名为归档文件,

10        则是设定归档文件的最大数量,超过数量会删除最早的归档文件。

5GB        用于设置所有日志文件的大小

测试



    
        
            %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        
    
    
        myApp.log
        
            %date %level [%thread] %logger{10} [%file:%line] %msg%n
        
        true
        
    
    
    
        mylog2.log

        
        
            %50date %msg
        
        
        
        
            %d{yyyy-mm-dd HH-mm-ss}.log
            
            10
            5GB
        
    

    
        
        
        
    

 执行程序

设定为每秒一个日志,执行多次程序后,日志1被输出到文件列表 

        (2)基于时间和大小的 


    
        mylog3.log

        
        
            %50date %msg
        
        
        
        
            %d{yyyy-mm-dd HH-mm-ss}.%i.log
            10
            5GB
            1KB
        
    

这里面的标签多了一个

1KB

        用于限定日志文件的大小

%d{yyyy-mm-dd HH-mm-ss}.%i.log

这个标签没发生一次变化代表着一个新的文件,前面是时间,后面的%i则是第几个触发的文件编号。

10

        这个标签是按照时间的归档数量,而不是文件数量。



    
        
            %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
        
    
    
        myApp.log
        
            %date %level [%thread] %logger{10} [%file:%line] %msg%n
        
        true
        
    
    
    
        mylog2.log

        
        
            %50date %msg
        
        
        
        
            %d{yyyy-mm-dd HH-mm-ss}.log
            10
            5GB
        
    
    
    
        mylog3.log

        
        
            %50date %msg
        
        
        
        
            %d{yyyy-mm-dd HH-mm-ss}.%i.log
            10
            5GB
            1KB
        
    

    
        
        
        
        
    

         自定义附加器

        模拟控制台附加器

                自行探索吧。。。

        七、过滤器Filter

过滤器是附加器的一个组件,它用于决定附加器是否输出日志。一个附加器可以包含一个或多个过滤器。每个过滤器都会返回一个枚举值,可选的值:DENY、NEUTRAL、ACCEPT
附加器根据过滤器返回值判断是否输出日志:
DENY :不输出日志
ACCEPT:输出日志
NEUTRAL:中立,即不决定是否输出日志

如果当前过滤器决定输出日志,那么日志直接输出,忽略后面的过滤器

如果当前过滤器决定不输出日志,那么日志直接不输出,忽略后面的过滤器

如果当前过滤器待定是否输出日志,那么将询问下一个过滤器是否输出

常用的过滤器


LevelFilter(级别过滤器)︰实现类ch.qos.logback.classic.filter.LevelFilter


ThresholdFilter(阈值过滤器):实现类ch.qos.logback.classic.filter.ThresholdFilter

EvaluatorFilter(评估者过滤器):实现类ch.qos.logback.core.filter.EvaluatorFilterJanino

EventEvaluator过滤器:实现类ch.qos.logback.core.filter.EvaluatorFilter

TurboFilter涡轮过滤器


DuplicateMessageFilter重复消息过滤器
 

级别过滤器

 级别匹配一致打印日志并返回

级别匹配不一致不打印日志并返回

 可以更改返回值。

         自定义过滤器

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999081.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号