python 有自带logging 非常强大,网上也查了很多自配置的logger可以说体验不太好,一旦有import问题,日志重复打印什么的,各种各样的问题,下面记录一种可以适用于任何框架的logging,这个不是自创的,不记得是哪里查到的了。
- logg_config.py配置文件
import logging
logging_config = dict(
version=1,
formatters={
'simple': {'format': '%(asctime)s %(levelname)s {path: %(pathname)s Line_No: %(lineno)d} %(message)s'}
},
handlers={
'default_handlers': {'class': 'logging.handlers.RotatingFileHandler',
'filename': './logfile/logger.log',
'maxBytes': 1024 * 1024 * 20,
'backupCount': 50,
'level': 'WARNING',
'formatter': 'simple',
'encoding': 'utf8'}
},
root={
'handlers': ['default_handlers'],
'level': logging.WARNING,
},
)
- 写在配置文件里面,用于在程序最初启动的时候,加载一遍,全局通用。
from logging.config import dictConfig
import logging_config
dictConfig(logging_config.logging_config)
- 无论在哪个文件使用的正确打开方式
import logging
loger = logging.getLogger("default_handlers")
loger.info("我要打印日志")
工作中正在使用的通用本地日志记录
-- log_config.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:SunXiuWen
# datetime:2019/8/22 0022 9:39
import os
import platform
BASEDIR = os.path.dirname(
os.path.dirname(
os.path.dirname(
os.path.abspath(__file__))))
# 本地项目日志路径
CURRENT_LOG_PATH = os.path.join(BASEDIR, 'log')
PREFIX = CURRENT_LOG_PATH if platform.system(
) == 'Windows' else '/opt/logs/python_apps_logs/Business_lsms_sync_service'
# 判断目录是否存在,若不存在则创建
if not os.path.exists(PREFIX):
os.makedirs(PREFIX)
# 日志文件路径
LOG_PATH_DEBUG = r'%s\debug.log' % PREFIX if platform.system(
) == 'Windows' else '%s/debug.%s.log' % (PREFIX, os.getpid())
LOG_PATH_INFO = r'%s\info.log' % PREFIX if platform.system(
) == 'Windows' else '%s/info.%s.log' % (PREFIX, os.getpid())
LOG_PATH_WARN = r'%s\warn.log' % PREFIX if platform.system(
) == 'Windows' else '%s/warn.%s.log' % (PREFIX, os.getpid())
LOG_PATH_ERROR = r'%s\error.log' % PREFIX if platform.system(
) == 'Windows' else '%s/error.%s.log' % (PREFIX, os.getpid())
# 日志配置
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '[%(asctime)s] %(levelname)s::(%(process)d %(thread)d)::%(module)s[line:%(lineno)d] - %(message)s'
},
},
'handlers': {
'error': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'level': 'ERROR',
'formatter': 'standard',
'filename': LOG_PATH_ERROR + '_file',
'when': 'H',
'interval': 1
},
'warn': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'level': 'WARN',
'formatter': 'standard',
'filename': LOG_PATH_WARN + '_file',
'when': 'H',
'interval': 1
},
'info': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'level': 'INFO',
'formatter': 'standard',
'filename': LOG_PATH_INFO + '_file',
'when': 'H',
'interval': 1
},
'debug': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'level': 'DEBUG',
'formatter': 'standard',
'filename': LOG_PATH_DEBUG + '_file',
'when': 'H',
'interval': 1
}
},
'loggers': {
'default': {
'handlers': ['debug', 'info', 'warn', 'error'],
'level': 'DEBUG',
'propagate': True
}
}
}
总的config文件中配置
from configs.log_conf.log_config import LOGGING_CONFIG
# 本地日志管理配置
CURRENT_CONFIG['LOGGING_CONFIG'] = LOGGING_CONFIG
各py文件中应用
import config
logging.config.dictConfig(config.LOGGING_CONFIG)
logger = logging.getLogger('default')
def test():
logger.debug("xxx")
pass