前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >logback配置和使用

logback配置和使用

作者头像
布禾
修改2020-11-19 10:09:17
1.5K0
修改2020-11-19 10:09:17
举报
文章被收录于专栏:好好学习,天天向上

简介

logback是由log4j创始人设计的又一个开源日志组件。当前分成三个模块:

  • logback-core是其它两个模块的基础模块。
  • logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API,使你可以很方便地更换成其它日志系统,如log4j或JDK14 Logging。
  • logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

配置

配置pom.xml

logback需要logback-corelogback-classicslf4j-apilogback-access这4个依赖。其中logback-classic已经包含了logback-core和slf4j-api依赖,由于Maven依赖的传递性,所以我们只需导入logback-classic和logback-access依赖即可。

代码语言:javascript
复制
	<dependencies>
  		<dependency>
		  <groupId>ch.qos.logback</groupId>
		  <artifactId>logback-classic</artifactId>
		  <version>1.3.0-alpha4</version>
		</dependency>
		<dependency>
		  <groupId>ch.qos.logback</groupId>
		  <artifactId>logback-access</artifactId>
		  <version>1.3.0-alpha4</version>
		</dependency>
  	</dependencies>

初始化步骤

1. 在类路径中查找logback-test.xml文件。
2. 如果没有找到,则在类路径中查找logback.groovy文件。
3. 如果没有找到,则在类路径中查找logback.xml文件。
4. 如果没有找到,则尝试使用ServiceLoader加载classpath下META-INF\services\ch.qos.logback.classic.spi.Configurator文件中配置的com.qos.logback.classic.spi.Configurator实现类(Configurator文件内容为实现类的完全限定类名)。
5. 如果还是没有找到,则会加载默认配置,日志默认会输出到控制台,也就是使用BasicConfigurator,BasicConfigurator也是com.qos.logback.classic.spi.Configurator接口的实现类。
代码语言:javascript
复制
public class BasicConfigurator extends ContextAwareBase implements Configurator {

    public BasicConfigurator() {
    }

    public void configure(LoggerContext lc) {
        addInfo("Setting up default configuration.");
        
        ConsoleAppender<ILoggingEvent> ca = new ConsoleAppender<ILoggingEvent>();
        ca.setContext(lc);
        ca.setName("console");
        LayoutWrappingEncoder<ILoggingEvent> encoder = new LayoutWrappingEncoder<ILoggingEvent>();
        encoder.setContext(lc);
        
 
        // same as 
        // PatternLayout layout = new PatternLayout();
        // layout.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
        TTLLLayout layout = new TTLLLayout();
 
        layout.setContext(lc);
        layout.start();
        encoder.setLayout(layout);
        
        ca.setEncoder(encoder);
        ca.start();
        
        Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);
        rootLogger.addAppender(ca);
    }
}

使用logback.xml

代码语言:javascript
复制
<configuration scan="true" scanPeriod="30 seconds">
  <!-- 自定义属性,通过${}访问 -->
  <property name="filePath" value="/logs/" />
	
  <!-- 输出到控制台 -->
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} %msg%n</pattern>
    </encoder>
  </appender>
  
  <!-- 输出到文件 -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  	<!-- 文件路径 -->
    <file>${filePath}app.log</file>
    <!-- 日志输出格式化 -->
    <encoder>
    	<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
    </encoder>
    
    <!-- 滚动策略 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 每日滚动 -->
      <fileNamePattern>${filePath}app.log%d{yyyy-MM-dd}.log</fileNamePattern>
     
      <!-- 将30天的日志总大小限制在3GB内  -->
      <maxHistory>30</maxHistory>
      <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
  </appender> 
  
  <!-- 基于尺寸和时间的滚动策略 -->
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${filePath}other.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <fileNamePattern>${filePath}other.log%d{yyyy-MM-dd}%i.log</fileNamePattern>
       <!-- 每个日志文件最多100MB,保存60天的历史记录,总大小不超过20GB -->
       <maxFileSize>1KB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
    	<pattern>%date [%level] [%thread] %logger{80} [%file : %line] %msg%n</pattern>
    </encoder>
  </appender>
  
  <!-- name属性指定包名或者完全限定类名 -->
  <logger name="service.OtherService" level="DEBUG">
		<appender-ref ref="ROLLING" />
  </logger>

  <!-- 根logger -->
  <root level="DEBUG">
  	<!-- 配置输出源 -->
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
  </root>
</configuration>

测试:

代码语言:javascript
复制
public class HelloService {
	private final static Logger logger = LoggerFactory.getLogger(HelloService.class);
	
	public static void main(String[] args) {
		//根据logback.xml中配置的日志级别,TRACE级别的日志将不会输出,只会输出DEBUG及以上级别的日志。
		//TRACE < DEBUG < INFO <  WARN < ERROR
		logger.trace("---------------trace---------------");
		logger.debug("---------------debug---------------");
		logger.info("---------------info---------------");
		logger.warn("---------------warn---------------");
		logger.error("---------------error---------------");
	}
}

常用技巧

1. 使用占位符
代码语言:javascript
复制
		logger.debug("我是" + name + ",我今年" + age + "岁,很高兴认识你!");//普通方式
		logger.debug("我是{},我今年{}岁,很高兴认识你!", name, age);//占位符方式(推荐)

当debug日志被禁用时,普通方式中,参数依然会被构造拼接,而在占位符方式中,参数不会进行构造拼接。

2. 使用时应该使用slf4j的API而不是使用logback的API(依赖日志门面,而不是依赖具体的日志实现,便于更换其他日志框架)
3. 自动重新加载配置文件

将元素的scan属性设置为true,logback会定时的扫描配置文件,如果配置文件发生了更改,将自动重新加载配置文件。默认每分钟扫描一次,可以设置scanPeriod属性来指定扫描间隔。

代码语言:javascript
复制
<configuration scan="true" scanPeriod="30 seconds" > 
  ...
</configuration> 
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-07-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 配置
    • 配置pom.xml
      • 初始化步骤
        • 1. 在类路径中查找logback-test.xml文件。
        • 2. 如果没有找到,则在类路径中查找logback.groovy文件。
        • 3. 如果没有找到,则在类路径中查找logback.xml文件。
        • 4. 如果没有找到,则尝试使用ServiceLoader加载classpath下META-INF\services\ch.qos.logback.classic.spi.Configurator文件中配置的com.qos.logback.classic.spi.Configurator实现类(Configurator文件内容为实现类的完全限定类名)。
        • 5. 如果还是没有找到,则会加载默认配置,日志默认会输出到控制台,也就是使用BasicConfigurator,BasicConfigurator也是com.qos.logback.classic.spi.Configurator接口的实现类。
      • 使用logback.xml
        • 常用技巧
          • 1. 使用占位符
          • 2. 使用时应该使用slf4j的API而不是使用logback的API(依赖日志门面,而不是依赖具体的日志实现,便于更换其他日志框架)
          • 3. 自动重新加载配置文件
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档