从异步外部模块

问题描述

我需要动态更改日志级别,而无需重新加载任何模块。为此,我将异步处理和多处理结合使用(两者都用于我正在编写的较大程序)。

log_config.py

def setupLogging(log_level=None): # load custom logger
    with open(os.path.join(LOG_PATH,'log_config.yaml'),'rt') as file_:
        config = yaml.safe_load(file_.read())
        logging.config.dictConfig(config)
        logging.Formatter.converter = time.gmtime

    if not log_level:
        log_level = 'preview'
    
    return logging.getLogger(log_level)

logger=setupLogging() # global var that needs dynamic updation
async def logger_changes(): # socket listener that changes the logger object
    global logger
    sock = socket.socket(socket.AF_INET,socket.soCK_STREAM)
    sock.bind(('localhost',9999))
    sock.listen()
    sock.setblocking(0)
    while True:
        try:
            conn,addr = sock.accept()
            data = conn.recv(1024)
            conn.send(data)
            logger = setupLogging(data.decode('utf8'))
        except Exception as e:
            pass
        await asyncio.sleep(5)

async def logger_handler():
    t1 = asyncio.create_task(logger_changes())
    await t1

def start_logger():
    start_func = asyncio.run(logger_handler())

pLOGGER = Process(name="__startLOGGER__",target=start_logger,daemon=False)
pLOGGER.start()

主要功能

import log_config
logger=log_config.logger

async def core_func():
    for i in range(10):
        logger.debug("sample debug log")
        logger.info("sample info log")
        logger.warning("Watch out!")
        logger.error("heading for trouble!")
        logger.critical("SerIoUsly,do something!")
        print("#"*80)

        await asyncio.sleep(5)

async def core_func_parent():
    t1 = asyncio.create_task(core_func())
    await t1

def core_func_handler():
    start_func = asyncio.run(core_func_parent())

if __name__=='__main__':
    pMODULE = Process(name="__startMODULE__",target=core_func_handler,daemon=False)
    pMODULE.start()

触发日志级别更改

import socket

server = socket.socket(socket.AF_INET,socket.soCK_STREAM)
server.connect(('localhost',9999))
request = "test"

try:
    server.send(request.encode('utf8'))
    response = server.recv(255).decode('utf8')
    print(response)
except Exception as e:
    print(e)
    server.close()

步骤

  1. 运行主要功能python脚本。从内部自动调用log_config,启动套接字侦听器并实例化logger对象
  2. 运行触发日志级别更改,以更新的logger设置向网络套接字发送消息

挑战

运行步骤1后,日志记录级别为INFO(正是我想要的)

但是,一旦我执行了步骤2,我期望日志记录级别更改为DEBUG,这没有发生。

感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)