Skip to content

Logitor: 一个实时日志文件的实时查看器

喜闻乐见又造了一个轮子233

前言

Unity默认的日志系统感觉不好用,为了方便观察调试信息,还为了更好地利用多显示器,花了一天时间撸了一个看实时日志的工具
注意:现在这个版本只是适用于我之前弄的适用于Unity的日志增强模块
本文所介绍的工具源码在GitHub上托管
现在有做了这些功能

1. 实时显示

Unity在运行的时候会用Debug.Log()之类的方法输出日志,此时工具会实时显示结果

2. 高亮显示

如果出现了警告或者错误,工具会高亮显示异常的一行,规则按照国际标准,警告黄色,错误红色

3. 自动刷新

每当游戏终止并重新运行时,游戏会重新生成一个新的日志文件,此时工具会自动检测到新文件的存在,并清空页面内容同时开始监听读取新文件的内容

实现方法

先用Python写了一个命令行下监听日志文件的工具,所以之后封装到Electron的时候就懒得移植了,直接用node的child_process模块运行了一个Python的子进程。
工作流程是这样的:首先Python脚本实时读取最新的日志文件并通过标准输出stdout输出信息,被node获取到,使用js对原始信息进行处理排版,显示到前端页面上。如果获取到新文件的消息,则清空页面,重新开始记录。
工作流程
看上去好像也不复杂,但是还是遇到了不少坑,有几个重点

1. 两个进程同时读写同一个文件会导致冲突

至少在Windows下是这样的,一旦Python打开了日志文件,Unity在继续写入的时候就会产生异常。所以我在Python端就采取了轮询的方法,每0.1秒打开一次日志文件读取内容并马上关闭,如果内容变多了就把多出来的行print出来。当然Unity那边在输出的时候也要try一下,如果冲突的话就等到下一次写入周期再尝试。

2. 动态监测最新的日志文件

每次轮询的时候都把日志文件的目录列出来,根据文件名找到最新的日志文件,如果和当前正在监听的不一样了,那么就说明新的一次运行已经开始了,此时应当开始监听新的文件。

3. 实时获取Python脚本的输出内容

node.js的child_process模块spawn出来的进程不能“即时”地获取到Python脚本所输出的内容,Google后找到解决方案。造成这种情况的原因是Python里print之后会把数据存在缓存中而并不会立即输出,所以解决方法很简单,每次print完之后调用一次stdout的flush就行了。

4. Electron对Unicode字符的支持有问题

可能是我没找到正确的设置编码的方法,总之中文字符在被node获取到之后怎么搞都是乱码,最后决定用稍微麻烦点但是最稳妥的方案。就是在Python脚本中输出文本前先把要输出的字符串转成Unicode编码,就是\u1234这样的形式,这样一来就都是ASCII中的简单字符了,传给js后由js进行解码,还原成原本的中文字符。

5. 前端页面的一些实现细节

我毕竟不是前端程序员,弄网页啥的还是不熟练,把这些点归到同一条吧
* div尺寸动态适应页面高度
直接用js实现的,监听resize事件,变化的时候就重新计算尺寸

  • 冻结表格的标题行
    采取的方式是弄两个表格,第一个只有一行标题,第二个存储内容,然后只让第二个有滚动条就行了
有用! (0)
Published in瞎折腾

One Comment

  1. inspoy inspoy

    关于每0.1秒打开一次日志文件读取内容并马上关闭,
    当单个日志文件过于大时必然会存在性能瓶颈,不过在这个应用场景中单局游戏其实并不会太长,文件大小也有限,所以就先用了这种笨方法

    之后有空可以考虑使用文件钩子来监听文件变化,不再主动轮询而是用事件驱动的方式去检查新内容

发表评论

电子邮件地址不会被公开。 必填项已用*标注