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. 信捷电气 - C++工程师面试题(社招:3-5年工作经验)

    1. char i = 1; printf("%d",i);    // char字节用printf以整数型打印出来 2. int (*a[10])int a[10]是函数指针数组 ...

  2. GDI快速遍历位图像素

    使用DIB部分可直接快速访问像素 例如,此测试将记事本中的所有白色像素替换为绿色像素 HDC hDCScreen = GetDC(NULL); HWND hWndDest = FindWindow(L ...

  3. 学习go语言编程之并发编程

    并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...

  4. Qt三方库开发技术(一):QuaZIP介绍、编译和使用

    前言   Qt使用一些压缩解压功能,探讨过libzip库,zlib库,libzip库比较原始,还有其他库,都比较基础,而在基础库之上,又有高级封装库,Qt中的QuaZIP是一个很好的选择.  本文主要 ...

  5. del,str,repr,call,bool,add,len等魔术方法以及与类相关的魔术属性---day23

    1.__del__ # ### __del__魔术方法(析构方法) ''' 触发时机:当对象被内存回收的时候自动触发(1.页面执行完毕回收所有变量2.所有对象被del的时候) 功能:对象使用完毕后资源 ...

  6. HAProxy端口资源耗尽的解决办法

    项目背景 系统使用HAProxy为mq和部分应用的负载均衡服务.近期,瞬时流量过大,导致出现连锁反应,HA开始波动. HAProxy版本:1.6.3 问题分析 心跳检测大量失败,项目状态极不稳定.观察 ...

  7. 从0开始入门智能知识库和星火大模型,打造AI客服。

    介绍FastWiki FastWiki是一个高性能.基于最新技术栈的知识库系统,旨在为大规模信息检索和智能搜索提供解决方案.它采用微软Semantic Kernel进行深度学习和自然语言处理,在后端使 ...

  8. Dashboard、Rancher与KubeSphere对比

    在容器技术和微服务架构日益盛行的今天,对于容器编排和管理平台的选择显得尤为重要.Kubernetes(K8s)作为容器编排的事实标准,其生态系统中涌现出了许多管理和监控工具.其中,Dashboard. ...

  9. ACER 宏碁 笔记本无法进入 grub 引导 + 安全启动失败(security boot fail ) 解决办法

    主要介绍让BIOS首先引导grub的方法 加一点:添加完新的启动选项以后,如果看不到添加的启动项,就先保存重启,再进 BIOS 就可以看到了 我是宏碁的笔记本,装了双系统.之前无意间进了一次 BIOS ...

  10. Ubuntu设置初始root密码,开启远程访问

    [Ubuntu设置初始root密码,开启远程访问] 初始化root密码 ubuntu安装好后,root初始密码(默认密码)不知道,需要设置. 先用安装时候的用户登录进入系统 输入:sudo passw ...