def test_get_latest_filename_mixed_bz_gz(self): files = (filename for filename in [ 'bbb.0502-2003.bz2', 'bbb.0103-2002.gz', ]) self.assertEqual( get_latest_filename(self.pattern, files), LogFileTuple('./bbb.0103-2002.gz', '.gz', datetime.date(2002, 1, 3)))
def test_get_latest_filename_mixed_gz(self): files = (filename for filename in [ 'bbb.0102-2002.gz', 'bbb.0103-2002', ]) self.assertEqual( get_latest_filename(self.pattern, files, '/path/to/dir'), LogFileTuple('/path/to/dir/bbb.0103-2002', None, datetime.date(2002, 1, 3)))
def test_get_latest_filename_mixed_plain(self): files = (filename for filename in [ 'bbb.0502-2001', 'bbb.0103-2002.gz', ]) self.assertEqual( get_latest_filename(self.pattern, files, '/'), LogFileTuple('/bbb.0103-2002.gz', '.gz', datetime.date(2002, 1, 3)))
def test_get_latest_filename_plain(self): files = (filename for filename in [ '.', '', None, 'bbb.1229-2001', 'bbb.0102-2002', 'aaa.0101-2003', ]) self.assertEqual( get_latest_filename(self.pattern, files), LogFileTuple('./bbb.0102-2002', None, datetime.date(2002, 1, 2)))
def main(args=None): # setup some variables logfile_name_pattern = r'nginx-access-ui.log-' + \ r'(?P<yyyy>\d\d\d\d)(?P<mm>\d\d)(?P<dd>\d\d)' + \ r'(?P<ext>\.gz)?$' template_file = os.path.join(os.path.dirname(__file__), "report.html") # parse commandline args args = parse_args(args=args, default_config='~/.analyzer.cfg') # parse and merge config file c = ConfigParser.ConfigParser(config) section = 'DEFAULT' if args.config: c.readfp(args.config) section = c.sections()[0] args.config.close() the_conf = ConfigDict(c.items(section)) logging.basicConfig(format='[%(asctime)s] %(levelname).1s %(message)s', datefmt='%Y.%m.%d %H:%M:%S', level=logging.INFO, filename=the_conf.analyzer_log_file) try: # validate report_size parameter in the config if not re.match(r'^\d+$', the_conf.report_size): logging.error( "Wrong format for report_size in %s: %s" % (os.path.abspath(args.config.name), the_conf.report_size)) raise ValueError # validate report_size parameter in the config if not (re.match(r'^\d+$', the_conf.threshold) and int(the_conf.threshold) <= 100 or int(the_conf.threshold) > 0): logging.error( "Wrong format for report_size in %s: %s" % (os.path.abspath(args.config.name), the_conf.report_size)) raise ValueError logging.info('%s launched in %s with config file %s' % ( sys.argv[0], os.getcwd(), args.config.name, )) logging.info('parsed configuration from file %s: %s' % (args.config.name, the_conf)) # get files list files = (f for f in os.listdir(the_conf.log_dir)) # get latest file to parse, exit with success if nothing found latest_tuple = get_latest_filename(logfile_name_pattern, files, the_conf.log_dir) if latest_tuple is None: logging.info("No suitable log to parse found in %s" % the_conf.log_dir) sys.exit(0) logging.info('Got the file %s' % latest_tuple.filename) # create reports dir setup_reports(the_conf.report_dir) # get filename for the future report report_file = os.path.join( the_conf.report_dir, latest_tuple.date.strftime('report-%Y.%m.%d.html')) logging.info('report file: %s' % report_file) # exit with success if report file already exists if os.path.exists(report_file): logging.info('report file for %s already exists: %s' % (latest_tuple.filename, report_file)) sys.exit(0) # exit with error if there is no template file if not os.path.exists(template_file): logging.error('template file %s does not exist' % template_file) sys.exit(1) # create and invoke log_parser instance log_parser = LogReqtimeStat(latest_tuple, the_conf) log_stat = log_parser.parse_log() if log_stat is None: logging.error('Unable to parse the log') sys.exit(1) logging.info('finished') # generate the report logging.info('writing report to %s' % report_file) data = json.dumps(log_stat, default=str) render_report(template_file, data, report_file) logging.info('finished') except KeyboardInterrupt: logging.exception('KeyboardInterrupt') raise except Exception: logging.exception('Exception raised') raise