ConcurrentLogHandler 在Windows下的问题解决
问题描述
Python中的logging模块自带的一些handlers无法在多进程环境下使用,于是下载了Lowell Alleman's ConcurrentLogHandler
的这个package。windows下安装时可能还需要安装pypiwin32
(pywin32
不能用pip
直接安装,而且pyenv下安装比较麻烦,所以推荐前者)。使用时出现了进程卡住的情况,查证之后发现是windows下的lock无法正常的获取和释放。
解决方法
进行环境判断
在Linux环境下可以正常使用,但是windows下不行,所以可考虑将程序部署到Linux运行,本地windows测试时考虑使用非进程安全的handler调试。concurrent-log-handler
Github上有位老哥修复了这个问题,并做成了可用的package,地址在这。安装完成后重新导入即可。
下面贴下我的简单配置
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
'datefmt': "%Y-%m-%d %H:%M:%S"
},
'simple': {
'format': '%(message)s'
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'file': {
'level': 'INFO',
'class': 'concurrent_log_handler.ConcurrentRotatingFileHandler', #这里是重点
'maxBytes': 1024 * 1024 * 10,
'backupCount': 50,
'delay': True,
'filename': 'logs/logging.log',
'formatter': 'simple'
}
},
'loggers': {
'': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
}
}
使用方法
import os
from simple_settings import settings # 安利下这个配置管理库,挺好用的
os.environ['SIMPLE_SETTINGS'] = 'settings.development' # 把上面的配置存到development里面去
settings.setup()
logging.config.dictConfig(settings.LOGGING_CONFIG)
logger = logging.getLogger()
def test():
logger.info("this is a test")
if __name__ == '__main__':
test()
问题解决