archlinuxcn / lilac

Lilac is the build bot for archlinuxcn
GNU General Public License v3.0
114 stars 40 forks source link

把run_cmd的输出导入logger #76

Closed petronny closed 4 years ago

petronny commented 5 years ago

现在lilac的log转存文件那里感觉很不美观 是基于重定向的,应该是为了适配run_cmd的输出

所以我们能不能把run_cmd的输出改用logger输出? 这样我们可以只通过加一个handler就能把log转存到文件, 并且如果使用RotatingFileHandler的话,还可以只存最近若干次的log

petronny commented 5 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的部分也做了修改

image 应该是想要的结果

如果把输出重定向到文件的话:

^[[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的话 image 看起来是没有什么问题

petronny commented 5 years ago

然而我对LogHandler不是很清楚 现在改terminator的办法感觉并行会出问题

另外有关CRStreamHandler放在哪,哪里来配置默认handler我也不清楚 故不发PR了。。。

lilydjwg commented 5 years ago

我不是很明白为什么要这么做。你要把命令的输出逐行交给 logger 吗?这样会产生很多行日志的。如果一整个作为一条的话,又不能实时输出了。

日志这部分,我首先想做的是,每个包的日志独立出来。

日志轮换这部分没什么问题啊,按时间存的,所以直接 systemd-tmpfiles 清理就好了。

petronny commented 5 years ago

的确是逐行交给logger的 运行很长的程序每行输出都加上时间感觉也不错?

我是在想统一用python的logger 统一之后感觉一切都会方便点? 比如分日志可以指定logger name(?) 还有同时输出到stderr和文件这种 发邮件感觉也可以做成Handler,不过估计得折腾折腾了

lilydjwg commented 5 years ago

运行很长的程序每行输出都加上时间感觉也不错?

会不会很影响性能呢?毕竟会有很多很多行数据的。

统一之后感觉一切都会方便点?

嗯。不过我懒。我还有很多更重要的东西没完成呢。

发邮件感觉也可以做成Handler

不好。handler 会不知道往哪里发邮件,而且语义不一样的。把日志当通知用不好。