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

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

本系列教程对应的代码已开源在 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.rkmt.cn/news/15029.html

相关文章:

  • ROS2之服务
  • macOS上优雅运行Docker容器
  • 使用IOT-Tree Server依据MC协议连接三菱Q系列PLC
  • 网络流 最小割 Dinic算法
  • 15.VLANIF(2025年9月30日) - 教程
  • Pdfminer-Vulnerability-Research
  • 10.2笔记
  • Spring Boot 内置日志框架 Logback - 以及 lombok 介绍 - 教程
  • CF VP 记录
  • 原来你是这样的claude code aciton:没想象中好
  • FlareOn1 -- 5get_it
  • python语言手势控制音乐播放器代码QZQ
  • 2025 编码器厂家 TOP 企业品牌推荐排行榜,无磁,光学,脉冲,绝对型,伺服,机械多圈,工业,二进制,拉线编码器公司推荐
  • Spark专题-第三部分:性能监控与实战优化(1)-认识spark ui - 指南
  • 2025 年等离子清洗机厂家 TOP 企业品牌推荐排行榜,大气,真空,宽幅,微波,自动化,常压,低温,大腔体,射频,DBD,介质阻挡放电等离子清洗机公司推荐!
  • 完整教程:如何优雅的布局,height: 100% 的使用和 flex-grow: 1 的 min-height 陷阱
  • 2025担保合同律师事务所推荐,专业团队高效解决法律难题!
  • 2025年筒袋磁力泵实力厂家推荐榜:高效耐用与创新技术深度解
  • Android项目实现自动获取手机号一键登录功能
  • Qt编程: 正则表达式分析 - 实践
  • Manim实现渐变填充特效
  • Spring Boot 集成 Redis 全方位详解 - 指南
  • 十月牛气冲天计数题没做
  • datadome 隐私模式 ck设置
  • CPU温度查看(Core Temp)
  • 深入解析:python学智能算法(三十九)|使用PyTorch模块的normal()函数绘制正态分布函数图
  • 2025污水处理设备厂家 TOP 企业品牌推荐排行榜,一体化,生活,工业,养殖,医疗,农村,学校,餐厨,隧洞,高速污水处理设备公司推荐!
  • 详细介绍:告别“下次注意”,用这套结构化事故复盘方案就对了
  • 关于树状数组的一些东西
  • [问题记录] vmagent 增加 aggregation 表达式后,CPU 上升 2.43 倍, 内存上升 3.82 倍