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.当一个页面请求发生时, ...
随机推荐
- Windows 进程的一些学习笔记
进程的内存映像是指内核在内存中如何存放可执行程序文件. 在将程序转化为进程的过程中,操作系统将可执行程序由硬盘复制到内存. 可执行程序和内存映像的区别 可执行程序位于磁盘中而内存映像位于内存中: 可执 ...
- 揭秘一线大厂Redis面试高频考点(3万字长文、吐血整理)
## # 3万+长文揭秘一线大厂Redis面试高频考点,整理不易,求一键三连:点赞.分享.收藏 本文,已收录于,我的技术网站 aijiangsir.com,有大厂完整面经,工作技术,架构师成长之路,等 ...
- OpenCV开发笔记(六十二):红胖子8分钟带你深入了解亚像素角点检测(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- python如何多版本共存
1. 先正常安装多个python版本,比如我电脑里面是安装的3.10以及3.12 2. 安装的时候建议不要选择系统盘,可以用两个目录安装,例如: d:\py310\... d:\py312\... 3 ...
- 【Azure 环境】Azure 的PaaS服务如果涉及到安全漏洞问题后,我们如何确认所用服务的实例(VM:虚拟机)的操作系统已修复该补丁呢?
问题描述 如上图中PaaS所不可见区域, 操作系统级别的内容我们并不知道具体的内容.如果当出现新的操作系统级别的安全漏洞时候,我们如何来确认当前所使用的Azure PaaS服务所在主机的OS已经修复了 ...
- 万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程
万字长文学会对接 AI 模型:Semantic Kernel 和 Kernel Memory,工良出品,超简单的教程 目录 万字长文学会对接 AI 模型:Semantic Kernel 和 Kerne ...
- [Python] 通过md5去重 筛选文件代码
这是一些代码记录 这次是帮朋友恢复硬盘,扫描到的结果包含了好多个分区,通过将分区中的数据导出发现很多文件是重复的.所以想到通过python代码去重. 首先把所有分区的图片文件都放到一个文件夹A中,如果 ...
- 链接服务器导致SQL Server停止响应
概要 如果多个实例中同时存在数据源为对方实例的链接服务器,并且开启了"分发服务器"的属性,您可能会遇到这种情况. 1 现象 14:31时,在SSMS中检查HIS实例是否有复制订阅时 ...
- JAVA微服务分布式事务的几种实现方式
基础理论 CAP理论 一致性(Consistency) :在分布式系统中所有的数据备份,在同一时刻都保持一致状态,如无法保证状态一致,直接返回错误: 可用性(Availability):在集群中一部分 ...
- iOS使用Unity容器动态加载3D模型
项目背景 我们的APP是一个数字藏品平台,里面的很多藏品需要展示3D模型,3D模型里面可能会包含场景,动画,交互.而对应3D场景来说,考虑到要同时支持iOS端,安卓端,Unity是个天然的优秀方案. ...