rust输出日志文件

前言

​ log是Rust的logging facade,可以理解为面向对象语言中的接口,它由官方提供维护工作。提供了一套标准宏用来记录日志,级别从低到高依次为:trace! < debug! < info! < warn! < error!。还提供了log!log_enabled!宏,log!需要手动指定日志等级;log_enabled!用来判断是否启用了某个日志级别,如if log_enabled!(Debug)时,做一些特定的处理。

​ 上面提到log类似于接口,所以在使用的时候他不会有任何输出,我们需要给log引入具体的实现,像env_logger、log4rs等。由于env_logger不能输出到文件,本文将详细介绍log4rs的使用。

使用log4rs

log4rs是一个高度可配置的日志框架,模仿的Java的Logback和log4j库。

在Cargo.toml中加入依赖

[dependencies]
log = "0.4.17"
log4rs = "1.1.1"

main.rs

在main.rs中加入

use log::warn;

fn main() {
    // 初始化
    log4rs::init_file("log4rs.yaml", Default::default()).unwrap();
    // 输出warn日志
    warn!("测试日志");
    println!("Hello, world!");
}

新建log4rs.yaml文件

加入如下内容:

# 检查配置文件变动的时间间隔
refresh_rate: 30 seconds
# appender 负责将日志收集到控制台或文件, 可配置多个
appenders:
  stdout:
    # 控制台输出
    kind: console
    encoder:
      # 格式可配置,具体格式详见:
      # https://docs.rs/log4rs/1.0.0/log4rs/encode/pattern/index.html
      pattern: "{d} - {m}{n}"
  
  file:
    # 输出到文件
    kind: file
    path: logs/test.log
    append: true
    encoder:
      pattern: "{d} - {m}{n}"

  rolling_file:
    # 输出到滚动文件
    kind: rolling_file
    # 日志路径
    path: logs/test.log
    # 追加模式, 即每次在已有文件末尾添加日志, 默认为 true
    append: true 
    encoder:
      pattern: "{d} - {m}{n}"
    policy:
      kind: compound
      # 触发器
      trigger:
        kind: size
        limit: 10 mb
      # 分割策略
      # roller:
      #   # 删除
      #   kind: delete
      roller:
        # 固定窗口
        # 每次都往test.log中写入文件,test.log文件达到触发策略时,分割文件后移一位。
        # 即触发时,创建test.1.log文件,原test.1.log文件变为test.2.log文件,依次顺延,但只保留设置的日志数量,多余的删除。
        kind: fixed_window
        # 分割文件名称
        pattern: logs/test.{}.log
        # 从1开始
        base: 1
        # 保留五个日志
        count: 5
        
# 对全局 log 进行配置
root:
  # 配置输出的日志级别 
  # trace < debug < info < warn < error
  level: warn 
  # 配置输出appender
  appenders:
    - stdout
    # rolling_file和file选一个即可
    - rolling_file

# 对特定工程进行配置,可选
loggers:
  app::backend::db:
    level: info

  app::requests:
    level: info
    appenders:
      - stdout
    # 不继承全局配置的appenders,不设置时会使用全局的appenders+自己的appenders
    additive: false
posted @ 2023-05-10 15:56  gaozejie  阅读(1565)  评论(0编辑  收藏  举报