1. Java_LogBack 用法简介

本文介绍了LogBack的基本概念及其与Log4j和Slf4j的关系,详细解析了LogBack的配置方法,包括根节点属性、子节点配置、上下文名称设置等,并通过示例展示了不同配置下的日志输出效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手。(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)

2 LogBack、Slf4j和Log4j之间的关系

Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…)。

LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。详细数据可参照下面地址:Reasons to prefer logback over log4j

3 LogBack的结构

LogBack被分为3个组件,logback-core, logback-classic 和 logback-access。

其中logback-core提供了LogBack的核心功能,是另外两个组件的基础。

logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,需要将logback-classic加入classpath。

logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。

4 配置详解

4.1 根节点包含的属性

  • scan:当此属性设置为 true 时,配置文件如果发生变化,将会被重新加载,默认值为 true。
  • scanPeriod:设置监测配置文件是否修改的时间间隔,当 scan 为 true 时,此配置生效,默认时间为 1 分钟
  • debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false

XML代码

<configuration scan="true" scanPeriod="60 second" debug="false">
...
</configuration>

4.2 根节点 的子节点

LogBack 的配置大概包括 3 部分:appender、logger 和 root

这里写图片描述

设置上下文名称 <contextName>

每个 logger 都关联到 logger 上下文,默认上下文名称为 “default”。但可以使用 <contextName> 设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。

<configuration scan="true" scanPeriod="60 second" debug="false">
    <contextName>myAppName</contextName>
    ...
</configuration>

设置变量 <property>

用来定义变量值的标签,<property> 有两个属性,name 和 value;其中 name 值是变量的名称,value 是值。通过 <property> 定义的值会被插入到 logger 上下文中,定义变量后,可以使用 “${}” 来使用变量。

<configuration scan="true" scanPeriod="60 second" debug="false">  
      <property name="APP_Name" value="myAppName" />   
      <contextName>${APP_Name}</contextName>  
      <!-- 其他配置省略-->  
</configuration>

获取时间戳字符串 timestamp

4.2.1 logger

用来设置某一个包或者具体的类的日志打印级别,以及指定 <appender><logger> 仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。

  • name:用来指定受此 logger 约束的某一个包或者具体的某一个类
  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前 logger 将会继承上级的级别。
  • addtivity:是否向上级 logger 传递打印信息。默认值为 true

<logger> 可以包含零个或多个 <appender-ref> 元素,标识这个 appender 将会添加到这个 logger。

4.2.2 root

只有一个 level 属性

  • level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。

<root> 可以包含零个或多个 <appender-ref> 元素,标识这个 appender 将会添加到这个 logger

案例介绍

首先是 java 类如下:

package logback;  

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

public class LogbackDemo {  
    private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);  
    public static void main(String[] args) {  
        log.trace("======trace");  
        log.debug("======debug");  
        log.info("======info");  
        log.warn("======warn");  
        log.error("======error");  
    }  
}

logback.xml 配置文件

只配置root

<configuration>   

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
    <!-- encoder 默认配置为PatternLayoutEncoder -->   
    <encoder>   
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
    </encoder>   
  </appender>   

  <root level="INFO">             
    <appender-ref ref="STDOUT" />   
  </root>     

 </configuration>

其中 appender 的配置表示打印到控制台(稍后详细讲解appender )。<root level="INFO"> 将root的打印级别设置为 “INFO”,指定了名字为 “STDOUT” 的 appender。

当执行logback.LogbackDemo类的main方法时,root将级别为 “INFO” 及大于 INFO 的日志信息交给已经配置好的名为 STDOUT 的appender处理,STDOUT appender将信息打印到控制台;

输出结果:

13:30:38.484 [main] INFO  logback.LogbackDemo - ======info  
13:30:38.500 [main] WARN  logback.LogbackDemo - ======warn  
13:30:38.500 [main] ERROR logback.LogbackDemo - ======error

带有logger的配置,不指定级别,不指定appender

<configuration>   

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
    <!-- encoder 默认配置为PatternLayoutEncoder -->   
    <encoder>   
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
    </encoder>   
  </appender>   

  <!-- logback为java中的包 -->   
  <logger name="logback"/>   

  <root level="DEBUG">             
    <appender-ref ref="STDOUT" />   
  </root>     

 </configuration>

输出结果:

13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug  
13:19:15.406 [main] INFO  logback.LogbackDemo - ======info  
13:19:15.406 [main] WARN  logback.LogbackDemo - ======warn  
13:19:15.406 [main] ERROR logback.LogbackDemo - ======error

<logger name="logback" /> 将控制logback包下的所有类的日志的打印,但是并没有设置打印级别,所以继承他的上级的日志级别“DEBUG”。

没有设置addtivity,默认为true,将此logger的打印信息向上级传递。

没有设置appender,此logger本身不打印任何信息。

<root level="DEBUG">将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。

当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行 <logger name="logback" />,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印。

root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台。

带有多个logger的配置,指定级别,指定appender

<configuration>   
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   
    <!-- encoder 默认配置为PatternLayoutEncoder -->   
    <encoder>   
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   
    </encoder>   
  </appender>   

  <!-- logback为java中的包 -->   
  <logger name="logback"/>   
  <!--logback.LogbackDemo:类的全路径 -->   
  <logger name="logback.LogbackDemo" level="INFO" additivity="false">  
    <appender-ref ref="STDOUT"/>  
  </logger>   

  <root level="ERROR">             
    <appender-ref ref="STDOUT" />   
  </root>     
</configuration>
java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor835.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.xxl.job.core.handler.impl.MethodJobHandler.execute(MethodJobHandler.java:29) at com.xxl.job.core.thread.JobThread.run(JobThread.java:152) Caused by: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3664) at java.lang.String.<init>(String.java:207) at java.lang.StringBuilder.toString(StringBuilder.java:407) at ch.qos.logback.core.pattern.CompositeConverter.convert(CompositeConverter.java:26) at ch.qos.logback.core.pattern.FormattingConverter.write(FormattingConverter.java:36) at ch.qos.logback.core.pattern.PatternLayoutBase.writeLoopOnConverters(PatternLayoutBase.java:115) at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:141) at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:39) at ch.qos.logback.core.encoder.LayoutWrappingEncoder.encode(LayoutWrappingEncoder.java:115) at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:230) at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102) at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84) at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51) at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270) at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257) at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421) at ch.qos.logback.classic.Logger.filterAndLog_2(Logger.java:414) at ch.qos.logback.classic.Logger.info(Logger.java:587) at com.itl.isrm.common.base.utils.ThirdInterfaceHttpUtils.sendErpGet(ThirdInterfaceHttpUtils.java:353) at com.itl.isrm.common.base.utils.ThirdInterfaceHttpUtils.httpGet(ThirdInterfaceHttpUtils.java:256) at com.itl.isrm.basic.provider.thirdinterface.service.impl.MaterialThirdInterfaceServiceImpl.syncErpMaterialInfo(MaterialThirdInterfaceServiceImpl.java:50) at com.itl.isrm.basic.provider.job.SyncErpMaterialInfoJob.execute(SyncErpMaterialInfoJob.java:76) ... 5 more 调用ERP物料接口报这个是什么意思
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值