如何阻止Wine运行程序时产生的Compiz错误日志在journalctl中刷屏
我完全懂这种日志刷屏的痛苦——明明程序能正常用,但日志疯狂占磁盘空间,旧日志还被快速挤掉,太闹心了。针对你在Ubuntu 20.04上用Wine 8.21 Staging跑钉钉时遇到的Compiz+Wine日志刷屏问题,结合你的环境(Compiz 0.9.14.1),给你几个精准的解决办法:
方法1:调低Wine日志级别,屏蔽fixme类提示
你日志里大量的0078:fixme:icon:...、08ac:fixme:gdiplus:...这类条目,都是Wine的未实现功能提示(fixme),属于非致命警告,完全没必要记录到journal里。我们可以通过调整WINEDEBUG环境变量,只保留错误级别的日志:
临时生效(单次运行程序)
启动钉钉时直接指定环境变量:
WINEDEBUG=-all,+err wine /path/to/your/DingTalk.exe
-all:关闭所有Wine日志+err:仅保留错误级别的日志输出
永久生效(所有Wine程序)
编辑你的bash配置文件(比如~/.bashrc),添加一行:
export WINEDEBUG=-all,+err
保存后执行source ~/.bashrc让配置生效,之后所有Wine程序都会默认用这个日志级别。
方法2:过滤Compiz本身的错误日志
针对那条反复出现的Compiz错误:
ERROR 2023-12-09 15:11:22 unity.decoration.shape DecorationsShape.cpp:78 Failed to get shape rectangles
我们可以直接通过systemd-journald的过滤规则,让journald彻底忽略这条日志:
- 创建journald的自定义配置文件:
sudo nano /etc/systemd/journald.conf.d/filter-compiz-wine.conf
- 写入以下内容:
[Journal] FilterPattern=NOT "unity.decoration.shape DecorationsShape.cpp:78 Failed to get shape rectangles"
- 重启journald服务使配置生效:
sudo systemctl restart systemd-journald
这样这条烦人的Compiz错误就不会再被记录到journal里了。
方法3:用Systemd Service彻底隔离Wine程序的日志
如果想一劳永逸,让这个Wine程序的所有输出都不进入journal,可以创建一个Systemd用户服务来管理钉钉:
- 创建服务文件:
nano ~/.config/systemd/user/dingtalk.service
- 写入以下内容(注意替换钉钉的实际路径):
[Unit] Description=DingTalk Launched via Wine [Service] ExecStart=/usr/bin/wine /path/to/your/DingTalk.exe # 把标准输出和错误输出重定向到/dev/null StandardOutput=null StandardError=null # 同时结合Wine日志级别限制 Environment=WINEDEBUG=-all,+err # 可选:程序崩溃时自动重启 Restart=on-failure [Install] WantedBy=default.target
- 重载Systemd配置并启动服务:
systemctl --user daemon-reload systemctl --user start dingtalk.service
- (可选)设置开机自启:
systemctl --user enable dingtalk.service
这种方式会把Wine程序的所有输出直接丢弃,完全不会污染journal日志。
验证效果
设置完成后,启动钉钉,然后运行journalctl -f实时监控日志,你会发现之前刷屏的那些fixme和Compiz错误都消失了,journal终于清净了!
备注:内容来源于stack exchange,提问作者Jerry Ding




