Closed petronny closed 4 years ago
感觉最大的问题在'\r'的处理上 我写了一个每隔一秒输出包含'\r'字符的脚本测试:
$ cat demo.sh
for i in `seq 3`
do
echo -e " \033[31mTest\x1B[0m\r$i"
echo -e "\033[31mTest\x1B[0m $i\r\n"
sleep 1
done
我写了一个新的log handler,能够处理字符串末尾是'\r'的情况
# demo.py
import logging
class CRStreamHandler(logging.StreamHandler):
def emit(self, record):
if isinstance(record.msg, str) and record.msg.endswith('\r'):
self.terminator = ''
else:
self.terminator = '\n'
logging.StreamHandler.emit(self, record)
if __name__ == '__main__':
from lilac2.cmd import run_cmd
from nicelogger import enable_pretty_logging
logger = logging.getLogger()
enable_pretty_logging(level='DEBUG', handler=CRStreamHandler(), color=True)
logger.info('Test')
run_cmd('sh demo.sh'.split(' ')).encode('utf-8')
并且run_cmd的部分也做了修改
应该是想要的结果
如果把输出重定向到文件的话:
^[[32m[I 10-03 18:51:25.977 demo:16]^[[m^O Test
^[[34m[D 10-03 18:51:25.978 cmd:34]^[[m^O running ['sh', 'demo.sh'], not using pty, showing output
^[[34m[D 10-03 18:51:25.987 cmd:86]^[[m^O ^[[31mTest^[[0m^M^[[34m[D 10-03 18:51:25.988 cmd:87]^[[m^O 1
^[[34m[D 10-03 18:51:25.988 cmd:87]^[[m^O ^[[31mTest^[[0m 1
^[[34m[D 10-03 18:51:25.988 cmd:87]^[[m^O-
^[[34m[D 10-03 18:51:26.989 cmd:86]^[[m^O ^[[31mTest^[[0m^M^[[34m[D 10-03 18:51:26.989 cmd:87]^[[m^O 2
^[[34m[D 10-03 18:51:26.989 cmd:87]^[[m^O ^[[31mTest^[[0m 2
^[[34m[D 10-03 18:51:26.989 cmd:87]^[[m^O-
^[[34m[D 10-03 18:51:27.991 cmd:86]^[[m^O ^[[31mTest^[[0m^M^[[34m[D 10-03 18:51:27.991 cmd:87]^[[m^O 3
^[[34m[D 10-03 18:51:27.991 cmd:87]^[[m^O ^[[31mTest^[[0m 3
^[[34m[D 10-03 18:51:27.991 cmd:87]^[[m^O-
看起来是所有信息都保留了
如果我把CRStreamHandler
加进nicelogger.py,并且设为默认的logHandler
然后去找一个包运行PYTHONPATH=$PYTHONPATH:~/git/lilac python lilac.py
的话
看起来是没有什么问题
然而我对LogHandler不是很清楚 现在改terminator的办法感觉并行会出问题
另外有关CRStreamHandler
放在哪,哪里来配置默认handler我也不清楚
故不发PR了。。。
我不是很明白为什么要这么做。你要把命令的输出逐行交给 logger 吗?这样会产生很多行日志的。如果一整个作为一条的话,又不能实时输出了。
日志这部分,我首先想做的是,每个包的日志独立出来。
日志轮换这部分没什么问题啊,按时间存的,所以直接 systemd-tmpfiles 清理就好了。
的确是逐行交给logger的 运行很长的程序每行输出都加上时间感觉也不错?
我是在想统一用python的logger 统一之后感觉一切都会方便点? 比如分日志可以指定logger name(?) 还有同时输出到stderr和文件这种 发邮件感觉也可以做成Handler,不过估计得折腾折腾了
运行很长的程序每行输出都加上时间感觉也不错?
会不会很影响性能呢?毕竟会有很多很多行数据的。
统一之后感觉一切都会方便点?
嗯。不过我懒。我还有很多更重要的东西没完成呢。
发邮件感觉也可以做成Handler
不好。handler 会不知道往哪里发邮件,而且语义不一样的。把日志当通知用不好。
现在lilac的log转存文件那里感觉很不美观 是基于重定向的,应该是为了适配run_cmd的输出
所以我们能不能把run_cmd的输出改用logger输出? 这样我们可以只通过加一个handler就能把log转存到文件, 并且如果使用RotatingFileHandler的话,还可以只存最近若干次的log