Ticket #267: log_patch.diff

File log_patch.diff, 6.9 KB (added by zzchen_pku, 9 years ago)
  • tests/log_test.py

     
    11from isc.log.log import *
    22import unittest
    33import os
     4import sys
    45import tempfile
    56
    67
     
    1920        self.handler = NSFileLogHandler(filename = self.FILE_LOG1.name,
    2021                                        maxBytes = 1024,
    2122                                        backupCount = 5)
     23        self.stderr_bak = sys.stderr
     24        sys.stderr = open(os.devnull, 'w')
    2225
    2326    def test_shouldRollover(self):
    2427        if(os.path.exists(self.FILE_LOG1.name)):
     
    3336        self.assertEqual(self.handler.maxBytes, 512)
    3437        self.assertEqual(self.handler.backupCount, 3)
    3538
    36         dir = os.path.split(self.FILE_LOG3.name)                                       
    37         path = dir[0] + "path_not_exists"
    38         update_file = os.path.join(path, dir[1])
     39    def test_handle_Error(self):
     40        record = logging.LogRecord(None, None, "", 0, "rotate file handler", (), None, None)
     41        logging.raiseExceptions = 0
     42        self.handler.handleError(record)
     43        logging.raiseExceptions = 1
     44        self.handler.handleError(record)
    3945
    40         if not os.path.exists(path):
    41             self.handler.update_config(update_file, 4, 1024)
    42             self.assertEqual(self.handler.baseFilename, self.FILE_LOG2.name)
    43             self.assertEqual(self.handler.maxBytes, 1024)
    44             self.assertEqual(self.handler.backupCount, 4)
    45 
    4646    def tearDown(self):
    4747        self.handler.flush()
    4848        self.handler.close()
    4949        self.FILE_LOG1.close()
    5050        self.FILE_LOG2.close()
    5151        self.FILE_LOG3.close()
     52        sys.stderr.flush()
     53        sys.stderr = self.stderr_bak
    5254
     55
    5356class TestSysLogHandler(unittest.TestCase):
    5457    def setUp(self):
    5558        self.handler = NSSysLogHandler("BIND10")
     
    7982                                           self.FILE_STREAM_LOG1.name,
    8083                                           'debug', 5, 1024, True)
    8184        self.syslog_logger = NSLogger('SysLogger', '', 'info', 5, 1024, False)
     85        self.stderr_bak = sys.stderr
     86        sys.stderr = open(os.devnull, 'w')
    8287   
    8388    def test_logging_init(self):
    8489        self.assertNotEqual(self.file_stream_logger._file_handler, None)
     
    119124        ret = self.syslog_logger._file_handler in self.syslog_logger.handlers
    120125        self.assertTrue(ret)
    121126
     127        self.syslog_logger.removeHandler(self.syslog_logger._file_handler)
     128        log_file = self.FILE_STREAM_LOG1.name + '/logfile'
     129        self.syslog_logger._add_rotate_handler(log_file, 5, 1024)
     130
    122131    def test_add_stream_handler(self):
    123132        if(self.file_stream_logger._stream_handler in self.file_stream_logger.handlers):
    124133            self.file_stream_logger.removeHandler(self.file_stream_logger._stream_handler)
     
    164173                         'log_max_bytes' : 1024}
    165174        self.file_stream_logger.update_config(update_config)
    166175        self.file_stream_logger.log_message('debug', 'debug message')
    167         self.file_stream_logger.log_message('info', 'info message')
    168176        self.file_stream_logger.log_message('warning', 'warning message')
    169177        self.file_stream_logger.log_message('error', 'error message')
     178        self.file_stream_logger.log_message('not-exist', 'not exist message')
     179        self.file_stream_logger.log_message('critical', 'critical message', extra=['message', 'asctime'])
    170180        self.assertTrue(os.path.exists(self.FILE_STREAM_LOG3.name))
    171181   
    172182    def tearDown(self):
    173183        self.FILE_STREAM_LOG1.close()
    174184        self.FILE_STREAM_LOG2.close()
    175185        self.FILE_STREAM_LOG3.close()
     186        sys.stderr.flush();
     187        sys.stderr = self.stderr_bak
    176188
    177189if __name__ == '__main__':
    178190    unittest.main()
  • log.py

     
    1919To use, simply 'import isc.log.log' and log away!
    2020"""
    2121import os
     22import sys
    2223import syslog
    2324import logging
    2425import logging.handlers
     
    3132          'error' : logging.ERROR,
    3233          'critical' : logging.CRITICAL}
    3334
    34 
    3535FORMATTER = logging.Formatter("%(name)s: %(levelname)s: %(message)s")
    3636TIME_FORMATTER = logging.Formatter("%(asctime)s.%(msecs)03d %(name)s: %(levelname)s: %(message)s",
    3737                                   "%d-%b-%Y %H:%M:%S")
    3838
     39def log_err(err_type, err_msg):
     40    sys.stderr.write(err_type + ": " + "%s.\n" % str(err_msg)[str(err_msg).find(']')+1:])
     41
     42
    3943class NSFileLogHandler(logging.handlers.RotatingFileHandler):
    4044    """RotatingFileHandler: replace RotatingFileHandler with a custom handler"""
    4145
     
    4549            os.makedirs(dir[0])
    4650        super(NSFileLogHandler, self).__init__(filename, mode, maxBytes,
    4751                                                backupCount, encoding, delay)
     52    def handleError(self, record):
     53        if logging.raiseExceptions:
     54            ei = sys.exc_info()
     55            log_err("[b10-logging] Update logging config fail", str(ei[1]))
    4856
    4957    def shouldRollover(self, record):
    5058        """Rewrite RotatingFileHandler.shouldRollover.
     
    5462        dfn = self.baseFilename                 
    5563        if (self.stream) and (not os.path.exists(dfn)): #Does log file exist?
    5664            self.stream.close()
     65            self.stream = None
    5766            dir = os.path.split(dfn)
    5867            if not (os.path.exists(dir[0])): #Does log subdirectory exist?
    5968                os.makedirs(dir[0])
     
    6372    def update_config(self, file_name, backup_count, max_bytes):
    6473        """Update RotatingFileHandler configuration.
    6574
    66         If the file path does not exist, we will use the old log file.
    6775        input:
    6876            log file name
    6977            max backup count
    7078            predetermined log file size
    7179        """
    72         dir = os.path.split(file_name)
    73         if(os.path.exists(dir[0])):
    74             self.baseFilename = file_name
     80        self.baseFilename = file_name
    7581        self.maxBytes = max_bytes
    7682        self.backupCount = backup_count
    7783
     
    162168            try:
    163169                self._file_handler = NSFileLogHandler(filename = log_file,
    164170                                          maxBytes = max_bytes, backupCount = backup_count)
    165             except IOError:
     171            except (IOError, OSError) as e:
    166172                self._file_handler = None
     173                log_err("[b10-logging] Add file handler fail", str(e))
    167174                return
    168175            self._file_handler.setFormatter(TIME_FORMATTER)
    169176            self.addHandler(self._file_handler)
     
    244251        logger.log_message('info', "We have a %s", "mysterious problem").
    245252        """
    246253        logLevel = LEVELS.get(level, logging.NOTSET)
    247         self.log(logLevel, msg, *args, **kwargs)
     254        try:
     255            self.log(logLevel, msg, *args, **kwargs)
     256        except Exception as e:
     257            log_err("[b10-logging] Log message fail", str(e))
    248258
    249259