Exemplo n.º 1
0
    def start(self):
        if os.path.exists(self.logdir):
            if os.path.isfile(self.logdir): 
                raise Exception('log is a file, not a directory!')
        else:   
            os.mkdir(self.logdir)
        
        try:
            # formating file names
            filename = self.logdir + '/' + self.base_config['logfile']
            dot = filename.find('.log')
            if dot == -1:
                filename = filename + '.log'
                dot = filename.find('.log')
                
            # prepare rotating handlers
            fmt_rf = logging.Formatter(fmt='%(levelname)s: %(asctime)s: %(module_name)s %(psname)s %(process)d [%(clientip)s] [%(fname)s:%(lnumber)dL] %(message)s',datefmt='%m-%d %H:%M:%S')

            if self.base_config['classify']:
                for LEVEL in self.level_list:
                    self.handler_list[LEVEL] = getRotatingHandler('%s_%s%s' % (filename[:dot], LEVEL, filename[dot:]))
                    self.handler_list[LEVEL].setLevel(eval('logging.'+LEVEL.upper()))
                    self.handler_list[LEVEL].setFormatter(fmt_rf)
                    self.logger_list[LEVEL].addHandler(self.handler_list[LEVEL])
            else:
                for LEVEL in self.level_list:
                    level_num = eval('logging.'+LEVEL.upper())
                    if level_num <= 30:
                        self.handler_list[LEVEL] = getRotatingHandler('%s_%s%s' % (filename[:dot], '_warning', filename[dot:]))
                        self.handler_list[LEVEL].setLevel(level_num)
                    else:
                        self.handler_list[LEVEL] = getRotatingHandler('%s_%s%s' % (filename[:dot], '_critical', filename[dot:]))
                        self.handler_list[LEVEL].setLevel(level_num)
                    self.handler_list[LEVEL].setFormatter(fmt_rf)
                    self.logger_list[LEVEL].addHandler(self.handler_list[LEVEL])
                            
            # Mail Handler
            if self.base_config['viamail'] > 0:
                self.mail_handler = MailHandler(self.base_config['mailaddr'])
                self.mail_handler.setFormatter(fmt_rf)
                self.logger_list['critical'].addHandler(self.mail_handler)
            
            # set the log level
            for LEVEL in self.level_list:
                self.logger_list[LEVEL].setLevel(self.base_config['minpriority'])
                
        except Exception, e:
            traceback.print_exc()
            raise e
Exemplo n.º 2
0
class xlogging(Singleton):
    # some global variables
    level_list = ('debug', 'info', 'warning', 'error', 'critical')
    logger_list = {'debug': logging.getLogger('xlogging.debug'),
                    'info': logging.getLogger('xlogging.info'),
                    'warning': logging.getLogger('xlogging.warning'),
                    'error': logging.getLogger('xlogging.error'),
                    'critical': logging.getLogger('xlogging.critical')
    }
    handler_list = {}
    mail_handler = None
    #lock = Lock()

    # extra data to be stored in xlogging, defined in dic{}
    dic = {'clientip' : socket.gethostname()}
    try:
        f = open('/proc/' + str(os.getpid()) + '/cmdline', 'r')
        pn = f.readline()
        f.close()
    except:
        pn = None
        f.close()
    dic['psname'] = pn.replace('\000','#')[:-1]
    
    # set logfile
    base_config = {
        'logfile' : 'x.log',
        'classify' : True,
        'minpriority' : 10,
        'viamail' : 0,
        'mailaddr' : ''
    }
    
    # rotate settings
    rotate_config = {
        'ro_rotateby' : 1,
        'ro_backupcount' : 4,
        'ro_maxsize' : 1024*1024*10,
        'ro_when' : 'midnight',
        'ro_interval' : 1,
        'multiprocess' : 0
    }

    def __init__(self):
        #self.logdir = './' + os.path.dirname(inspect.stack()[2][1]) + '/log'
        self.logdir = os.getcwd() + '/log'

    def validate_base_config(self):
        if not isinstance(self.base_config['logfile'], str):
            raise TypeError('logfile: parameter is not str')
        if not isinstance(self.base_config['classify'], bool):
            raise TypeError('classify: parameter is not bool')
        if self.base_config['minpriority'] not in (10, 20, 30, 40, 50):
            raise ValueError('minpriority: parameter is not valid')
        if not isinstance(self.base_config['viamail'] , int):
            raise ValueError('viamail: parameter is not int')
        if not isinstance(self.base_config['mailaddr'], str):
            raise ValueError('mailaddr: parameter is not str')
        
    def validate_rotate_config(self):
        if self.rotate_config['ro_rotateby'] not in (0, 1, 2):
            raise ValueError('ro_rotateby: value is not valid')

        if not isinstance(self.rotate_config['ro_backupcount'], int):
            raise TypeError('ro_backupcount: parameter is not int')

        if self.rotate_config['ro_backupcount'] <= 0:
            raise ValueError('ro_backupcount: should not lower than or equal to zero')
            
        if not (isinstance(self.rotate_config['ro_maxsize'], int) or isinstance(self.rotate_config['ro_maxsize'], float)):
            raise TypeError('ro_maxsize: parameter is neither int nor float')

        if self.rotate_config['ro_maxsize'] <= 0:
            raise ValueError('ro_maxsize: should not lower than or equal to zero')

        # 'S' Secondes; 'M' Minutes; 'H' Hours; 'D' Days; 'W' Week day(0=Monday); 'midnight' roll over at midnight
        #if self.rotate_config['ro_when'] not in ('S', 'M', 'H', 'D', 'W', 'MIDNIGHT'):
        #    raise ValueError('ro_when: is not in (S, M, H, D, W, midnight)')
        # only support form "M, H, midnight", modified by chenweiguo @20111230 for python 2.6.5 logging module rotate
        if self.rotate_config['ro_when'] not in ('M', 'H', 'MIDNIGHT'):
            raise ValueError('ro_when: is not in (M, H, midnight)')

        if not isinstance(self.rotate_config['ro_interval'], int):
            raise TypeError('ro_interval: parameter is not int')

        if self.rotate_config['ro_interval'] <= 0:
            raise ValueError('ro_interval: should not lower than or equal to zero')
        
        if not isinstance(self.rotate_config['multiprocess'], int):
            raise ValueError('multiprocess: parameter is not int')
        
        if self.rotate_config['multiprocess'] < 0:
            raise ValueError('multiprocess: should not lower than zero')

    def setConfig(self,
                    module_name='',
                    ro_rotateby=0,
                    ro_backupcount=4,
                    ro_maxsize=1024*1024*10,
                    ro_when='midnight',
                    ro_interval=1,
                    logfile='x.log',
                    classify=True,
                    minpriority=10,
                    multiprocess=0,
                    viamail=0,
                    mailaddr=''):
                    
        if not isinstance(module_name, str):
            raise TypeError('module_name: parameter is not str')
        self.dic['module_name'] = module_name

        #### set the rotate configuration
        self.rotate_config['ro_rotateby'] = ro_rotateby # 1 by file size; 2 by date
        self.rotate_config['ro_backupcount'] = ro_backupcount
        self.rotate_config['ro_maxsize'] = ro_maxsize
        # You can use the when to specify the type of interval.
        # 'S' Secondes; 'M' Minutes; 'H' Hours; 'D' Days; 'W' Week day(0=Monday); 'midnight' roll over at midnight
        self.rotate_config['ro_when'] = ro_when.upper()
        self.rotate_config['ro_interval'] = ro_interval
        
        self.rotate_config['multiprocess'] = multiprocess
        
        self.validate_rotate_config()
        handlers.setRotate(self.rotate_config)

        self.base_config['logfile'] = logfile
        self.base_config['classify'] = classify
        self.base_config['minpriority'] = minpriority
        self.base_config['viamail'] = viamail
        self.base_config['mailaddr'] = mailaddr
        
        self.validate_base_config()

        self.restart()

    # start configuration
    def start(self):
        if os.path.exists(self.logdir):
            if os.path.isfile(self.logdir): 
                raise Exception('log is a file, not a directory!')
        else:   
            os.mkdir(self.logdir)
        
        try:
            # formating file names
            filename = self.logdir + '/' + self.base_config['logfile']
            dot = filename.find('.log')
            if dot == -1:
                filename = filename + '.log'
                dot = filename.find('.log')
                
            # prepare rotating handlers
            fmt_rf = logging.Formatter(fmt='%(levelname)s: %(asctime)s: %(module_name)s %(psname)s %(process)d [%(clientip)s] [%(fname)s:%(lnumber)dL] %(message)s',datefmt='%m-%d %H:%M:%S')

            if self.base_config['classify']:
                for LEVEL in self.level_list:
                    self.handler_list[LEVEL] = getRotatingHandler('%s_%s%s' % (filename[:dot], LEVEL, filename[dot:]))
                    self.handler_list[LEVEL].setLevel(eval('logging.'+LEVEL.upper()))
                    self.handler_list[LEVEL].setFormatter(fmt_rf)
                    self.logger_list[LEVEL].addHandler(self.handler_list[LEVEL])
            else:
                for LEVEL in self.level_list:
                    level_num = eval('logging.'+LEVEL.upper())
                    if level_num <= 30:
                        self.handler_list[LEVEL] = getRotatingHandler('%s_%s%s' % (filename[:dot], '_warning', filename[dot:]))
                        self.handler_list[LEVEL].setLevel(level_num)
                    else:
                        self.handler_list[LEVEL] = getRotatingHandler('%s_%s%s' % (filename[:dot], '_critical', filename[dot:]))
                        self.handler_list[LEVEL].setLevel(level_num)
                    self.handler_list[LEVEL].setFormatter(fmt_rf)
                    self.logger_list[LEVEL].addHandler(self.handler_list[LEVEL])
                            
            # Mail Handler
            if self.base_config['viamail'] > 0:
                self.mail_handler = MailHandler(self.base_config['mailaddr'])
                self.mail_handler.setFormatter(fmt_rf)
                self.logger_list['critical'].addHandler(self.mail_handler)
            
            # set the log level
            for LEVEL in self.level_list:
                self.logger_list[LEVEL].setLevel(self.base_config['minpriority'])
                
        except Exception, e:
            traceback.print_exc()
            raise e