python中提供的logging模块是线程安全的,多进程运行时会有问题
一、日志
1.logging主要由四个部分组成:
- Loggers: 提供直接调用的接口
- Handlers: 设置日志最终输出的地方
- Filters: 提供过滤的功能
- Formatters: 设置输出日志的格式
2.示例:以字典格式作为配置参数
import logging.config
import os
LOGGING = {
"version": 1,
"formatters": {
"basic_formatter": {
"format": "[%(asctime)s] %(module)s %(process)d [%(levelname)s] %(message)s"
}
},
"handlers": {
# 调试的时候可以用,输出到终端
"console_handler": {
"class": "logging.StreamHandler",
"level": "DEBUG",
"formatter": "basic_formatter",
"stream": "ext://sys.stdout"
},
"file_handler": {
# 文件备份方式,支持按大小和日期备份,多进程下有坑
"class": "logging.handlers.RotatingFileHandler",
"level": "DEBUG",
"formatter": "basic_formatter",
"filename": os.path.join(os.getcwd(), "log.txt"),
"mode": "a+",
"maxBytes": 524288000,
"backupCount": 5,
"encoding": "utf8"
}
},
"loggers": {
# getLogger时根据名字自动取用
"debug": {
"level": "DEBUG",
"handlers": ["console_handler", "file_handler"]
},
"online": {
"level": "INFO",
"handlers": ["file_handler"]
},
}
}
if __name__ == "__main__":
logging.config.dictConfig(LOGGING)
LOG = logging.getLogger('online')
LOG.info("123")
LOG.error("error ... ... ")
LOG.info("info ... ... ")
LOG.warning("warning ... ... ")
LOG.debug("debug ... ... ")
二、django中的使用
1.settings.py
按时间备份日志,但由于logging模块是线程安全的,所以实际环境中会有问题
LOGGING = {
'version': 1, # 指明dictConnfig的版本,目前就只有一个版本
'disable_existing_loggers': False, # 表示是否禁用django默认的日志配置,默认就是False
'formatters': {
'basic': { # 格式器的名字
# 时间 模块 进程号 级别 日志内容
'format': '[%(asctime)s] %(module)s %(process)d [%(levelname)s] %(message)s'
},
},
'handlers': { # 定义处理日志的方式
'file': {
'level': 'DEBUG',
# 'class': 'logging.FileHandler',
'class': 'logging.handlers.TimedRotatingFileHandler', # 按时间分割日志
'when': 'midnight',
'interval': 1, # 时间间隔1天
'backupCount': 5, # 保留5个备份日志
'filename': '/var/log/kzzf/OfferHelp/django.log',
'formatter': 'basic',
},
},
'loggers': { # log记录器,配置之后就会对应的输出日志
'web': { # django是默认的记录器,会记录请求的url,可以换个名字
'handlers': ['file'],
'level': 'INFO',
},
},
}
2.使用
import logging
LOG = logging.getLogger('web') # 这里的web对应了loggers中的web
LOG.info("visit the finance")
LOG.error("this is a error msg")
3.linxu下多进程的解决方案
这个模块仅支持按日志大小分割,不利于定位问题,但将就用用把
pip install ConcurrentLogHandler
'handlers': { # 定义处理日志的方式
'file': {
'level': 'DEBUG',
# 'class': 'logging.FileHandler',
'class': 'cloghandler.ConcurrentRotatingFileHandler', # linxu下多进程的解决方案
'maxBytes': 1024000,
'backupCount': 5, # 保留5个备份日志
'filename': '/var/log/kzzf/OfferHelp/django.log',
'formatter': 'basic',
},