slf4j和logback使用
java日志(三)–slf4j和logback使用#
文章目录#
一、简介#
这里介绍slf4j和logback,及其组合使用。
二、slf4j知识点#
slf4j是日志接口。
2.1 官网地址
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 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本