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): """ 启动测试执行的初始化 """ # 初始化日志类 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(): """ 测试日志完整信息写入队列的模式 """ print('测试队列日志模式-完整日志信息') queue_logger = simple_log.Logger(logger_name='QueueMsg', json_str=_LOGGER_QUEUE_MSG_JSON_STR) queue_logger.log(simple_log.INFO, 'INFO msg') queue_logger.log(simple_log.DEBUG, 'DEBUG msg') queue_logger.log(simple_log.CRITICAL, 'CRITICAL msg') queue_logger.log(simple_log.WARNING, 'WARNING msg') queue_logger.log(simple_log.ERROR, 'ERROR msg') # 获取handler queue_handler = queue_logger.base_logger.handlers[0] print('当前队列数 %s' % (str(queue_handler.queue.qsize()))) print('等待5s再处理') time.sleep(5) print("当前时间:%s" % (datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) # 处理队列信息 queue_handler.start_logging(loggers_or_funs={"default": write_logger}) print('等待5s后结束') time.sleep(5) # 结束日志队列处理 queue_handler.stop_logging() print('测试队列日志模式-完整日志信息 -- 完成')
def run_server(**kwargs): """ 运行群控后台服务 """ # 基本参数 _root_path = os.path.abspath(os.path.dirname(__file__)) _static_folder = 'website' # 日志对象 _logger = simple_log.Logger( conf_file_name=os.path.join(_root_path, 'config/logger.json'), logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=os.path.join(_root_path, 'log/server.log'), is_create_logfile_by_day=True) # 初始化控制API实例对象 _dy_control_api = DyControlApi() # 创建网站快捷方式 if sys.platform == 'win32': _ws = win32com.client.Dispatch("wscript.shell") _scut = _ws.CreateShortcut(os.path.join(_root_path, '群控管理后台.url')) _scut.TargetPath = 'http://%s:%d/index.html' % ( _dy_control_api.para['site'], _dy_control_api.para['port']) _scut.Save() # 初始化FlaskServer _server_config = { 'app_config': { 'root_path': _root_path, 'static_folder': _static_folder, 'static_url_path': '', }, 'flask_run': { 'host': _dy_control_api.para['host'], 'port': _dy_control_api.para['port'], 'threaded': _dy_control_api.para['threaded'], 'processes': _dy_control_api.para['processes'] }, 'json_as_ascii': _dy_control_api.para['json_as_ascii'], 'use_wsgi': _dy_control_api.para['use_wsgi'] } _server = FlaskServer('dy_control_server', server_config=_server_config, logger=_logger) # 装载Restful Api _server.add_route_by_class([ _dy_control_api, ]) # 启动FlaskServer _server.start()
def test_debugtools_1(): # 测试DebugTools - 跨模块的打印 - 增加日志类的干扰 _logger = simple_log.Logger( conf_file_name=_TEMP_DIR + '/test_debugtools_1.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_debugtools_1.log') _logger.log(simple_log.DEBUG, 'test_debugtools_1:write_log:DEBUG:1:界面应显示本日志,文件不应显示本日志') _logger.log(simple_log.INFO, 'test_debugtools_1:write_log:INFO:2:界面应显示本日志,文件应显示本日志') del _logger DebugTool.set_debug(True) DebugTool.debug_print("自己本模块的打印") test_debugtools() return
def test_excepitontools_1(): # 测试异常工具的处理机制 _logger2 = simple_log.Logger( conf_file_name=_TEMP_DIR + '/test_excepitontools_1.json', logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=_TEMP_DIR + '/log/test_excepitontools_1.log', call_fun_level=1) _logger2.setLevel(simple_log.DEBUG) _logger2.log(simple_log.INFO, 'test log', extra={'callFunLevel': 0}) with ExceptionTool.ignored_all(logger=_logger2, self_log_msg='测试异常处理:'): print("test_excepitontools_1 step 1") print("test_excepitontools_1 step 2") print("test_excepitontools_1 step 3") 1 / 0 print("test_excepitontools_1 step 4 - 不应打印") print("test_excepitontools_1 step 5 - 不应打印") print("test_excepitontools_1 step 6 - 退出后的打印信息") del _logger2
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 run_server(**kwargs): """ 运行群控后台服务 """ # 基本参数 _root_path = os.path.abspath(os.path.dirname(__file__)) _static_folder = 'website' _template_folder = 'templates' # 日志对象 _logger = simple_log.Logger( conf_file_name=os.path.join(_root_path, 'config/logger.json'), logger_name=simple_log.EnumLoggerName.ConsoleAndFile, config_type=simple_log.EnumLoggerConfigType.JSON_FILE, logfile_path=os.path.join(_root_path, 'log/server.log'), is_create_logfile_by_day=True) # 实例化服务对象 _config_services = ConfigServices(logger=_logger) RunTool.set_global_var('CONFIG_SERVICES', _config_services) # 添加到全局变量 # 初始化SocketIoServer _socketio_config = { 'app_config': {}, 'flask_run': { 'host': _config_services.para['socketio_host'], 'port': _config_services.para['socketio_port'], }, 'socketio_config': { 'cors_allowed_origins': '*' # 解决跨域访问问题 }, 'json_as_ascii': _config_services.para['socketio_json_as_ascii'] } _socketio_server = SocketIOServer('smartphone_socketio_server', server_config=_socketio_config, logger=_logger) RunTool.set_global_var('SOCKETIO_SERVER', _socketio_server) # 添加到全局变量 # 设备服务 _device_services = DeviceServices(config_services=_config_services, socketio_server=_socketio_server, logger=_logger) RunTool.set_global_var('DEVICE_SERVICES', _device_services) # 添加到全局变量 # 创建网站快捷方式 if sys.platform == 'win32': _ws = win32com.client.Dispatch("wscript.shell") _scut = _ws.CreateShortcut(os.path.join(_root_path, '群控管理后台.url')) _scut.TargetPath = 'http://%s:%d/' % (_config_services.para['site'], _config_services.para['port']) _scut.Save() # 初始化FlaskServer _server_config = { 'app_config': { 'root_path': _root_path, 'static_folder': _static_folder, 'static_url_path': '', 'template_folder': _template_folder, }, 'flask_run': { 'host': _config_services.para['host'], 'port': _config_services.para['port'], 'threaded': _config_services.para['threaded'], 'processes': _config_services.para['processes'] }, 'json_as_ascii': _config_services.para['json_as_ascii'], 'use_wsgi': _config_services.para['use_wsgi'], 'send_file_max_age_default': 1, # 缓存一秒过期 } _server = FlaskServer('smartphone_clound_server', server_config=_server_config, logger=_logger) RunTool.set_global_var('FLASK_SERVER', _server) # 添加到全局变量 # 装载Restful Api, 设备管理走socketio模式 _server.add_route_by_class([_config_services], blacklist=[ 'ConfigServices/index', ]) # 改变主页的路由 _server.add_route('/', _config_services.index) _server.app.jinja_env.auto_reload = True # 设置模板变更后立即生效 # 插件管理器 _plugin_manager = PluginManager(_config_services, _device_services, _server, config_path=_config_services.config_path, always_update=True, logger=_logger) RunTool.set_global_var('PLUGIN_MANAGER', _plugin_manager) # 添加到全局变量 # 启动SocketIOServer, 异步启动模式 _socketio_server.start(is_asyn=True) # 启动FlaskServer _server.start()
def test_case1(): """ 测试日志项record写入队列的模式 """ print('测试队列日志模式-对象处理') queue_logger = simple_log.Logger(logger_name='QueueRecord', json_str=_LOGGER_QUEUE_MSG_JSON_STR) # 将要处理消息的对象通过extra传入 queue_logger.log(simple_log.INFO, 'INFO msg', extra={ 'topicName': 'name1', 'name1Obj': ['1', '2', '3', '4'] }) queue_logger.log(simple_log.DEBUG, 'DEBUG msg', extra={ 'topicName': 'name1', 'name1Obj': ['5', '6', '7', '8'] }) queue_logger.log(simple_log.CRITICAL, 'CRITICAL msg', extra={ 'topicName': 'name1', 'name1Obj': ['9', '10', '11', '12'] }) queue_logger.log(simple_log.WARNING, 'WARNING msg', extra={ 'topicName': 'name2', 'name2Obj': ['9', '10', '11', '12'] }) queue_logger.log(simple_log.ERROR, 'ERROR msg', extra={ 'topicName': 'name3', 'name2Obj': ['a', 'b', 'c', 'd'] }) # 异常的情况 queue_logger.log(simple_log.ERROR, 'ERROR msg', extra={ 'topicName': 'name2', 'name2Obj': ['a', 'b'] }) # 获取handler queue_handler = queue_logger.base_logger.handlers[0] print('当前队列数 %s' % (str(queue_handler.queue.qsize()))) print('等待5s再处理') time.sleep(5) print("当前时间:%s" % (datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) # 处理队列信息 queue_handler.start_logging(loggers_or_funs={ "default": write_logger, 'name3': log_fun }, deal_msg_funs={ "default": deal_msg_fun2, 'name1': deal_msg_fun1, 'name2': deal_msg_fun2 }) print('等待5s后结束') time.sleep(5) # 打印错误信息 error_obj = queue_handler.error_queue.get() print('error: %s, %s' % (error_obj.topic_name, error_obj.trace_str)) # 结束日志队列处理 queue_handler.stop_logging() print('测试队列日志模式-对象处理 -- 完成')
"QueueRecord": { "level": "DEBUG", "handlers": ["QueueRecordHandler"], "propagate": "no" } }, "root": { "level": "DEBUG", "handlers": [] } } ''' write_logger = simple_log.Logger(logger_name='Console', json_str=_LOGGER_QUEUE_MSG_JSON_STR) def deal_msg_fun1(topic_name, record): """ 消息对象处理函数1 """ msg = record.msg + str(record.name1Obj[0]) + str(record.name1Obj[1]) return msg def deal_msg_fun2(topic_name, record): """ 消息对象处理函数2 """ msg = record.msg + str(record.name2Obj[2]) + str(record.name2Obj[3])
import os import sys import time sys.path.append( os.path.abspath( os.path.join(os.path.dirname(__file__), os.path.pardir, os.path.pardir))) import HiveNetLib.simple_log as simple_log from HiveNetLib.prompt_plus import PromptPlus from HiveNetLib.generic import CResult ############################# # 通用的logger ############################# _logger = simple_log.Logger() ############################# # 处理函数的定义 ############################# def on_abort(message='', prompt_obj=None, **kwargs): """Ctrl + C : abort,取消本次输入""" if prompt_obj is not None: prompt_obj.prompt_print('on_abort: %s' % message) _result = CResult() _result.print_str = 'on_abort done!' return _result
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)