log 日志库标准

log 是 Rust 的日志门面库,由官方积极维护可以放心使用。它是Rust的日志门面,相应的日志 API 已成为事实上的标准被其它日志框架所使用,有了日志门面开发者可以很方便切换自己的日志框架。

简单示例

创建一个名为 log_test 二进制项目:

cargo new log_test

执行以下命令,引入 log 依赖:

cargo add log

修改 main.rs 的代码如下:

use log::{info, warn,error,trace};

fn main() {
// 记录日志
info!("This is an info message");
warn!("This is a warning message");
error!("This is an error message");
trace!("This is an trace message");
}

运行上面的示例,实际上看不到任何输出。因为 log 仅仅是日志门面库,它并不具备完整的日志库功能

使用方法

因为 log 仅仅是日志门面库,对于库和应用的开发者来说使用方法是有区别的,这也是 log 包这么设计的优势所在。

库的开发者

作为库的开发者,你只要在库中使用门面库即可,将具体的日志库交给用户去选择和绑定:

use log::{info, trace, warn};
pub fn deal_with_something() {
// 开始处理 // 记录一些日志
trace!("a trace log");
info!("a info long: {}", "abc");
warn!("a warning log: {}, retrying", err); // 结束处理
}

应用开发者

如果是应用开发者,就需要去选择一个具体的日志库了。

目前已经有了不少日志库实现,官方在 github 上也推荐了一些 ,主要分为以下几类:

  • 简单的最小记录器,如 env_logger 等
  • 复杂的可配置框架,如 log4rs 等
  • 其他设施的适配器,如 syslog、db_logger 等
  • 对于 WebAssembly 二进制文件:console_log
  • 对于动态库:需要在日志上构造一个 FFI 安全包装器,以便在库中进行初始化。
  • 实用程序,如 alterable_logger 等

log 还提供了 set_logger 函数用于设置日志库,set_max_level 用于设置最大日志级别。但是选用的具体日志库往往会提供更高级的 API,无需手动调用这两个函数。

日志库开发者

对于日志库开发者而言,自然要实现自己的 Log 特征:

use log::{Record, Level, Metadata};
struct SimpleLogger;
impl log::Log for SimpleLogger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= Level::Info
}
fn log(&self, record: &Record) {
if self.enabled(record.metadata()) {
println!("{} - {}", record.level(), record.args());
}
}
fn flush(&self) {}
}

除此之外,还需要包装下 set_logger 和 set_max_level:

use log::{SetLoggerError, LevelFilter};
static LOGGER: SimpleLogger = SimpleLogger;
pub fn init() -> Result<(), SetLoggerError> {
log::set_logger(&LOGGER)
.map(|()| log::set_max_level(LevelFilter::Info))
}

然后再main函数里面设置全局记录器:

use log::{info, warn,error,trace};

fn main() {
//设置日志
init();
// 记录日志
info!("This is an info message");
warn!("This is a warning message");
error!("This is an error message");
trace!("This is an trace message");
}

运行后终端输出如下,因为设置日志等级为Info,所以没有输出Trace等级日志:

INFO - This is an info message
WARN - This is a warning message
ERROR - This is an error message

使用 log4rs

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

添加依赖

为项目添加 log4rs 依赖:

cargo add log4rs

配置文件

在项目根目录下,创建一个 log4rs.yaml 配置文件,并添加以下内容:

refresh_rate: 30 seconds

appenders:
stdout:
kind: console
encoder:
pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{l}] {t} - {m}{n}" rolling_file:
kind: rolling_file
path: logs/test.log
append: true
encoder:
pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{l}] {t} - {m}{n}"
policy:
kind: compound
trigger:
kind: size
limit: 10 mb
roller:
kind: fixed_window
pattern: logs/test.{}.log
base: 1
count: 5 root:
level: info
appenders:
- stdout
- rolling_file

上面配置文件设定日志输出到控制台、文件,文件按10 mb大小滚动,只保留最近五个文件。各个配置字段的具体含义可以参考配置

  • refresh_rate:检查配置文件变动的时间间隔
  • appender: 负责将日志收集到文件、控制台或系统日志, 可配置多个
  • stdout、rolling_file:为每个追加器配置的一个唯一标识字符串,自己随便定义,它的 kind 字段只支持consolefilerolling_file 三种实现
  • encoder: 负责将 log 信息转换为合适的格式, 如固定格式的平文本或json
  • pattern:编码模板,格式可配置,具体格式详见pattern
  • policy:策略字段,策略必须具有 kind 字段,默认(且仅受支持)策略为 kind: compound
  • trigger:触发器字段用于指示何时滚动日志文件,支持 sizetime 两种类型,这里使用的是按大小

运行项目

修改main.rs内容如下:

use log::*;
use log4rs; fn main() {
log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); for i in 1..=1000 {
info!("This is loop iteration {}", i);
}
}

运行结果:

2024-04-01 15:43:28.596832500 [INFO] hello_world - This is loop iteration 1

参考文章

Rust 实现日志记录功能的更多相关文章

  1. HAproxy增加日志记录功能和自定义日志输出内容、格式

    http://blog.51cto.com/eric1/1854574 一.增加haproxy日志记录功能   1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我 ...

  2. 如何自行给指定的SAP OData服务添加自定义日志记录功能

    有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...

  3. mysql-开启日志记录功能

    开启日志记录功能 -- 开启功能 SET GLOBAL general_log = ON; -- 保存到文件 SET GLOBAL log_output = 'file'; 查看日志内容 -- 查看日 ...

  4. 个人理解---在开发中何时加入日志记录功能[java]

    是这样的:俩个月前做的一个小功能,今天经理突然问我这个'清除复投记录'功能是不是我做的,我说是,很久以前了.他说昨天一个客户找过来了,后台把人家的复投记录清除掉了,不知道何时清除的,我记得当时做的时候 ...

  5. tp5下通过composer实现日志记录功能

    tp5实现日志记录 1.安装 psr/log composer require psr/log 它的作用就是提供一套接口,实现正常的日志功能! 我们可以来细细的分析一下,LoggerInterface ...

  6. 在SpringBoot中用SpringAOP实现日志记录功能

    背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl( ...

  7. iptables log日志记录功能扩展应用:iptables自动配置临时访问策略,任意公网登录服务器

    一.修改日志记录: 1. 修改配置文件: vi /etc/rsyslog.conf 添加以下内容 #iptables log kern.=notice /var/log/iptables.log 2. ...

  8. springcloud zuulfilter 实现get,post请求日志记录功能

    import com.alibaba.fastjson.JSONObject; import com.idoipo.infras.gateway.open.model.InvokeLogModel; ...

  9. php之框架增加日志记录功能类

    <?php /* 思路:给定文件,写入读取(fopen ,fwrite……) 如果大于1M 则重写备份 传给一个内容, 判断大小,如果大于1M,备份 小于则写入 */ class Log{ // ...

  10. 使用日志记录功能查看PHP扩展的执行过程

    了解过PHP内核的同学都知道,PHP的一次请求的生命周期 1.启动Apache后,PHP解释程序也随之启动.PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态 2.当一个页面请求发生时, ...

随机推荐

  1. letcode-Z字抖动

    题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下 ...

  2. win32 - 以编程方式访问远程计算机上的文件

    第一步,在一台计算机上将某个驱动器或者某个文件夹设为sharing模式.这是我们需要访问的共享文件夹.(不需要设置everyone权限) 第二步,我们需要为两台在同一domain下的计算机上建立连接. ...

  3. 【手写信息搜集工具】ThunderSearch 闪电搜索器

    ThunderSearch 闪电搜索器 项目地址:github Windows打包版 利用ZoomEye的官方api,结合开发文档,做了这么一个GUI界面的搜索器.目前支持查询host_search ...

  4. java日期中YYYY与yyyy的区别

    date==>string string ==>date 总结: 个人觉得:当天所在的周属于的年份,一周从周日开始,周六结束,只要本周跨年,那么这周就算入下一年.这个结论在正向转换的时候是 ...

  5. 格式化占位符%r和!r

    # 作用 都是格式化原形输出,!r用于format格式化,%r用于%格式化 # 示例 a = '123' b = 'hello, {!r}'.format(a) b = 'hello, %r' % ( ...

  6. Kotlin 函数 与 lambda 表达式

    一.函数 代码块函数体: fun sum(x: Int, y: Int): Int { return x + y } 表达式函数体: fun sum(x: Int, y: Int) = x + y 使 ...

  7. 机器学习策略篇:详解单一数字评估指标(Single number evaluation metric)

    单一数字评估指标 无论是调整超参数,或者是尝试不同的学习算法,或者在搭建机器学习系统时尝试不同手段,会发现,如果有一个单实数评估指标,进展会快得多,它可以快速告诉,新尝试的手段比之前的手段好还是差.所 ...

  8. 【Azure 应用服务】本地Node.js部署上云(Azure App Service for Linux)遇到的三个问题解决之道

    问题描述 当本地Node.js(Linux + Node.js + npm + yarn)部署上云,选择 Azure App Service for Linux 环境.但是在部署时,遇见了以下三个问题 ...

  9. 【Flink入门修炼】2-1 Flink 四大基石

    前一章我们对 Flink 进行了总体的介绍.对 Flink 是什么.能做什么.入门 demo.架构等进行了讲解. 本章我们将学习 Flink 重点概念.核心特性等. 本篇对 Flink 四大基石进行概 ...

  10. sentinel 持久化

    1. 概述 在前面的关于Sentinel的使用中,可以发现,Sentinel-dashboard配置的规则,在我们的微服务以及控制台重启的时候就清空了,因为他是基于内存的. 所以我们有必要将规则配置进 ...