尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

【Rust GUI开发入门】编写一个本地音乐播放器(15. 记录运行日志) - Jordan
📅 发布时间:2026/6/19 1:49:34

本系列教程对应的代码已开源在 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);}));...
}

相关新闻

  • ROS2之服务
  • macOS上优雅运行Docker容器
  • 使用IOT-Tree Server依据MC协议连接三菱Q系列PLC

最新新闻

  • Selenium八大元素定位方法全解析:从原理到实战,解决自动化测试核心难题
  • 2026黄冈最新黄金回收价格参考表及无套路商家推荐 - 润富黄金回收
  • 杭州琳弘湾万金汇金裕恒福满多黄金回收门店实测 - 润富黄金回收
  • 按摩椅双推杆泰式拉筋与普通拉伸效果差异先对照推杆行程与拉伸角度 - 新闻快传
  • 深入解析UART异步串行通信:从分数分频器到硬件流控制
  • 考研政治网课哪家押题准? - 新闻快传

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号