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

  • 相关阅读:
    C++ ORM ODB 入门(三)
    C++ ORM ODB 入门介绍(二)
    最简便的MySql数据库备份方法
    快速高效的破解MySQL本地和远程密码
    C++ ORM ODB 入门介绍(一)
    NeHe OpenGL教程 第三十九课:物理模拟
    NeHe OpenGL教程 第三十八课:资源文件
    NeHe OpenGL教程 第三十七课:卡通映射
    NeHe OpenGL教程 第三十六课:从渲染到纹理
    NeHe OpenGL教程 第三十五课:播放AVI
  • 原文地址:https://www.cnblogs.com/l5623064/p/9366416.html
Copyright © 2020-2023  润新知