一般python写的程序里面都用logging模块来记录日志,那logging模块是线程安全的,但是它不保证多进程下安全。
所以当在多进程同时写追加进一个日志文件的时候是有可能出现日志错乱的情况的。那是否会出现错乱是由linux下PIPE_BUF这个参数来决定的。PIPE_BUF参数是在使用pipe下保证原子性的一次写操作最大字节数。(how many bytes you can write to a pipe atomically )。这个参数在linux下是4096.需要注意的是这个参数默认情况下是不能修改的,它与
[root@pyplay security]# ulimit -a | grep pipe pipe size (512 bytes, -p) 8
这个参数无关,两者是不相同的。所以说,当在多进程写日志的时候,如果一条日志的大小小于4096字节的话,linux操作系统本身就能保证其原子性。但是如果大于的话,就会出现错乱的情况了。
那这种情况怎么避免呢,logging模块除了本地写文件的方式外,还提供了SocketHandler、SysLogHandler功能,可以和syslog或者logstash来配合使用。这样就能做到多进程日志写在同一文件里面而不用担心会错乱的情况了。或者干脆就一个进程一个日志文件,可以根据pid号来定义文件名。虽然可能看上去搓了点,但也能保证不错乱。
Cloudhu 个人随笔|built by django|
沪ICP备16019452号-1