Giter Site home page Giter Site logo

caslog's Introduction

Casslog

一、背景

为了使业务团队专注于业务迭代,减少对日志系统配置的感知。需将业务服务的日志配置统一抽取,做到统一配置、统一管理、统一升级,达到业务团队0配置接入使用日志系统的目的。

casslog是基于logback日志框架封装的一款日志系统,意在集中解决业务团队在使用日志系统过程中遇到的配置、规范、变更等问题。

二、架构

img

logback.xml 配置集成 spring cloud config。

三、使用

使用要求:logback 版本 1.1.7 以上。

logback 版本 1.1.7 存在已知缺陷(https://jira.qos.ch/browse/LOGBACK-1164 ),导致应用启动报错。

引入依赖

pom.xml引入依赖:

<dependency>
    <groupId>com.dbses.open</groupId>
    <artifactId>casslog-spring-boot-starter</artifactId>
    <version>最新稳定版</version>
</dependency>

应用配置

bootstrap.yml配置:

spring:
  application:
    name: casslog-example
  cloud:
    config:
      uri: http://localhost:8080/conf
      label: alpha

启动应用

@SpringBootApplication
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}

启动后效果如下图所示:

image-20211026163738586

在目录{projectRoot}/logs下可看到以工程名称(取自${spring.application.name})命名的日志文件。

打印日志

@RestController
@Slf4j
public class ExampleController {
    // Same as @Slf4j
//    private static final Logger log = LoggerFactory.getLogger(ExampleController.class);
    
    private static final String SUCCESS = "success";
    
    @GetMapping("/log")
    public String log(@RequestParam(value = "param", defaultValue = "I_AM_PARAM") String param) {
        if (log.isDebugEnabled()) {
            log.debug("This is a debug message. 中文");
            log.debug("This is a debug message. {}", param);
        }

        log.info("This is an info message. 中文");
        log.info("This is an info message. {}", param);

        log.warn("This is a warn message. 中文");
        log.warn("This is a warn message. {}", param);

        log.error("This is an error message. 中文");
        log.error("This is an error message. {}", param);

        return SUCCESS;
    }
}

日志打印效果如下:

image-20211026165820628

四、功能

4.1 Casslog 配置说明

Spring Cloud Config 配置中心commons/__common_log_.yml内容如下:

casslog:
  # logback-spring_.xml
  appender:
    console:
      # 控制台输出模板
      pattern: "[%d{HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%-4.4line] [%tid] - %.-500msg%n"
    rollingFile:
      # 日志文件
      fileName: logs/${spring.application.name}.log
      # 日志文件输出模板
      pattern: "[%d{HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%-4.4line] [%tid] - %.-500msg%n"
      # 文件rolling归档
      fileNamePattern: logs/%d/${spring.application.name}.%i.log.zip
      # 文件rolling触发大小
      fileMaxSize: "128MB"
      # 文件rolling保留天数
      maxHistory: 30
  loggers:
    root:
      # 日志打印级别
      level: INFO
    # 特殊包打印级别定义
    logger:
      name: com.dbses.open.casslog
      level: DEBUG
  • casslog.loggers.root.level

    此配置项配置的日志打印级别是全局的。

  • casslog.loggers.logger.namecasslog.loggers.logger.level

    这两项配置通常成对出现,可对某个包下面的日志级别进行局部配置。

4.2 日志长度限制

通过配置中心可配置日志内容打印的长度:

casslog:
  appender:
    console:
      pattern: "[%d{HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%-4.4line] [%tid] - %.-500msg%n"
    rollingFile:
      pattern: "[%d{HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%-4.4line] [%tid] - %.-500msg%n"

%.-500msg表示最多打印 500 个字符,超出 500 的部分不显示。

4.3 异步日志打印

对于大文本日志内容,同步打印耗时很长。

测试代码如下:

@Slf4j
@RestController
public class PerformanceController {

    @GetMapping("performance")
    public void performance(@RequestParam(name = "count", defaultValue = "1000") int count) {
        long begin = System.currentTimeMillis();
        Marker timeMarker = MarkerFactory.getMarker("performance");
        String payload = IntStream.rangeClosed(1, 1000000)
                .mapToObj(i -> "a")
                .collect(Collectors.joining("")) + UUID.randomUUID().toString();
        IntStream.rangeClosed(1, count).forEach(i -> log.info(timeMarker, "{} {}", i, payload));
        log.info("took {} ms", System.currentTimeMillis() - begin);
    }

}

count分别为 1000、10000 时,同步打印耗时如下:

[17:54:51.412] [http-nio-30001-exec-1] [INFO ] [c.c.o.c.async.PerformanceController:30] [TID: N/A] - took 6547 ms
[17:56:05.623] [http-nio-30001-exec-2] [INFO ] [c.c.o.c.async.PerformanceController:30] [TID: N/A] - took 68966 ms

使用 Casslog 异步打印(异步队列大小配置为 1000),打印耗时如下:

[17:58:15.787] [http-nio-30001-exec-1] [INFO ] [c.c.o.c.async.PerformanceController:30] [TID: N/A] - took 1628 ms
[17:58:33.934] [http-nio-30001-exec-2] [INFO ] [c.c.o.c.async.PerformanceController:30] [TID: N/A] - took 12726 ms

可见性能有较大幅度的提升。

4.4 打印 Skywalking traceid

casslog:
  appender:
    console:
      pattern: "[%d{HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%-4.4line] [%tid] - %.-500msg%n"
    rollingFile:
      pattern: "[%d{HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%-4.4line] [%tid] - %.-500msg%n"

%tid表示 Skywalking 的 traceid。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.