头图

文盘Rust -- 给程序加个日志

作者:贾世闻

日志是应用程序的重要组成部分。无论是服务端程序还是客户端程序都需要日志做为错误输出或者业务记录。在这篇文章中,我们结合[log4rs](https://github.com/estk/log4rs)聊聊rust 程序中如何使用日志。

[log4rs](https://github.com/estk/log4rs)类似java生态中的log4j,使用方式也很相似

log4rs中的基本概念

log4rs 的功能组件也由 appender 和 logger构成。

·appender

  负责向指定文件或控制台追加日志 

·logger

  包含多个 appender ,比如一条日志既要输出到控制台也要持久化到日志文件中,就可以在logger中同时绑定 ConsoleAppender 和 FileAppender 

log4rs 使用示例

·示例描述

  我们需要在工程中记录系统日志和业务日志,分别记录在logs/sys.log 和 logs/business.log

·定义 appender 和 logger 并初始化

  代码位置 src/logger/logger.rs

   let sys_file = FileAppender::builder()
       .encoder(Box::new(PatternEncoder::new("{d} - {m}{n}")))
       .build("logs/sys.log")
       .unwrap();
   let business_file = FileAppender::builder()
       .encoder(Box::new(PatternEncoder::new("{d} - {m}{n}")))
       .build("logs/business.log")
       .unwrap();

   let stdout = ConsoleAppender::builder().build();

   let config = Config::builder()
       .appender(Appender::builder().build("stdout", Box::new(stdout)))
       .appender(Appender::builder().build("sys", Box::new(sys_file)))
       .appender(Appender::builder().build("business", Box::new(business_file)))
       .logger(
           Logger::builder()
               .appender("sys")
               .build("syslog", LevelFilter::Info),
       )
       .logger(
           Logger::builder()
               .appender("business")
               .build("businesslog", LevelFilter::Info),
       )
       .build(
           Root::builder()
               .appender("stdout")
               .appender("file_out")
               .build(LevelFilter::Info),
       )
       .unwrap();

   let _ = log4rs::init_config(config).unwrap();

代码中定义了 sys\_file 和 business\_file 两个FileAppender 分别用于像sys.log 和 business.log中追加日志。

config 中定义了两个logger 分别绑定 sys appender 和 business appender。

最后通过 init_config 初始化 log4rs。

 ·在程序中输出日志

   · 定义 uselog 命令及两个子命令,分别输入sys 日志和 business 日志。

      代码位置 src/cmd/cmdusedifflogger.rs

 pub fn new_use_sys_log_cmd() -> Command<'static> {
     clap::Command::new("syslog").about("append to syslog")
 }
 
 pub fn new_use_business_log_cmd() -> Command<'static> {
     clap::Command::new("businesslog").about("append to business log")
 }

·解析命令并输出日志

      代码位置 src/cmd/rootcmd.rs

  if let Some(ref log) = matches.subcommand_matches("uselog") {
      println!("use log");
      if let Some(_) = log.subcommand_matches("syslog") {
          log::info!(target:"syslog","Input sys log");
      }  
      if let Some(_) = log.subcommand_matches("businesslog") {
          log::info!(target:"businesslog","Input business log");
      }
  }

输出时,通过 target 来区分输出到不同的logger。

本文代码的github地址:https://github.com/jiashiwen/...

下期见

1 声望
0 粉丝
0 条评论
推荐阅读
感受 Vue3 的魔法力量
• setup语法糖&lt;script setup lang=&quot;ts&quot;&gt;摆脱了书写声明式的代码,用起来很流畅,提升不少效率

京东云开发者4阅读 816

封面图
Jupyter Notebook入门指南
作者:京东科技隐私计算产品部 孙晓军1. Jupyter Notebook介绍 图1 Jupter项目整体架构[[链接]]Jupyter Notebook是一套基于web的交互式开发环境。用户可以在线开发和分享包含代码和输出的交互式文档,支持实时...

京东云开发者1阅读 743

封面图
新一代云原生日志架构 - Loggie的设计与实践
Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒、中国工商银行的紧密协作。广泛的生态,使得项目能够基于业务需求不断完善、成熟。目前已经开源:[链接]

网易数帆3阅读 560

封面图
百度工程师浅谈分布式日志
导读 我们做软件开发时,或多或少的会记录日志。由于日志不是系统的核心功能,常常被忽视,定位问题的时候才想起它。本文由浅入深的探讨不起眼的日志是否重要,以及分布式架构下的日志运维工具应该具备哪些能力,...

百度Geek说3阅读 349

2023-01-02 技术周刊
阅读与一句话奋斗只是一种行动的昭示,而实际的行动却应该有详细的计划,清楚的段落,坚定的意志和力量。——戴尔·卡耐基资讯Stack Overflow 2022 年度开发者调查报告全新 QQ Linux 3.0 正式上线 其他平台的客户端 ...

magnesium1阅读 720

封面图
Rust 初步研究
StackOverflow 公布了报告 Rust 连续 7 年成为“最受欢迎”的语言。越来越多的公司准备在新项目上运用它来加强安全和性能上的保障: Gooogle、FaceBook、亚马逊等大公司内部都有开始在底层系统上用 Rust 替代部分C/...

混沌福王阅读 1.2k

字节跳动在 Rust 微服务方向的探索和实践
近日, Qcon全球软件开发大会2022(上海站)圆满落幕,大会是由InfoQ 中国主办的综合性技术盛会,近百位国内外技术大咖现场分享前沿技术案例与创新实践。本文整理自字节跳动火山引擎基础架构服务框架工程师吴迪于...

CloudWeGo阅读 1.1k

封面图
1 声望
0 粉丝
宣传栏