예제 #1
0
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
예제 #2
0
    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)
예제 #3
0
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('测试队列日志模式-完整日志信息 -- 完成')
예제 #4
0
파일: server.py 프로젝트: omoby/douyin_fans
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()
예제 #5
0
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
예제 #6
0
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
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
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()
예제 #10
0
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('测试队列日志模式-对象处理 -- 完成')
예제 #11
0
        "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])
예제 #12
0
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

예제 #13
0
    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()
예제 #14
0
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)