def setUp(self): """ 启动测试执行的初始化 """ # 初始化日志类 DebugTool.set_debug(False) try: # 删除临时日志 FileTool.remove_files(path=os.path.join( _TEST_DATA_DIR, 'temp/http_service_log/log'), regex_str='test_case*') except: pass self.logger = simple_log.Logger( conf_file_name=os.path.join( _TEST_DATA_DIR, 'tcp_ip_service/test_http_service.json'), logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=os.path.join( _TEST_DATA_DIR, 'temp/http_service_log/log/test_case.log'), is_create_logfile_by_day=True) self.logger.setLevelWithHandler(simple_log.DEBUG) # 启动服务 self.server = HttpService( logger=self.logger, server_status_info_fun=self.server_status_info_fun, self_tag='UnitTest', log_level=simple_log.INFO, server_http_deal_fun=self.server_http_deal_fun) _server_opts = HttpService.generate_server_opts() _server_opts.ip = "127.0.0.1" _server_opts.port = 9513 self.server.start_server(server_opts=_server_opts)
def test_case2(): # 测试多个日志类相互影响的情况 try: FileTool.remove_file(_TEMP_DIR + '/test_case2.json') except: pass try: FileTool.remove_file(_TEMP_DIR + '/test_case2-1.json') except: pass try: FileTool.remove_files(path=_TEMP_DIR + '/log/', regex_str='test_case2*') except: pass try: FileTool.remove_files(path=_TEMP_DIR + '/log/', regex_str='test_case2-1*') except: pass _logger = simple_log.Logger(conf_file_name=_TEMP_DIR + '/test_case2.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_case2.log') # ConsoleAndFile 的配置level为DEBUG,但对应的ConsoleHandler的level为DEBUG,FileHandler的level为INFO # 日志是否显示会根据logger的level和handler的level,以级别比较高的匹配输出 # 注意默认root的handler应该为空,否则无论如何都会执行root的输出,如果自己又另外指定了输出,那就会有2个相同输出日志 _logger.log(simple_log.DEBUG, 'test_case2:write_log:DEBUG:1:界面应显示本日志,文件不应显示本日志') _logger.debug('test_case2:write_log:DEBUG:1-1:界面应显示本日志,文件不应显示本日志') _logger.log(simple_log.INFO, 'test_case2:write_log:INFO:2:界面应显示本日志,文件应显示本日志') _logger.info('test_case2:write_log:INFO:2-1:界面应显示本日志,文件应显示本日志') # 新增logger,但与原logger的loggername一样,实际上会互相影响,同时如果handler一样,也会受影响 _logger1 = simple_log.Logger(conf_file_name=_TEMP_DIR + '/test_case2-1.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_case2-1.log') _logger1.setLevel(simple_log.DEBUG) _logger.log(simple_log.DEBUG, 'test_case2:write_log:DEBUG:3:界面应显示本日志,文件不应显示本日志,但实际受logger1影响,也记录了日志;本应记录在日志1中,但受影响记录在日志2中') _logger.log(simple_log.INFO, 'test_case2:write_log:INFO:4:界面应显示本日志,文件应显示本日志;本应记录在日志1中,但受影响记录在日志2中') _logger1.log(simple_log.DEBUG, 'test_case2:write_log:DEBUG:5-1:界面应显示本日志,文件应显示本日志') _logger1.log(simple_log.INFO, 'test_case2:write_log:INFO:6-1:界面应显示本日志,文件应显示本日志') del _logger _logger1.log(simple_log.DEBUG, 'test_case2:write_log:DEBUG:6-1:界面应显示本日志,文件应显示本日志') _logger1.log(simple_log.INFO, 'test_case2:write_log:INFO:7-1:界面应显示本日志,文件应显示本日志') del _logger1
def setUp(self): """ 启动测试执行的初始化 """ # 初始化日志类 try: # 删除临时日志 FileTool.remove_files(path=_TEMP_DIR + '/log/', regex_str='test_case1*') except: pass # 初始化日志类 _logger = simple_log.Logger( conf_file_name=_TEMP_DIR + '/../../call_chain_tool/test_call_chain.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_case1.log', is_create_logfile_by_day=True, ) # 设置为全局使用 RunTool.set_global_logger(_logger)
def setUpClass(cls): """ 启动测试类执行的初始化,只执行一次 """ # 初始化日志类 DebugTool.set_debug(False) try: # 删除临时日志 FileTool.remove_files(path=_TEMP_DIR + '/log/', regex_str='test_case*') except: pass cls.logger = simple_log.Logger( conf_file_name=_TEMP_DIR + '/../../simple_grpc/test_simple_grpc.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_case_asyn.log', is_create_logfile_by_day=True, ) cls.logger.setLevelWithHandler(simple_log.DEBUG) # 设置json转换对象的参数映射 # 日志处理函数 def _asyn_logging_fun(levelno, topic_name, msg): print('haha:%s, %s, %s' % (str(levelno), topic_name, msg)) # 异步日志 cls._asyn_logger = CallChainTool.create_call_chain_logger( logger=cls.logger, asyn_logging=True, asyn_logging_fun=_asyn_logging_fun, asyn_deal_msg_fun=SimpleGRpcTools.api_call_chain_asyn_deal_msg_fun) # 服务端处理类,可以多个服务公用 cls.servicer_simple_call = SimpleGRpcServicer(logger=cls._asyn_logger) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_call_para', service_simple_call_para) cls.servicer_simple_call.add_service( EnumCallMode.Simple, 'service_simple_call_no_para_no_return', service_simple_call_no_para_no_return) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_call_return', service_simple_call_return) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_throw_excepiton', service_simple_throw_excepiton) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_overtime', service_simple_overtime) cls.servicer_simple_call.add_service(EnumCallMode.ClientSideStream, 'service_client_side_stream', service_client_side_stream) cls.servicer_simple_call.add_service(EnumCallMode.ServerSideStream, 'service_server_side_stream', service_server_side_stream) cls.servicer_simple_call.add_service(EnumCallMode.BidirectionalStream, 'service_bidirectional_stream', service_bidirectional_stream) # 初始化并启动服务,简单服务,无SSL,无服务发现 cls.server_no_ssl_no_zoo_opts = SimpleGRpcServer.generate_server_opts( ip='127.0.0.1', port=50051, max_workers=10, max_connect=100, is_health_check=True) cls.server_no_ssl_no_zoo = SimpleGRpcServer( server_name='ServerNoSslNoZoo', logger=cls.logger, log_level=simple_log.INFO) cls.server_no_ssl_no_zoo.start_server( server_opts=cls.server_no_ssl_no_zoo_opts, servicer_list={'servicer_simple_call': cls.servicer_simple_call}, is_wait=True) # 初始化并启动服务,简单服务,无服务发现,TSL双向认证模式 _private_key_certificate_chain_pair = SimpleGRpcTools.get_private_key_certificate_chain_pair( _TEMP_DIR + '/../../simple_grpc/server.pem', _TEMP_DIR + '/../../simple_grpc/server.crt') with open(_TEMP_DIR + '/../../simple_grpc/client.crt', 'rb') as f: # 根证书 _root_certificates = f.read() cls.server_double_ssl_no_zoo_opts = SimpleGRpcServer.generate_server_opts( ip='localhost', port=50052, max_workers=10, max_connect=100, is_use_ssl=True, private_key_certificate_chain_pairs=( _private_key_certificate_chain_pair, ), root_certificates=_root_certificates) cls.server_double_ssl_no_zoo = SimpleGRpcServer( server_name='ServerDoubleSslNoZoo', logger=cls.logger, log_level=simple_log.INFO) cls.server_double_ssl_no_zoo.start_server( server_opts=cls.server_double_ssl_no_zoo_opts, servicer_list={'servicer_simple_call': cls.servicer_simple_call}, is_wait=True) # 初始化并启动服务,简单服务,无服务发现,TSL单向认证模式(仅验证服务端证书) cls.server_server_ssl_no_zoo_opts = SimpleGRpcServer.generate_server_opts( ip='localhost', port=50053, max_workers=10, max_connect=100, is_use_ssl=True, private_key_certificate_chain_pairs=( _private_key_certificate_chain_pair, ), root_certificates=None) cls.server_server_ssl_no_zoo = SimpleGRpcServer( server_name='ServerServerSslNoZoo', logger=cls.logger, log_level=simple_log.INFO) cls.server_server_ssl_no_zoo.start_server( server_opts=cls.server_server_ssl_no_zoo_opts, servicer_list={'servicer_simple_call': cls.servicer_simple_call}, is_wait=True)
def setUpClass(cls): print("test class start =======>") print("初始化日志类") try: # 删除临时日志 FileTool.remove_files(path=_log_path, regex_str='.*\\.log') except: pass _logger_conf = os.path.realpath( os.path.join(_temp_path, os.path.pardir, os.path.pardir, 'file_transfer/test_file_transfer.json')) cls.logger = simple_log.Logger( conf_file_name=_logger_conf, logger_name=simple_log.EnumLoggerName.File, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, # logfile_path=_TEMP_DIR + '/log/test_case_client.log', is_create_logfile_by_day=True, ) cls.logger.setLevelWithHandler(simple_log.DEBUG) print('初始化并启动服务,简单服务,无SSL,无服务发现') cls.server_no_ssl_no_zoo_opts = SimpleGRpcServer.generate_server_opts( ip='127.0.0.1', port=50051, max_workers=50, max_connect=400, is_health_check=True) cls.server_no_ssl_no_zoo = SimpleGRpcServer( server_name='ServerNoSslNoZoo', logger=cls.logger, log_level=simple_log.INFO) _push_services = GRpcPushServicerGenerater(work_dir=_temp_path, lock_in_work_dir=True, logger=cls.logger, is_use_global_logger=False) _pull_services = GRpcPullServicerGenerater(work_dir=_temp_path, lock_in_work_dir=True, logger=cls.logger, is_use_global_logger=False) cls.server_no_ssl_no_zoo.start_server( server_opts=cls.server_no_ssl_no_zoo_opts, servicer_list={ 'servicer_file_transfer_push': _push_services.get_servicer(), 'servicer_file_transfer_pull': _pull_services.get_servicer() }, is_wait=True) # 先创建本地随机文件 print('创建本地随机文件') FileTool.create_dir(_temp_path, exist_ok=True) if not os.path.exists(_temp_file): with open(_temp_file, 'wb') as _file: _real_size = 561 * 1024 # 561kb _file.truncate(_real_size) # 对于已存在的文件,有可能比较大,要进行截断处理 _file.seek(_real_size - 1) # 跳到指定位置 _file.write(b'\x00') # 一定要写入一个字符,否则无效 _file.seek(random.randint(0, _real_size - 1 - 1024)) _file.write(bytes('abcdefg', encoding='utf-8')) _file.flush()
def test_case1(): # 测试单日志最基本功能,日志输出,变更日志级别,修改日志格式 # 删除临时日志 try: FileTool.remove_file(_TEMP_DIR + '/test_case1.json') print('del %s%s' % (_TEMP_DIR, '/test_case1.json')) except: pass try: FileTool.remove_files(path=_TEMP_DIR + '/log/', regex_str='test_case1*') except: pass _logger = simple_log.Logger(conf_file_name=_TEMP_DIR + '/test_case1.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_case1.log') # ConsoleAndFile 的配置level为DEBUG,但对应的ConsoleHandler的level为DEBUG,FileHandler的level为INFO # 日志是否显示会根据logger的level和handler的level,以级别比较高的匹配输出 # 注意默认root的handler应该为空,否则无论如何都会执行root的输出,如果自己又另外指定了输出,那就会有2个相同输出日志 _logger.log(simple_log.DEBUG, 'test_case1:write_log:DEBUG:1:界面应显示本日志,文件不应显示本日志') _logger.debug('test_case1:write_log:DEBUG:1-1:界面应显示本日志,文件不应显示本日志') _logger.log(simple_log.INFO, 'test_case1:write_log:INFO:2:界面应显示本日志,文件应显示本日志') _logger.info('test_case1:write_log:INFO:2-1:界面应显示本日志,文件应显示本日志') # 修改ConsoleAndFile的level为INFO,handler仍不变 _logger.setLevel(simple_log.INFO) _logger.log(simple_log.DEBUG, 'test_case1:write_log:DEBUG:3:界面不应显示本日志,文件不应显示本日志') _logger.log(simple_log.INFO, 'test_case1:write_log:INFO:4:界面应显示本日志,文件应显示本日志') # 修改ConsoleAndFile的level为DEBUG, FileHandler的level为WARNING _logger.setLevel(simple_log.DEBUG) for _handler in _logger.base_logger.handlers: if _handler.name == 'FileHandler': _logger.set_handler_log_level(_handler, simple_log.WARNING) _logger.log(simple_log.DEBUG, 'test_case1:write_log:DEBUG:5:界面应显示本日志,文件不应显示本日志') _logger.log(simple_log.WARNING, 'test_case1:write_log:WARNING:6:界面应显示本日志,文件应显示本日志') # 修改整个日志级别为INFO _logger.setLevel(simple_log.INFO) _logger.log(simple_log.DEBUG, 'test_case1:write_log:DEBUG:7:界面不应显示本日志,文件不应显示本日志') _logger.log(simple_log.INFO, 'test_case1:write_log:INFO:8:界面应显示本日志,文件应显示本日志') # 修改日志类型为Console,日志级别应根据配置文件恢复原状态(DEBUG) _logger.change_logger_name(logger_name=simple_log.EnumLoggerName.Console) _logger.log(simple_log.DEBUG, 'test_case1:write_log:DEBUG:9:界面应显示本日志,文件不应显示本日志') # 修改日志输出格式 _logger.set_logger_formater(format_str='[%(asctime)s]%(message)s') _logger.log(simple_log.DEBUG, 'test_case1:write_log:DEBUG:9:格式发生变化,界面应显示本日志,文件不应显示本日志') del _logger
def setUpClass(cls): """ 启动测试类执行的初始化,只执行一次 """ # 初始化日志类 DebugTool.set_debug(False) try: # 删除临时日志 FileTool.remove_files(path=_TEMP_DIR + '/log/', regex_str='test_case_client*') except: pass cls.logger = simple_log.Logger( conf_file_name=_TEMP_DIR + '/../../simple_grpc/test_simple_grpc.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_case_client.log', is_create_logfile_by_day=True, ) cls.logger.setLevelWithHandler(simple_log.DEBUG) # 设置json转换对象的参数映射 # 日志处理函数 def _asyn_logging_fun(levelno, topic_name, msg): print('haha client:%s, %s, %s' % (str(levelno), topic_name, msg)) # 异步日志 cls._asyn_logger = CallChainTool.create_call_chain_logger( logger=cls.logger, asyn_logging=False, asyn_logging_fun=_asyn_logging_fun, asyn_deal_msg_fun=SimpleGRpcTools.api_call_chain_asyn_deal_msg_fun) RunTool.set_global_logger(cls._asyn_logger) # 服务端处理类,可以多个服务公用 cls.servicer_simple_call = SimpleGRpcServicer( logger=None, is_use_global_logger=False) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_call_para', service_simple_call_para) cls.servicer_simple_call.add_service( EnumCallMode.Simple, 'service_simple_call_no_para_no_return', service_simple_call_no_para_no_return) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_call_return', service_simple_call_return) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_throw_excepiton', service_simple_throw_excepiton) cls.servicer_simple_call.add_service(EnumCallMode.Simple, 'service_simple_overtime', service_simple_overtime) # 初始化并启动服务,简单服务,无SSL,无服务发现 cls.server_no_ssl_no_zoo_opts = SimpleGRpcServer.generate_server_opts( ip='127.0.0.1', port=50051, max_workers=10, max_connect=100, is_health_check=True) cls.server_no_ssl_no_zoo = SimpleGRpcServer( server_name='ServerNoSslNoZoo', logger=cls._asyn_logger, log_level=simple_log.INFO) cls.server_no_ssl_no_zoo.start_server( server_opts=cls.server_no_ssl_no_zoo_opts, servicer_list={'servicer_simple_call': cls.servicer_simple_call}, is_wait=True)