文盘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/interactcli-rs
下期见
文盘Rust -- 给程序加个日志的更多相关文章
- 文盘Rust -- 把程序作为守护进程启动
当我们写完一个服务端程序,需要上线部署的时候,或多或少都会和操作系统的守护进程打交道,毕竟谁也不希望shell关闭既停服.今天我们就来聊聊这个事儿. 最早大家部署应用的通常操作是 "nohu ...
- 文盘Rust -- struct 中的生命周期
最近在用rust 写一个redis的数据校验工具.redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程.在开发中,不免要定义struct 中的 ...
- log4net--帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具
1. log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 2. Log4net的结构如下 ...
- ELF程序头部及程序加载
程序头部 程序头部描述与程序执行直接相关的目标文件结构信息.用来在文件中定位各个段的映像.同时包含其他一些用来为程序创建进程映像所必需的信息. 可执行文件或者共享目标文件的程序头部是一个结构数组,每个 ...
- 关于Windows平台下应用程序加载DLL模块的问题.
本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录. (3)可执行程序加载了不该加载的DLL. ( ...
- android 程序崩溃crash日志的捕捉
android 程序崩溃crash日志的捕捉 之前在项目开发过程中,一直会遇到程序崩溃了,但是测试組的哥哥们又没及时的导出日志.... 后来在诳群的时候听别人说起,腾讯有那么一个叫bugly的东西 将 ...
- C#控制台程序使用Log4net日志组件
1.Log4net一般都不陌生,但是在配置上不同类型的项目又不相同的地方比如C#控制台程序和C# MVCWeb项目,拿控制台项目为例 项目源码在文章底部 2.首先创建一个控制台程序,引入Log4n ...
- 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”
"System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer”。请确保使用限定程序集的名称且该程序集对运行的应用程序可用。有关详细信息,请参阅 http://go.m
Windows服务中程序发布之后会如下错误: 无法为具有固定名称“System.Data.SqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“Syste ...
随机推荐
- PXE批量装windows(半自动版本)
一. 环境说明: 客户端:CPU:双核 内存:4GB 内存 80GB ip地址:DHCP 服务端1:CPU:双核 内存:1GB 内存 20GB ip地址:192.168.40.254 ...
- Java代码审计sql注入
java_sec_code 该项目也可以叫做Java Vulnerability Code(Java漏洞代码). 每个漏洞类型代码默认存在安全漏洞(除非本身不存在漏洞),相关修复代码在注释里.具体可查 ...
- C#文件路径
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Run ...
- TCN代码详解-Torch (误导纠正)
TCN代码详解-Torch (误导纠正) 1. 绪论 TCN网络由Shaojie Bai, J. Zico Kolter, Vladlen Koltun 三人于2018提出.对于序列预测而言,通常考虑 ...
- chronyd为隔离网络设置时间同步
参考链接:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic ...
- [排序算法] 2路插入排序 (C++)
前言 本文章是建立在 插入排序 的基础上写的,如果还有不懂 插入排序 的童鞋先停下脚步,可以先看看这里~ 直接/折半插入排序 2路插入排序解释 在 插入排序 中,当待插入元素需要插入的位置位于当前有序 ...
- Day22:多态详解
方法的多态 1.1什么是多态? 指一个对象在不同时刻拥有不同的形态. 例:猫 cat=new 猫(): 动物 animal=new 猫(): 多态建立的条件: 建立在继承的关系上: 有方法重写: ...
- eclipse 无法将节点解析到句柄
将 干掉即可
- day13 I/O流——字节输入输出流、字符输入输出流 & File常用类 & (字节)复制大文件
day13 I/O流 定义:数据在两设备传输称为流,流是一组有顺序的,有起点和终点的字节集合 I 是input的缩写,表示输入流 O是output缩写,表示输出流 字节流(视频等) 输入InputSt ...
- 靶机练习: Vikings
靶机:Vikings 准备工作 靶机地址: https://download.vulnhub.com/vikings/Vikings.ova MD5 校验:84f72c38e2458e01d00db9 ...