Пример #1
0
    def start_service(self):
        """
        启动服务
        :return:
        """
        args = ArgumentParser().args
        try:
            Jobs().add_interval_job(UPDATE_INTERVAL, self.update)

            if not self.is_sm:
                self.adv = ServiceAdvertiser(args.service_id,
                                             self.service_version, args.port)
                self.adv.advertise()

            check_ports = {}
            if "tcp_port" in args:
                check_ports['tcp'] = args.tcp_port
            if "http_port" in args:
                if not args.is_https:
                    check_ports['http'] = args.http_port
                else:
                    check_ports['https'] = args.http_port
            PortChecker(check_ports).start()

            self.thread_ls.extend([Jobs()])

            self.services(args, self.thread_ls)

            logger.warn("start services for %s, args:%s" %
                        (self.service_type, args))
            gevent.joinall([thread.start() for thread in self.thread_ls])
        except:
            logger.error(traceback.format_exc())
            sys.exit(0)
Пример #2
0
    def start_service(self):
        """
        启动服务
        :return:
        """
        args = ArgumentParser().args
        try:
            Jobs().add_interval_job(UPDATE_INTERVAL, self.update)

            if not self.is_sm:
                port = {"tcp": args.tcp_port}
                port.update({"https": args.http_port} if args.
                            is_https else {"http": args.http_port})
                self.adv = ServiceAdvertiser(self.service_type, port,
                                             self.get_jid(),
                                             self.service_version)
                self.adv.advertise()

            checker_ls = []
            self.add_port_checker(args, checker_ls)
            PortChecker(checker_ls).start()

            self.services(args, self.thread_ls)
            self.__sys_services(args, self.thread_ls)

            logger.warn("start services for %s, args:%s" %
                        (self.service_type, args))

            gevent.joinall([thread.start() for thread in self.thread_ls])
        except:
            logger.error(traceback.format_exc())
            sys.exit(0)
Пример #3
0
    def start_service(self):
        """
        启动服务
        :return:
        """
        args = ArgumentParser().args
        try:
            Jobs().add_interval_job(UPDATE_INTERVAL, self.update)

            if not self.is_sm:
                port = {"tcp": args.tcp_port}
                port.update({"https": args.http_port} if args.is_https else {"http": args.http_port})
                self.adv = ServiceAdvertiser(self.service_type, port, self.get_jid(), self.service_version)
                self.adv.advertise()

            checker_ls = []
            self.add_port_checker(args, checker_ls)
            PortChecker(checker_ls).start()

            self.services(args, self.thread_ls)
            self.__sys_services(args, self.thread_ls)

            logger.warn("start services for %s, args:%s" % (self.service_type, args))
            gevent.joinall([thread.start() for thread in self.thread_ls])
        except:
            logger.error(traceback.format_exc())
            sys.exit(0)
Пример #4
0
class MainService(object):
    """
    服务启动管理配置模块
    """
    def __init__(self, service_type, service_version, is_sm=False, db_update_dir_path=None,
                 use_mysqldb=False, use_orm=False, use_redis=False):
        self.service_type = service_type
        self.service_version = service_version
        self.thread_ls = []
        self.is_sm = is_sm
        self.db_update_dir_path = db_update_dir_path
        self.use_mysqldb = use_mysqldb
        self.use_orm = use_orm
        self.use_redis = use_redis

        self.adv = None
        self.sm_rpc = None

        logger.init_log(self.service_type, self.service_type)
        ExitHandler().add_exit_handler(self.stop_service)

        arg_parser = ArgumentParser()
        p = arg_parser.get_argparser()

        p.add_argument('--is_https', default=False, type=parser_boolean,  help="Is use http ssl connection")
        p.add_argument('--http_port', default=0, type=int,  help="The port of the http app listen")
        p.add_argument('--tcp_port', default=0, type=int,  help="The port of of the tcp rpc app listen")

        p.add_argument('--service_type', default=service_type, type=str, help="The type of the service")
        p.add_argument('--service_version', default=use_redis, type=str,  help="The version of the service")
        p.add_argument('--is_sm', default=is_sm, type=bool,  help="Whether it is the service manager")
        p.add_argument('--db_update_dir_path', default=db_update_dir_path, type=str,  help="The dir for db update use")
        p.add_argument('--use_mysqldb', default=use_mysqldb, type=parser_boolean,  help="Whether to use the mysqldb lib")
        p.add_argument('--use_orm', default=use_orm, type=parser_boolean,  help="Whether to use the orm db lib")
        p.add_argument('--use_redis', default=use_redis, type=parser_boolean,  help="Whether to use the redis cache")

        p.add_argument('--logger_err_2_mail', default=False, type=bool, help="whether logger 2 mail when error")
        p.add_argument('--logger_err_2_sms', default=False, type=bool, help="whether logger 2 sms when error")
        self.add_cmd_opts(p)

        IpFinder().is_extranet = arg_parser.args.is_extranet

        if self.db_update_dir_path:
            self._db_update()
        if self.use_mysqldb:
            self._start_mysqldb()
        if self.use_orm:
            self._start_orm()
        if self.use_redis:
            self._start_redis_client()

        args = arg_parser.args
        arg_parser.will_change = False

        self.prepare(args)
        self.init(args)
        self._set_logger(args)
        logger.set_logger_level(args.logger_level)

    def prepare(self, args):
        """
        参数准备
        :param args: 参数变量
        :return:
        """
        args.http_port = get_random_port() if args.http_port == 0 else args.http_port
        args.tcp_port = get_random_port() if args.tcp_port == 0 else args.tcp_port

    def init(self, args):
        """
        初始化接口
        :param args: 参数变量
        :return:
        """
        pass

    def exit(self):
        """
        程序退出接口
        :return:
        """
        pass

    def add_cmd_opts(self, arg_parser):
        """
        在获取sm参数之前,提供添加arg_parser参数接口
        :param arg_parser: 参数变量
        :return:
        """
        pass

    def add_cmd_opts_after_sm(self, arg_parser):
        """
        在获取sm参数之后,提供添加arg_parser参数接口
        :param arg_parser: 参数变量
        :return:
        """
        pass

    def add_port_checker(self, args, checker_ls):
        """
        添加端口检测
        :param args: 参数变量
        :param checker_ls: [{type:http/https/tcp/..., port:1111}]
        :return:
        """
        if "tcp_port" in args:
            checker_ls.append({"type": "tcp", "port": args.tcp_port})
        if "http_port" in args:
            if not args.is_https:
                checker_ls.append({"type": "http", "port": args.http_port})
            else:
                checker_ls.append({"type": "https", "port": args.http_port})
        return checker_ls

    def get_jid(self):
        return ""

    def update(self):
        """
        更新接口
        :return:
        """
        pass

    def services(self, args, thread_ls):
        """
        添加服务接口
        :param args: 参数变量
        :param thread_ls: 现有的服务列表
        :return:
        """
        pass

    def __sys_services(self, args, thread_ls):
        """
        添加系统服务接口
        :param args: 参数变量
        :param thread_ls: 现有的服务列表
        :return:
        """
        tcp_services = filter(lambda thread:isinstance(thread, TcpRpcServer), thread_ls)
        if not tcp_services:
            thread_ls.append(TcpRpcServer(args.tcp_port, TcpRpcHandler))

        thread_ls.append(HttpRpcServer(args.http_port, args.is_https))
        thread_ls.extend([Jobs()])

    def start_service(self):
        """
        启动服务
        :return:
        """
        args = ArgumentParser().args
        try:
            Jobs().add_interval_job(UPDATE_INTERVAL, self.update)

            if not self.is_sm:
                port = {"tcp": args.tcp_port}
                port.update({"https": args.http_port} if args.is_https else {"http": args.http_port})
                self.adv = ServiceAdvertiser(self.service_type, port, self.get_jid(), self.service_version)
                self.adv.advertise()

            checker_ls = []
            self.add_port_checker(args, checker_ls)
            PortChecker(checker_ls).start()

            self.services(args, self.thread_ls)
            self.__sys_services(args, self.thread_ls)

            logger.warn("start services for %s, args:%s" % (self.service_type, args))
            gevent.joinall([thread.start() for thread in self.thread_ls])
        except:
            logger.error(traceback.format_exc())
            sys.exit(0)

    def stop_service(self, *args):
        """
        退出服务
        :param args: 参数
        :return:
        """
        # 保存数据
        self.update()

        self.exit()

        if not self.is_sm:
            self.adv.notify_shutdown()
        [thread.stop() for thread in self.thread_ls]

    def _db_update(self):
        """
        db版本文件更新
        :return:
        """
        # 按版本更新数据库结构或数据
        assert db_update.main(ArgumentParser().args.db_host,
                              ArgumentParser().args.db_port,
                              ArgumentParser().args.db_name,
                              ArgumentParser().args.db_user,
                              ArgumentParser().args.db_password,
                              self.db_update_dir_path)

    def _start_mysqldb(self):
        """
        mysql db引擎开启
        :return:
        """
        db_instance = DBInstance(db_host=ArgumentParser().args.db_host,
                                 db_port=ArgumentParser().args.db_port,
                                 db_name=ArgumentParser().args.db_name,
                                 db_username=ArgumentParser().args.db_user,
                                 db_password=ArgumentParser().args.db_password,
                                 err_file=logger.fatal)
        db_instance.init()
        ParamCacher().db_instance = db_instance

    def _start_orm(self):
        """
        orm初始化
        :return:
        """
        orm_engine = OrmEngine(ArgumentParser().args.db_host,
                               ArgumentParser().args.db_port,
                               ArgumentParser().args.db_name,
                               ArgumentParser().args.db_user,
                               ArgumentParser().args.db_password)
        ParamCacher().orm_engine = orm_engine

    def _start_redis_client(self):
        """
        启动redis client
        :return:
        """
        rc = redis_client.RedisClient.instance(ArgumentParser().args.redis_ip,
                                               ArgumentParser().args.redis_port,
                                               ArgumentParser().args.redis_db,
                                               ArgumentParser().args.redis_passwd)
        ParamCacher().redis_client = rc

    def _set_logger(self, args):
        """
        设置logger
        :param args:
        :return:
        """
        def logger_operator(self, msg, level, use_mail=False, use_sms=False, *args, **kwargs):
            if use_mail:
                mail_client = ServiceMgrCacher().get_connection(US_MAIL)
                send_mail(mail_client, msg, level)
            if use_sms:
                sms_client = ServiceMgrCacher().get_connection(US_SMS)
                send_sms(sms_client, msg, level)

        if args.logger_err_2_mail or args.logger_err_2_sms:
            logger.AFTER_OPER_TAG = self.service_type
            logger.AFTER_ERROR_LOG_OPER = functools.partial(logger_operator,
                                                            level='error',
                                                            use_mail=args.logger_err_2_mail,
                                                            use_sms=args.logger_err_2_sms)
            logger.AFTER_FATAL_LOG_OPER = functools.partial(logger_operator,
                                                            level='fatal',
                                                            use_mail=args.logger_err_2_mail,
                                                            use_sms=args.logger_err_2_sms)
Пример #5
0
class MainService(object):
    """
    服务启动管理配置模块
    """
    def __init__(self,
                 service_type,
                 service_version,
                 is_sm=False,
                 db_update_dir_path=None,
                 use_mysqldb=False,
                 use_orm=False,
                 use_redis=False):
        self.service_type = service_type
        self.service_version = service_version
        self.thread_ls = []
        self.is_sm = is_sm
        self.db_update_dir_path = db_update_dir_path
        self.use_mysqldb = use_mysqldb
        self.use_orm = use_orm
        self.use_redis = use_redis

        self.adv = None
        self.sm_rpc = None

        logger.init_log(self.service_type, self.service_type)
        ExitHandler().add_exit_handler(self.stop_service)

        arg_parser = ArgumentParser()
        p = arg_parser.get_argparser()

        self.add_cmd_opts(p)

        p.add_argument('--service_type',
                       default=service_type,
                       type=str,
                       help="The type of the service")
        p.add_argument('--service_version',
                       default=use_redis,
                       type=str,
                       help="The version of the service")
        p.add_argument('--is_sm',
                       default=is_sm,
                       type=bool,
                       help="Whether it is the service manager")
        p.add_argument('--db_update_dir_path',
                       default=db_update_dir_path,
                       type=str,
                       help="The dir for db update use")
        p.add_argument('--use_mysqldb',
                       default=use_mysqldb,
                       type=parser_boolean,
                       help="Whether to use the mysqldb lib")
        p.add_argument('--use_orm',
                       default=use_orm,
                       type=parser_boolean,
                       help="Whether to use the orm db lib")
        p.add_argument('--use_redis',
                       default=use_redis,
                       type=parser_boolean,
                       help="Whether to use the redis cache")

        p.add_argument('--logger_mask',
                       default='0000',
                       type=str,
                       help="The logger mask em es fm fs")

        IpFinder().is_extranet = arg_parser.args.is_extranet

        if not self.is_sm:
            SMParamParser(service_type=self.service_type,
                          sm_rpc=ParamCacher().sm_rpc,
                          arg_parser=p,
                          rdm_port_fun=get_random_port)

            self.add_cmd_opts_after_sm(p)

        if self.db_update_dir_path:
            self._db_update()
        if self.use_mysqldb:
            self._start_mysqldb()
        if self.use_redis:
            self._start_redis_client()

        args = arg_parser.args
        arg_parser.will_change = False

        self.init(args)
        logger.set_logger_level(args.logger_level)

    def init(self, args):
        """
        初始化接口
        :param args: 参数变量
        :return:
        """
        pass

    def exit(self):
        """
        程序退出接口
        :return:
        """
        pass

    def add_cmd_opts(self, arg_parser):
        """
        在获取sm参数之前,提供添加arg_parser参数接口
        :param arg_parser: 参数变量
        :return:
        """
        pass

    def add_cmd_opts_after_sm(self, arg_parser):
        """
        在获取sm参数之后,提供添加arg_parser参数接口
        :param arg_parser: 参数变量
        :return:
        """
        pass

    def update(self):
        """
        更新接口
        :return:
        """
        pass

    def services(self, args, thread_ls):
        """
        添加服务接口
        :param args: 参数变量
        :param thread_ls: 现有的服务列表
        :return:
        """
        pass

    def start_service(self):
        """
        启动服务
        :return:
        """
        args = ArgumentParser().args
        try:
            Jobs().add_interval_job(UPDATE_INTERVAL, self.update)

            if not self.is_sm:
                self.adv = ServiceAdvertiser(args.service_id,
                                             self.service_version, args.port)
                self.adv.advertise()

            check_ports = {}
            if "tcp_port" in args:
                check_ports['tcp'] = args.tcp_port
            if "http_port" in args:
                if not args.is_https:
                    check_ports['http'] = args.http_port
                else:
                    check_ports['https'] = args.http_port
            PortChecker(check_ports).start()

            self.thread_ls.extend([Jobs()])

            self.services(args, self.thread_ls)

            logger.warn("start services for %s, args:%s" %
                        (self.service_type, args))
            gevent.joinall([thread.start() for thread in self.thread_ls])
        except:
            logger.error(traceback.format_exc())
            sys.exit(0)

    def stop_service(self, *args):
        """
        退出服务
        :param args: 参数
        :return:
        """
        # 保存数据
        self.update()

        self.exit()

        if not self.is_sm:
            self.adv.notify_shutdown()

            result = stop_service(ParamCacher().sm_rpc,
                                  ArgumentParser().args.service_id)
            assert result['result'] == error_code.ERROR_SUCCESS
        [thread.stop() for thread in self.thread_ls]

    def _db_update(self):
        """
        db版本文件更新
        :return:
        """
        # 按版本更新数据库结构或数据
        assert db_update.main(ArgumentParser().args.db_host,
                              ArgumentParser().args.db_port,
                              ArgumentParser().args.db_name,
                              ArgumentParser().args.db_user,
                              ArgumentParser().args.db_password,
                              self.db_update_dir_path)

    def _start_mysqldb(self):
        """
        mysql db引擎开启
        :return:
        """
        db_instance = DBInstance(db_host=ArgumentParser().args.db_host,
                                 db_port=ArgumentParser().args.db_port,
                                 db_name=ArgumentParser().args.db_name,
                                 db_username=ArgumentParser().args.db_user,
                                 db_password=ArgumentParser().args.db_password,
                                 err_file=logger.fatal)
        db_instance.init()
        ParamCacher().db_instance = db_instance

    def _start_redis_client(self):
        """
        启动redis client
        :return:
        """
        rc = redis_client.RedisClient.instance(
            ArgumentParser().args.redis_ip,
            ArgumentParser().args.redis_port,
            ArgumentParser().args.redis_db)
        ParamCacher().redis_client = rc
Пример #6
0
class MainService(object):
    """
    服务启动管理配置模块
    """
    def __init__(self,
                 service_type,
                 service_version,
                 is_sm=False,
                 db_update_dir_path=None,
                 use_mysqldb=False,
                 use_orm=False,
                 use_redis=False):
        self.service_type = service_type
        self.service_version = service_version
        self.thread_ls = []
        self.is_sm = is_sm
        self.db_update_dir_path = db_update_dir_path
        self.use_mysqldb = use_mysqldb
        self.use_orm = use_orm
        self.use_redis = use_redis

        self.adv = None
        self.sm_rpc = None

        setproctitle(self.service_type)

        logger.init_log(self.service_type, self.service_type)
        ExitHandler().add_exit_handler(self.stop_service)

        arg_parser = ArgumentParser()
        p = arg_parser.get_argparser()

        p.add_argument('--is_https',
                       default=False,
                       type=parser_boolean,
                       help="Is use http ssl connection")
        p.add_argument('--http_port',
                       default=0,
                       type=int,
                       help="The port of the http app listen")
        p.add_argument('--tcp_port',
                       default=0,
                       type=int,
                       help="The port of of the tcp rpc app listen")

        p.add_argument('--service_type',
                       default=service_type,
                       type=str,
                       help="The type of the service")
        p.add_argument('--service_version',
                       default=use_redis,
                       type=str,
                       help="The version of the service")
        p.add_argument('--is_sm',
                       default=is_sm,
                       type=bool,
                       help="Whether it is the service manager")
        p.add_argument('--db_update_dir_path',
                       default=db_update_dir_path,
                       type=str,
                       help="The dir for db update use")
        p.add_argument('--use_mysqldb',
                       default=use_mysqldb,
                       type=parser_boolean,
                       help="Whether to use the mysqldb lib")
        p.add_argument('--use_orm',
                       default=use_orm,
                       type=parser_boolean,
                       help="Whether to use the orm db lib")
        p.add_argument('--use_redis',
                       default=use_redis,
                       type=parser_boolean,
                       help="Whether to use the redis cache")

        p.add_argument('--logger_err_2_mail',
                       default=False,
                       type=bool,
                       help="whether logger 2 mail when error")
        p.add_argument('--logger_err_2_sms',
                       default=False,
                       type=bool,
                       help="whether logger 2 sms when error")
        self.add_cmd_opts(p)

        IpFinder().is_extranet = arg_parser.args.is_extranet

        if self.db_update_dir_path:
            self._db_update()
        if self.use_mysqldb:
            self._start_mysqldb()
        if self.use_orm:
            self._start_orm()
        if self.use_redis:
            self._start_redis_client()

        args = arg_parser.args
        arg_parser.will_change = False

        self.prepare(args)
        self.init(args)
        self._set_logger(args)
        logger.set_logger_level(args.logger_level)

    def prepare(self, args):
        """
        参数准备
        :param args: 参数变量
        :return:
        """
        args.http_port = get_random_port(
        ) if args.http_port == 0 else args.http_port
        args.tcp_port = get_random_port(
        ) if args.tcp_port == 0 else args.tcp_port

    def init(self, args):
        """
        初始化接口
        :param args: 参数变量
        :return:
        """
        pass

    def exit(self):
        """
        程序退出接口
        :return:
        """
        pass

    def add_cmd_opts(self, arg_parser):
        """
        在获取sm参数之前,提供添加arg_parser参数接口
        :param arg_parser: 参数变量
        :return:
        """
        pass

    def add_cmd_opts_after_sm(self, arg_parser):
        """
        在获取sm参数之后,提供添加arg_parser参数接口
        :param arg_parser: 参数变量
        :return:
        """
        pass

    def add_port_checker(self, args, checker_ls):
        """
        添加端口检测
        :param args: 参数变量
        :param checker_ls: [{type:http/https/tcp/..., port:1111}]
        :return:
        """
        if "tcp_port" in args:
            checker_ls.append({"type": "tcp", "port": args.tcp_port})
        if "http_port" in args:
            if not args.is_https:
                checker_ls.append({"type": "http", "port": args.http_port})
            else:
                checker_ls.append({"type": "https", "port": args.http_port})
        return checker_ls

    def get_jid(self):
        return ""

    def update(self):
        """
        更新接口
        :return:
        """
        pass

    def services(self, args, thread_ls):
        """
        添加服务接口
        :param args: 参数变量
        :param thread_ls: 现有的服务列表
        :return:
        """
        pass

    def __sys_services(self, args, thread_ls):
        """
        添加系统服务接口
        :param args: 参数变量
        :param thread_ls: 现有的服务列表
        :return:
        """
        tcp_services = filter(lambda thread: isinstance(thread, TcpRpcServer),
                              thread_ls)
        if not tcp_services:
            thread_ls.append(TcpRpcServer(args.tcp_port, TcpRpcHandler))

        thread_ls.append(HttpRpcServer(args.http_port, args.is_https))
        thread_ls.extend([Jobs()])

    def start_service(self):
        """
        启动服务
        :return:
        """
        args = ArgumentParser().args
        try:
            Jobs().add_interval_job(UPDATE_INTERVAL, self.update)

            if not self.is_sm:
                port = {"tcp": args.tcp_port}
                port.update({"https": args.http_port} if args.
                            is_https else {"http": args.http_port})
                self.adv = ServiceAdvertiser(self.service_type, port,
                                             self.get_jid(),
                                             self.service_version)
                self.adv.advertise()

            checker_ls = []
            self.add_port_checker(args, checker_ls)
            PortChecker(checker_ls).start()

            self.services(args, self.thread_ls)
            self.__sys_services(args, self.thread_ls)

            logger.warn("start services for %s, args:%s" %
                        (self.service_type, args))

            gevent.joinall([thread.start() for thread in self.thread_ls])
        except:
            logger.error(traceback.format_exc())
            sys.exit(0)

    def startss(self):
        gevent.joinall([thread.start() for thread in self.thread_ls])

    def stop_service(self, *args):
        """
        退出服务
        :param args: 参数
        :return:
        """
        # 保存数据
        self.update()

        self.exit()

        if not self.is_sm:
            self.adv.notify_shutdown()
        [thread.stop() for thread in self.thread_ls]

    def _db_update(self):
        """
        db版本文件更新
        :return:
        """
        # 按版本更新数据库结构或数据
        assert db_update.main(ArgumentParser().args.db_host,
                              ArgumentParser().args.db_port,
                              ArgumentParser().args.db_name,
                              ArgumentParser().args.db_user,
                              ArgumentParser().args.db_password,
                              self.db_update_dir_path)

    def _start_mysqldb(self):
        """
        mysql db引擎开启
        :return:
        """
        db_instance = DBInstance(db_host=ArgumentParser().args.db_host,
                                 db_port=ArgumentParser().args.db_port,
                                 db_name=ArgumentParser().args.db_name,
                                 db_username=ArgumentParser().args.db_user,
                                 db_password=ArgumentParser().args.db_password,
                                 err_file=logger.fatal)
        db_instance.init()
        ParamCacher().db_instance = db_instance

    def _start_orm(self):
        """
        orm初始化
        :return:
        """
        orm_engine = OrmEngine(ArgumentParser().args.db_host,
                               ArgumentParser().args.db_port,
                               ArgumentParser().args.db_name,
                               ArgumentParser().args.db_user,
                               ArgumentParser().args.db_password)
        ParamCacher().orm_engine = orm_engine

    def _start_redis_client(self):
        """
        启动redis client
        :return:
        """
        rc = redis_client.RedisClient.instance(
            ArgumentParser().args.redis_ip,
            ArgumentParser().args.redis_port,
            ArgumentParser().args.redis_db,
            ArgumentParser().args.redis_passwd)
        ParamCacher().redis_client = rc

    def _set_logger(self, args):
        """
        设置logger
        :param args:
        :return:
        """
        def logger_operator(self,
                            msg,
                            level,
                            use_mail=False,
                            use_sms=False,
                            *args,
                            **kwargs):
            # if use_mail:
            #     mail_client = ServiceMgrCacher().get_connection(US_MAIL)
            #     send_mail(mail_client, msg, level)
            # if use_sms:
            #     sms_client = ServiceMgrCacher().get_connection(US_SMS)
            #     send_sms(sms_client, msg, level)
            pass

        if args.logger_err_2_mail or args.logger_err_2_sms:
            logger.AFTER_OPER_TAG = self.service_type
            logger.AFTER_ERROR_LOG_OPER = functools.partial(
                logger_operator,
                level='error',
                use_mail=args.logger_err_2_mail,
                use_sms=args.logger_err_2_sms)
            logger.AFTER_FATAL_LOG_OPER = functools.partial(
                logger_operator,
                level='fatal',
                use_mail=args.logger_err_2_mail,
                use_sms=args.logger_err_2_sms)