问题描述
我需要动态更改日志级别,而无需重新加载任何模块。为此,我将异步处理和多处理结合使用(两者都用于我正在编写的较大程序)。
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后,日志记录级别为INFO
(正是我想要的)
但是,一旦我执行了步骤2,我期望日志记录级别更改为DEBUG
,这没有发生。
感谢您的帮助。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)