slf4j和logback使用

java日志(三)–slf4j和logback使用#

文章目录#

一、简介#

这里介绍slf4j和logback,及其组合使用。

二、slf4j知识点#

slf4j是日志接口。

2.1 官网地址

https://www.slf4j.org/

2.2 主要jar包

slf4j-api:slf4j的核心包,只有接口,没实现;
slf4j-log4j:slf4j与log4j整合的桥接包(使用中还得添加日志实现包log4j);
slf4j-jdk14:slf4j与jul(java.util.logging)整合的桥接包;
slf4j-simple:slf4j的简单实现;

2.3 日志级别

slf4j的日志级别有5类,分别是ERROR, WARN, INFO, DEBUG, TRACE。
源码如下:

ERROR(ERROR_INT, "ERROR"), WARN(WARN_INT, "WARN"), INFO(INFO_INT, "INFO"), DEBUG(DEBUG_INT, "DEBUG"), TRACE(TRACE_INT, "TRACE");
final public int TRACE_INT = 00;
final public int DEBUG_INT = 10;
final public int INFO_INT = 20;
final public int WARN_INT = 30;
final public int ERROR_INT = 40;

2.4 核心接口或类

org.slf4j.Logger:核心接口(包含了日志操作的方法);
org.slf4j.LoggerFactory:工厂类,获取日志实例;

三、logback知识点#

logback是对slf4j的官方实现,出自同一人之手,不需要桥接包。

3.1 官网地址

https://logback.qos.ch/manual/index.html

3.2 主要jar包

logback-core:基础包,其它的jar包以此为基础;
logback-classic:slf4j接口的实现;
logback-classic:与servlet(servlet容器如tomcat、jetty)集成,提供http访问日志功能;

3.3 配置文件

logback的配置文件位src/main/resources目录下。
其加载顺序为(优先级从高到低):logback.groovy --> logback-test.xml --> logback.xml

四、logback配置文件结构#

logback.xml配置文件根结点为configuration,内主要包含property、contextName、appender、filter、pattern、logger、root等结点。

4.1 configuration根结点

configuration主要有三个属性,debug、 scan、scanPeriod,示例及解释如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--debug:是否输出logback运行日志,true则始终输出,false则出错时才输出;
    scan:文件修改时是否怎么加载,true则自动加载,false则不自动加载;
    scanPeriod:扫描自动加载间隔,单位有milliseconds、seconds、munites、hours,默认为milliseconds; -->
<configuration debug="ture" scan="true" scanPeriod="60 seconds">
</configuration>    

4.2 property属性结点

变量定义,如:

<!--定义变量-->
<property name="logName" value="logbackStudy" />
<!--从src/main/resources加载配置文件(文件内key=val形式每行一个),配置文件中的值可直接使用-->
<property resource="logback.properties" />

4.3 timestamp时间结点

获取当前日期时间并格式化,如:

<timestamp key="nowDate" datePattern="yyyyMMdd" />
<timestamp key="nowDateTime" datePattern="yyyyMMdd_HHmmss" />

4.4 contextName 上下文名称结点

日志上下文名称,如:

<!--当前logger上下文名称-->
<contextName>${logName}</contextName>

4.5 appender日志输出结点

日志输出目的,有ConsoleAppender(输出到控制台)、FileAppender(输出到文件)、SMTPAppender(输出到邮件)、DBAppender(输出到数据库)、AsyncAppender(异步输出,包装其它具体的appender,不单独使用)等。
官方文档为:https://logback.qos.ch/manual/appenders.html

4.5.1 ConsoleAppender

输出到控制台,如:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date %highlight(%-5level) %logger : %msg %n</pattern>
    </encoder>
</appender>
4.5.2 FileAppender

输出到文件,包含file结点(文件名)、rollingPolicy(历史日志归档),下面按时间归档如:

<timestamp key="nowDate" datePattern="yyyyMMdd" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logbackStudy.log</file>
    <!--<file>logbackStudy_${nowDate}.log</file>-->
    <!--<file>${nowDate}/logbackStudy.log</file>-->

    <!--日志滚动的策略,按时间归档,实现了RollingPolicy和TriggeringPolicy接口,RollingPolicy指历史文件归档策略,TriggeringPolicy指历史文件归档时机-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logbackStudy_%d{yyyyMMdd}.log.gz</fileNamePattern>
        <!--最多保存30天历史-->
        <maxHistory>30</maxHistory>
        <!--日志文件合起来最大1G,超出后会删除旧日志-->
        <totalSizeCap>1G</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <!--日志模板-->
        <pattern>%date %level %logger : %msg %n</pattern>
    </encoder>
</appender>

另外按文件大小归档示例如下:

<!--日志滚动的策略,按文件大小归档,实现了RollingPolicy和TriggeringPolicy接口,RollingPolicy指历史文件归档策略,TriggeringPolicy指历史文件归档时机-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <!--%i是当文件大小超过maxFileSize大小时,则用下标新建文件,.gz或.zip后缀会自动压缩-->
    <fileNamePattern>logbackStudy_%i.log.gz</fileNamePattern>
    <!--%i的取值范围-->
    <minIndex>1</minIndex>
    <minIndex>5</minIndex>
</rollingPolicy>
<!--触发归档-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <!--文件达到10MB时就归档-->
    <maxFileSize>10MB</maxFileSize>
</triggeringPolicy>

同时按时间和文件大小示例如下:

<!--日志滚动的策略,按时间和文件大小归档,实现了RollingPolicy和TriggeringPolicy接口,RollingPolicy指历史文件归档策略,TriggeringPolicy指历史文件归档时机-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!--%i是当文件大小超过maxFileSize大小时,则用下标新建文件,.gz或.zip后缀会自动压缩-->
    <!--<fileNamePattern>logbackStudy_%d{yyyyMMdd}_%i.log</fileNamePattern>-->
    <fileNamePattern>logbackStudy_%d{yyyyMMdd}_%i.log.gz</fileNamePattern>
    <!--文件最大100MB-->
    <maxFileSize>100MB</maxFileSize>
    <!--最多保存30天历史-->
    <maxHistory>30</maxHistory>
    <!--日志文件合起来最大1G,超出后会删除旧日志-->
    <totalSizeCap>1G</totalSizeCap>
</rollingPolicy>
4.5.3 AsyncAppender

异步添加日志,不单独使用,一般通过引用其它具体的appender来使用。如:

<!--异步记录日志,需引用其它的appender-->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
</appender>

除了上述appender外,另外还有SocketAppender(输出到socket)、SMTPAppender(输出到邮件)、
DBAppender(输出到数据库)等。在此不一一列出,具体请在使用再次查找相关文档。

4.6 filter过滤器结点

filter是日志过滤器,官网地址:https://logback.qos.ch/manual/filters.html,通过实现ch.qos.logback.core.filter.Filter接口可以自定义过滤器,示例如下:
自定义过滤器类LogbackUrlFilter.class

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;

public class LogbackUrlFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        if(event.getMessage().contains("url")){
            return FilterReply.ACCEPT;
        }
        return FilterReply.DENY;
    }
}

配置如下:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--自定义过滤器-->
    <filter class="com.dragon.study.log.LogbackUrlFilter" />
    <encoder>
        <pattern>%date %level %logger : %msg %n</pattern>
    </encoder>
</appender>

另外过滤器还可以来自自带的或表达式直接写在配置文件中,如下:

<!--日志级别(针对具体指定级别)过滤器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>NEUTRAL</onMismatch>
    <!--<onMismatch>DENY</onMismatch>-->
</filter>

<!--日志级别(针对指定级别及以上级别)过滤器-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <!--<level>INFO</level>-->
    <level>WARN</level>
</filter>

<!--根据判断条件的过虑器-->
<filter class ="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator >
        <!--expression为java代码,需要添加groupId为org.codehaus.janino,artifactId为janino的maven包-->
        <expression>
            //根据logger名称判断
            if(logger.equals("Slf4jAndLogbackMain"){
            return true;
            }
            //根据返回值判断
            if(event.getStatusCode()==200){
            return true;
            }
            //根据日志消息判断
            if(message.contains("url")){
            return true;
            }
            return false;
        </expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

4.7 pattern日志格式

定义每行日志记录的格式,官网地址:https://logback.qos.ch/manual/layouts.html
常用变量别名(包括全称和简称)有:

变量名
%logger(简写:%c或%lo): 当前日志名称,如: Slf4jAndLogbackMain
%class(简写:%C): 日志调用所在类,如: com.dragon.study.log.Slf4jAndLogbackMain
%method(简写:%M): 日志所在方法,如: main
%caller: 日志调用位置,如:at com.dragon.study.log.Slf4jAndLogbackMain.main(Slf4jAndLogbackMain.java:15)
%thread(简写:%t): 日志调用所有线程序,如:main
%level(简写:%p或%le): 日志级别,如:INFO
%date(简写:%d): 日期,如: 2018-12-15 21:40:12,890
%msg(简写:%m): 日志记录内容
%exception(简写:%ex): 异常记录

宽度设置
%20logger:当字符数少于20个字符时,则左侧留空白;
%-20logger:当字符数少于20个字符时,则右侧留空白;
%.30logger:当字符数据大于30个时,则截断;

显示设置
%highligth:突出显示
%green(%red、%blue、%white):字体显示为指定颜色
{length}可指定长度,如%logger{36}

网络访问设置(依赖logger-access包)
%remoteIP(简写:%a):远程ip;
%localIP(简写:%A):本地ip;
%clientHost(简写:%h):远程主机名;
%localPort:本地端口;
%requestMethod(简写:%m):http请求方法;
%protocol(简写:%H):http请求协议;
%statusCode(简写:%s):http请求status code;
%requestURL(简写:%r):http请求地址;
%requestURI(简写:%U):http请求资源地址;
%queryString(简写:%q):http请求参数;
%server(简写:%v):服务器地址;
%elapsedTime(简写:%D):http请求处理的时间,单位是毫秒;
%elapsedSeconds(简写:%T):http请求处理的时间,单位是秒;
%date(简写:%t):日志记录时间;
%threadName(简写:%I):处理请求的线程名;
%reqAttribute{attributeName}:http请求attribute值;
%reqCookie{cookie}:http请求cookie值;
%reqContent:http请求体内容;
%fullRequest:http完整请求;
%responseContent:http响应;
%fullResponse:http完整响应;

示例如:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <encoder>
            <!--全称形式-->
            <pattern>%date %logger %class %method %highlight(%level) %thread  : %msg%n</pattern>
            <!--简写形式-->
            <!--<pattern>%d %lo %C %M %le %t %le %lo : %m%n</pattern>-->
        </encoder>
    </encoder>
</appender>

4.8 logger结点

设置某一包或类下的日志打印级别、appender。

<!--控制指定包或类的日志输出(包括等级和目的地), additivity表示日志信息是否向上传递,false为不传递(即不重复打印)-->
<logger name="com.dragon.study.log.Slf4jAndLogbackMainTwo" level="warn" additivity="false">
    <!--可多个appender-->
    <appender-ref ref="STDOUT" />
</logger>

4.9 root结点

指定日志级别及输出的appender,如:

<root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>

至此,logback关键结点介绍完毕。

五、slf4j和logback组合使用示例#

5.1 添加maven依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.11</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.11</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.8</version>
</dependency>
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.7</version>
</dependency>

5.2 logback配置文件编写

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--当前logger上下文名称-->
    <contextName>logbackStudy</contextName>

    <!--当前日期-->
    <timestamp key="nowDate" datePattern="yyyyMMdd" />

    <!--输出到控制台-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date %level %logger : %msg %n</pattern>
        </encoder>
    </appender>

    <!--输出到文件-->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logbackstudy_${nowDate}.log</file>

        <!--日志滚动的策略,按时间归档,实现了RollingPolicy和TriggeringPolicy接口,RollingPolicy指历史文件归档策略,TriggeringPolicy指历史文件归档时机-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logbackStudy_%d{yyyyMMdd}.log.gz</fileNamePattern>
            <!--最多保存30天历史-->
            <maxHistory>30</maxHistory>
            <!--日志文件合起来最大1G,超出后会删除旧日志-->
            <totalSizeCap>1G</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <!--日志模板-->
            <pattern>%date %level %logger : %msg %n</pattern>
        </encoder>
    </appender>

    <!--控制指定包或类的日志输出(包括等级和目的地), additivity表示日志信息是否向上传递,false为不传递(即不重复打印)-->
    <logger name="com.dragon.study.log.Slf4jAndLogbackMainTwo" level="warn" additivity="false">
        <!--可多个appender-->
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

4.3 测试

Slf4jAndLogbackMainTwo.class和Slf4jAndLogbackMain.class完全一样

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

public class Slf4jAndLogbackMain {
    public static final Logger logger = LoggerFactory.getLogger(Slf4jAndLogbackMain.class);
    public static void main(String[] args) throws InterruptedException {
        logger.trace("trace log with param, {} {}", "p1", "p2");
        logger.debug("debug log");
        logger.info("info log");
        logger.warn("warn log");
        logger.error("error log");
        logger.info("url info log");
    }
}

结果:
生成logbackstudy_20181219.log文件并输出:

2018-12-19 00:11:34,922 INFO com.dragon.study.log.Slf4jAndLogbackMain : info log 
2018-12-19 00:11:34,939 WARN com.dragon.study.log.Slf4jAndLogbackMain : warn log 
2018-12-19 00:11:34,939 ERROR com.dragon.study.log.Slf4jAndLogbackMain : error log 
2018-12-19 00:11:34,940 INFO com.dragon.study.log.Slf4jAndLogbackMain : url info log 

转载:

https://blog.csdn.net/chinabestchina/article/details/104743907

作者:Esofar

出处:https://www.cnblogs.com/firsthelloworld/p/17401803.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   我不想学编丿程  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示