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

【Rust GUI开发入门】编写一个本地音乐播放器(15. 记录运行日志)

本系列教程对应的代码已开源在 Github zeedle

本篇文章介绍如何将音乐播放器的运行情况持久化记录到日志文件中,这对分析程序意外情况出现的原因很有帮助!

使用最常用的env_logger,将其添加到Cargo.toml中:

env_logger = "0.11.8"

将日志同时输出到控制台和文件

与最普通的单输出不同,我们希望同时将日志输出到控制台日志文件中,这是因为:

  • 在调试程序的时候,将日志输出到控制台较为简便和迅速,打开日志文件进行观察太费时间了
  • 程序打包分发之后,以release模式运行,我们不希望出现一个黑框控制台,所以只能持久化到文件中,出现BUG时打包日志文件反馈给开发者

env_logger不直接支持多目标输出,需要自己定义输出Target

use std::{fs,io::{self, Write},path::{Path, PathBuf},
};use env_logger::Target;
use log::LevelFilter;struct MultiWriter {console: Box<dyn Write + Send>,file: Box<dyn Write + Send>,
}impl Write for MultiWriter {fn write(&mut self, buf: &[u8]) -> io::Result<usize> {self.console.write(buf)?;self.file.write(buf)}fn flush(&mut self) -> io::Result<()> {self.console.flush()?;self.file.flush()}
}fn get_log_path() -> PathBuf {let f_name = ".zeedle.log";if let Some(mut p) = home::home_dir() {p.push(f_name);p} else {PathBuf::from(f_name)}
}pub fn init_default_logger(path: Option<impl AsRef<Path>>) {let log_path = if let Some(p) = path {p.as_ref().to_path_buf()} else {get_log_path()};if log_path.exists() {if fs::metadata(&log_path).unwrap().len() > 1024 * 1024 * 10 {fs::remove_file(&log_path).expect("Failed to remove old log file");}}let log_file = fs::OpenOptions::new().create(true).write(true).append(true).open(&log_path).expect("can't open this file!");let log_target = Box::new(MultiWriter {console: Box::new(io::stdout()),file: Box::new(log_file),});env_logger::builder().format(move |buf, record| {writeln!(buf,"[{} | {} | {}:{}] --> {}",chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),record.level(),record.file().unwrap_or("unknown"),record.line().unwrap_or(0),record.args())}).filter(None, LevelFilter::Info) // 设置日志级别为Info.target(Target::Pipe(log_target)).init();
}

上述MultiWriter即为自己定义的日志输出Target,在输出时同时向控制台和指定文件写入日志消息,在初始化时指定此Target即可。

重定向Panic消息输出

对于GUI程序,在release模式下控制台不可见,如果不定向Panic消息,在GUI窗口异常退出时,将无法记录Panic的发生原因,给开发者修复问题增加难度。好在,Rust直接允许指定发生Panic时自定义回调函数:

fn main() {...logger::init_default_logger(None::<PathBuf>);// when panics happen, auto port errors to logstd::panic::set_hook(Box::new(|info| {log::error!("{}", info);}));...
}
http://www.dtcms.com/a/434253.html

相关文章:

  • Rust模式匹配详解
  • 石家庄做网站建设公司安徽省建设厅网站职称申报
  • gitlab-runner 再次实践中理解和学习
  • C++之stack等容器适配器(上)实战篇
  • JavaWeb零基础学习Day1——HTMLCSS
  • Starting again-01
  • 如何做网站链接使用朝阳seo建站
  • Nivo 用React打造精美数据可视化的开源利器
  • 【iOS安全】iPhone X iOS 16.7.11 (20H360) Palera1n MacOS版 越狱教程
  • 【连载4】数据库热点更新场景调优策略
  • 深入解析HarmonyOS ArkTS:从语法特性到实战应用
  • 小杰深度学习(five)——正则化、神经网络的过拟合解决方案
  • 网页网站开发大概多少钱网站设计公司 深圳龙华
  • 门户网站是什么意思?网站建设哈尔滨app开发2
  • 《吃透 C++ vector:从基础使用到核心接口实战指南》
  • wordpress上传到哪里什么网站利于优化
  • [Web网页] 零基础入门 HTML
  • Nimble:让SwiftObjective-C测试变得更优雅的匹配库
  • HTML——1px问题
  • 【C++项目】基于微服务的即使通信系统
  • wordpress企业站模板建协官网
  • 【办公类-115-04】20250920职称资料上传03——压缩课题结题报告PDF的大小(控制在200MB以内)
  • Python - 100天从新手到大师:第二十七天Python操作PDF文件
  • 做网站一般长宽多少如何线上推广引流
  • C++20 协程:在 AI 推理引擎中的深度应用
  • 如何做游戏推广seo整站优化
  • CompLLM 来了:长文本 QA 效率革命,线性复杂度 + 缓存复用,推理速度与效果双丰收
  • 嵌入式开发中用于调试的技术Semihosting
  • 企业营销型网站建设哪家好手机网站制作 尺寸
  • Python 3 与 MongoDB 的深入探索