大家有没有碰到过这种情况? 经常为了复现某个偶现问题,在开始测试时就需要打开日志一直跟踪日志到问题复现,在这个过程中,可能会经历很长时间,导致抓取到的日志文件一般都比较大,在分析日志时分析日志的工具load日志很慢,可能还会占用内存过多,导致办公系统运行变慢、变得比较卡顿。
如果碰到这种情况一般有两种处理方法:
1、优化log系统,针对保存日志的文件大小设置一个固定的size,每当日志保存超过这个size之后,就重新保存日志到另外一个文件,
以此类推,最后分析问题的时候面对就是一个个固定size大小的日志文件,避免出现较大size的日志文件导致load慢或卡顿的问题。
2、依然采用持续性记录日志,全部保存在一个文件内,但分析问题前,根据日志大小,时间情况等,对日志文件大小进行手动分割处理。
当然对于log分析而言,第一种方法显然会更友好,避免了人为手动参与,会更高效。实际中我们可能两种方法会混合使用,提高效率。
今天主要学习的是第二种方法中涉及到的一个 Linux 命令 : split 。另外也是因为最近经常在使用systrace的场景用到比较多,所以记录一下,详细如下。
使用systrace为什么会用到这个命令?
有时为了分析难复现或者复杂的问题,需要抓取尽可能多的事件的 systrace,而最后抓取到的这些 systrace 的总大小可能很大,而我本地电脑在本地一直持续在用,可能半个月都没关机过了,内存已经吃紧,浏览器本身内存也可能吃紧了,此时如果碰到一个systrace文件太大就会出现无法 load 解析了,所以就需要考虑将抓取到的 systrace 文件进行分割,分段进行解析。
此时 Linux split 这个命令就非常有用了。
split 命令可以将一个文件分割成数个。该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。通过命令参数,可以指定按照行数或者字节数进行分割。
用法:
split [--help][--version][-][-b ][-C ][-l ][要切割的文件][输出文件名]
部分说明:
- -l : 指定每多少行切成一个小文件
- -b : 指定每多少字节切成一个小文件
- -C : 与参数“-b”相似,但是在切 割时将尽量维持每行的完整性
- [输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号
比如,我想以每 10 行分割文件 testfile:
$ split -l 10 testfile
再如,过大的 systrace 文件,以每 500000 行进行分割:
split -l 500000 mytest.html
说明:
1、一般 systrace 文件,差不多每行大约 100Bytes 上下;
2、注意:切割systrace时候,需要主要针对切割之后文件,还需要做下处理,避免出现异常,导致无法解析。
由于 systrace 文件之前是完整的 html 语法规则编写,分割之后意味着每个分割的小文件的末尾,语法则会出现不匹配情况,此时就需要我们进行手动消除,可在切割后的systrace文件末尾添加如下内容:
然后,就可以和平时使用一样,分段解析每一个小的systrace文件了。