【>和>>的区别】
命令>文件,表示以覆盖的方式,把命令正确输出到指定的文件或者设备当中;
命令>>文件,表示以追加的方式,把命令正确输出到指定的文件或者设备当中。

【遇到的问题】
在开发环境中调试接口时,发现log文件有点大,前面大部分内容与我正在排查的问题都无关,于是想把这部分内容抹去,然后单独让有问题的接口输出一些关键信息,再把文件放到本地来仔细查询。
于是在原有的log基础上,做了如下操作:

echo '123' > charge-service_1644545243.log

再将有问题的接口调用,以便让java将日志输出到这个文件中,但下载到本地后发现这个文件成了一个二进制:

--是不是字符集的问题?--
是不是因为echo输入时使用的字符集,和日志本身使用的字符集不同导致的?
之前在终端使用echo进入后,文件的字符集前后确实有点变化,如图:

于是,在echo时,使用中文输入,看看会不会有变化:

echo '测试' > charge-service_1644545243.log

此时,再调用一次接口,结果发现在java再次将日志输出到这个文件后,文件打开还是二进制。而且在linux终端file查看这个文件时,charset为二进制:

file -i charge-service_1644546551.log
charge-service_1644546551.log: text/plain; charset=binary

--可能是>的问题?--
此时想着查看一下,java进程是怎么把日志输入到这个文本中的,于是看了下这个程序相关的配置和启动脚本,结果发现,这个程序是用nohup直接将日志内容定向输出到log文件中,关键的一句如下:

nohup java -Xms256m -Xmx512m -jar $module_service_package $jarParam '--spring.profiles.active=dev'>$log_file 2>&1 &

所以到这里基本排除了java进程怎么控制输出的,因为这里的输出是通过>写入到了log中。之前说到>和>>的区别一个是覆盖,一个是追加,那么我们在程序运行中进行echo >的操作,相当于在一个>操作还没有结束的时候又进行了另一次>操作,会不会是这个原因呢?

为了验证这个想法,把启动脚本改为如下:

nohup java -Xms256m -Xmx512m -jar $module_service_package $jarParam '--spring.profiles.active=dev'>>$log_file 2>&1 &

把原本的>到文件改为>>的方式,再次进行之前的操作,如图:

在nohup输入了日志后,log文件的charset还是utf-8,下载到了本地之后发现可以正常查看了。

这里怀疑是>操作过程中被其它的操作(echo)修改了文本,导致某些信息缺失,所以出现了文本查看工具没办法判断这个文本到底是什么类型,只能以二进制处理,有没有大佬能解惑,是否是这个原因,怎么进行验证?

posted on 2022-02-11 11:06  长江同学  阅读(506)  评论(0编辑  收藏  举报