在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, ' '.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 。