当前位置: 首页 > news >正文

rust - 使用log4rs打印日志

本文提供了一种通过log4rs库记录日志的方法。这里没有采用读取yaml文件的方式,而是通过对象构造的方式来初始化日志,用于发包时不带配置文件的场景。

初始化日志

在release环境,仅需要将日志打印到文件中,而日常开发时,为了方便调试代码,需要将日志同时打印到文件和终端控制台中,而且日志级别也不相同。可以通过如下宏判断环境。

#[cfg(debug_assertions)]

不同的环境采用不同的初始化方式。

use log::LevelFilter;
use log4rs::append::console::ConsoleAppender;
use log4rs::append::file::FileAppender;
use log4rs::config::{Appender, Config, Root};
use log4rs::encode::pattern::PatternEncoder;
use std::path::Path;#[cfg(debug_assertions)]
pub fn init_log<P: AsRef<Path>>(log_path: P) {let file = FileAppender::builder().encoder(Box::new(PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)}|{l}|{m}|{n}",))).build(log_path).unwrap();let stdout = ConsoleAppender::builder().encoder(Box::new(PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)}|{l}|{m}|{n}",))).build();let config = Config::builder().appender(Appender::builder().build("stdout", Box::new(stdout))).appender(Appender::builder().build("file", Box::new(file))).build(Root::builder().appender("stdout").appender("file").build(LevelFilter::Debug),).unwrap();let _ = log4rs::init_config(config).unwrap();
}#[cfg(not(debug_assertions))]
pub fn init_log<P: AsRef<Path>>(log_path: P) {let file = FileAppender::builder().encoder(Box::new(PatternEncoder::new("{d(%Y-%m-%d %H:%M:%S)}|{l}|{m}|{n}",))).build(log_path).unwrap();let config = Config::builder().appender(Appender::builder().build("file", Box::new(file))).build(Root::builder().appender("file").build(LevelFilter::Info)).unwrap();
}

单元测试

use log::debug;
use std::env;#[test]
fn test_init_log() {let log_path = env::current_dir().unwrap().join("tests/test.log");init_log(log_path.as_path());debug!("test_init_log")
}

打印的日志内容如下

2024-03-23 22:35:40|DEBUG|test_init_log|
http://www.lryc.cn/news/328025.html

相关文章:

  • 数据结构:单调栈和单调队列
  • 大模型RAG性能提升路径
  • 机器视觉学习(九)—— 边缘检测
  • 基于单片机声音分贝采集和显示控制系统设计
  • CentOS使用Docker部署Halo并结合内网穿透实现公网访问本地博客
  • 打造高效自动化渗透测试系统:关键步骤与实践
  • 绿联 部署vocechat,搭建私人聊天服务器,用于小型团队和家庭环境
  • 考研数学|高效刷透汤家凤《1800》经验分享
  • LLM推理入门指南②:深入解析KV缓存
  • 上采样技术在语义分割中的应用
  • linux 组建raid5详细操作
  • 机器学习概念、步骤、分类和实践
  • 钉钉服务端API报错 错误描述: robot 不存在;解决方案:请确认 robotCode 是否正确
  • Linux 开发环境以及编译链接
  • SmartChart的部署以及可能遇见的报错解决方案
  • 【Node.js从基础到高级运用】十九、Node.js 捕获错误之“未捕获的异常”
  • vue 计算属性
  • RedissonLock-tryLock-续期
  • MSTP环路避免实验(华为)
  • IoT网关在智能制造工厂生产线监控与管理中的应用-天拓四方
  • niushop单商户V5多店版源码分享三端uniapp打包方法包括PC端_小程序或h5端打包_收银端打包_APP端打包_商户端
  • npm包发布
  • C#使用SQLite(含加密)保姆级教程
  • C# 异步与 Unity 协程(实例讲解)
  • iOS - Runloop介绍
  • 探究分布式事务:深入ACID特性在分布式系统中的挑战与解决方案
  • PCI总线管脚定义(引脚定义)
  • 万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)
  • 数据库索引及优化
  • flink: 将接收到的tcp文本流写入HBase