Centos下python 对syslog重写进行日志记录

在Linux 环境下,python自带一个syslog的模块可以进行日志记录。python可以利用logging模块来重写syslog,这样就可以自定义写入文件的文件名。如果不做配置则直接写入到/var/log/message文件里。

首先先写log.py,代码如下:

import os
import sys
import syslog
import types
import traceback
from datetime import datetime
import logging as _logging
LOGFILE_ENABLE = True
class DummyLogger(object):
    def debug(self, msg):
        pass
    def info(self, msg):
        pass
    def warning(self, msg):
        pass
    def error(self, msg):
        pass

class CombinedLogger(object):
    
    def __init__(self, id):
        self.id = id
        if LOGFILE_ENABLE:
            self.logger = _logging.getLogger(id)
        else:
            self.logger = DummyLogger()
    
    def debug(self, msg):
        syslog.openlog(self.id, syslog.LOG_PID)
        syslog.syslog(syslog.LOG_DEBUG, msg)
        pass
    
    def info(self, msg):
        try:
            syslog.openlog(self.id, syslog.LOG_PID)
            syslog.syslog(syslog.LOG_INFO, msg)
        except TypeError:
            print 'Unicode Error', type(msg), msg
            print msg.encode('utf8')
        self.logger.info(msg)
        pass
    
    def warning(self, msg):
        syslog.openlog(self.id, syslog.LOG_PID)
        syslog.syslog(syslog.LOG_WARNING, msg)
        pass
    
    def error(self, e):
        syslog.openlog(self.id, syslog.LOG_PID)
        ex, msg, stack = sys.exc_info()
        text = ['Exception: %s, Message: %s' % (ex, msg)] + traceback.format_tb(stack)
        syslog.syslog(syslog.LOG_ERR, '\n'.join(text))
        pass


class LoggerWrapper(object):
    
    def getLogger(self, id):
        return CombinedLogger(id)

logging = LoggerWrapper()

测试代码write_log.py如下:

import syslog
import datetime
import logging
import time
import threading
import os
from log import logging as self_logging
import config

logger = self_logging.getLogger('python')
def write_log_func():

    now = datetime.datetime.now()
    logger.info("It's time now: {}".format(now))    
    
def write_sign_log(index):
        path = '/home/xxx/test.log'
        logging.basicConfig(filename=path, filemode='w')
        logging.info("row:{}".format(index))
if __name__ == '__main__':
    i = 1
    while True:
        t_list = []
        tt_list = []
        for i in xrange(40000):
            t = threading.Thread(target=write_log_func, args=())
            t_list.append(t)

        for t1 in t_list:
            t1.start()

        for t2 in t_list:
            t2.join()

        print 'log is written'
        time.sleep(40)

最后对/etc/syslog.conf进行配置

!python
*.*                            /var/log/python.log

指定测试脚本中的日志写入到那个目录文件下。

可能会遇到得错误:

1、日志丢失,在写入日志时,只有一部分日志写进去了,查看meessage文件,发现有这样得错误:

imuxsock lost 47 messages from pid 2002 due to rate-limiting
imuxsock begins to drop messages from pid 2002 due to rate-limiting

这种情况出现说明syslog的配置记录超过最大值,修改syslog的配置文件来解决。

修改配置文件/etc/syslog.config,在其中对以下两个参数进行设置

echo '$SystemLogRateLimitInterval 60' >> /etc/rsyslog.conf
echo '$SystemLogRateLimitBurst 3000' >> /etc/rsyslog.conf

其中的数字根据实际情况可以做改变。第一条:为设定的限制的时间间隔大小,第二条:为在设定的限制的时间间隔内,最多输出的log信息数量。

上面的配置表示在每一个60s时间间隔内,如果超过3000条的log信息将会被去丢掉。如果不希望有丢失则直接可设置下面这个参数即可:

$SystemLogRateLimitInterval 0

设置成功后,重启rsyslog即可service rsyslog restart 。