Rust 实现日志记录功能
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 字段只支持console、file、rolling_file 三种实现
- encoder: 负责将 log 信息转换为合适的格式, 如固定格式的平文本或json
- pattern:编码模板,格式可配置,具体格式详见pattern
- policy:策略字段,策略必须具有 kind 字段,默认(且仅受支持)策略为 kind: compound
- trigger:触发器字段用于指示何时滚动日志文件,支持 size 和 time 两种类型,这里使用的是按大小
运行项目
修改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 实现日志记录功能的更多相关文章
- HAproxy增加日志记录功能和自定义日志输出内容、格式
http://blog.51cto.com/eric1/1854574 一.增加haproxy日志记录功能 1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我 ...
- 如何自行给指定的SAP OData服务添加自定义日志记录功能
有的时候,SAP标准的OData实现或者相关的工具没有提供我们想记录的日志功能,此时可以利用SAP系统强大的扩展特性,进行自定义日志功能的二次开发. 以SAP CRM Fiori应用"My ...
- mysql-开启日志记录功能
开启日志记录功能 -- 开启功能 SET GLOBAL general_log = ON; -- 保存到文件 SET GLOBAL log_output = 'file'; 查看日志内容 -- 查看日 ...
- 个人理解---在开发中何时加入日志记录功能[java]
是这样的:俩个月前做的一个小功能,今天经理突然问我这个'清除复投记录'功能是不是我做的,我说是,很久以前了.他说昨天一个客户找过来了,后台把人家的复投记录清除掉了,不知道何时清除的,我记得当时做的时候 ...
- tp5下通过composer实现日志记录功能
tp5实现日志记录 1.安装 psr/log composer require psr/log 它的作用就是提供一套接口,实现正常的日志功能! 我们可以来细细的分析一下,LoggerInterface ...
- 在SpringBoot中用SpringAOP实现日志记录功能
背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl( ...
- iptables log日志记录功能扩展应用:iptables自动配置临时访问策略,任意公网登录服务器
一.修改日志记录: 1. 修改配置文件: vi /etc/rsyslog.conf 添加以下内容 #iptables log kern.=notice /var/log/iptables.log 2. ...
- springcloud zuulfilter 实现get,post请求日志记录功能
import com.alibaba.fastjson.JSONObject; import com.idoipo.infras.gateway.open.model.InvokeLogModel; ...
- php之框架增加日志记录功能类
<?php /* 思路:给定文件,写入读取(fopen ,fwrite……) 如果大于1M 则重写备份 传给一个内容, 判断大小,如果大于1M,备份 小于则写入 */ class Log{ // ...
- 使用日志记录功能查看PHP扩展的执行过程
了解过PHP内核的同学都知道,PHP的一次请求的生命周期 1.启动Apache后,PHP解释程序也随之启动.PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态 2.当一个页面请求发生时, ...
随机推荐
- 信捷电气 - C++工程师面试题(社招:3-5年工作经验)
1. char i = 1; printf("%d",i); // char字节用printf以整数型打印出来 2. int (*a[10])int a[10]是函数指针数组 ...
- GDI快速遍历位图像素
使用DIB部分可直接快速访问像素 例如,此测试将记事本中的所有白色像素替换为绿色像素 HDC hDCScreen = GetDC(NULL); HWND hWndDest = FindWindow(L ...
- 学习go语言编程之并发编程
并发基础 并发包含如下几种主流的实现模型: 多进程 多线程 基于回到的非阻塞/异步IO 协程 协程 与传统的系统级线程和进程相比,协程最大的优势在于"轻量级",可以轻松创建上百万个 ...
- Qt三方库开发技术(一):QuaZIP介绍、编译和使用
前言 Qt使用一些压缩解压功能,探讨过libzip库,zlib库,libzip库比较原始,还有其他库,都比较基础,而在基础库之上,又有高级封装库,Qt中的QuaZIP是一个很好的选择. 本文主要 ...
- del,str,repr,call,bool,add,len等魔术方法以及与类相关的魔术属性---day23
1.__del__ # ### __del__魔术方法(析构方法) ''' 触发时机:当对象被内存回收的时候自动触发(1.页面执行完毕回收所有变量2.所有对象被del的时候) 功能:对象使用完毕后资源 ...
- HAProxy端口资源耗尽的解决办法
项目背景 系统使用HAProxy为mq和部分应用的负载均衡服务.近期,瞬时流量过大,导致出现连锁反应,HA开始波动. HAProxy版本:1.6.3 问题分析 心跳检测大量失败,项目状态极不稳定.观察 ...
- 从0开始入门智能知识库和星火大模型,打造AI客服。
介绍FastWiki FastWiki是一个高性能.基于最新技术栈的知识库系统,旨在为大规模信息检索和智能搜索提供解决方案.它采用微软Semantic Kernel进行深度学习和自然语言处理,在后端使 ...
- Dashboard、Rancher与KubeSphere对比
在容器技术和微服务架构日益盛行的今天,对于容器编排和管理平台的选择显得尤为重要.Kubernetes(K8s)作为容器编排的事实标准,其生态系统中涌现出了许多管理和监控工具.其中,Dashboard. ...
- ACER 宏碁 笔记本无法进入 grub 引导 + 安全启动失败(security boot fail ) 解决办法
主要介绍让BIOS首先引导grub的方法 加一点:添加完新的启动选项以后,如果看不到添加的启动项,就先保存重启,再进 BIOS 就可以看到了 我是宏碁的笔记本,装了双系统.之前无意间进了一次 BIOS ...
- Ubuntu设置初始root密码,开启远程访问
[Ubuntu设置初始root密码,开启远程访问] 初始化root密码 ubuntu安装好后,root初始密码(默认密码)不知道,需要设置. 先用安装时候的用户登录进入系统 输入:sudo passw ...