日志处理
1.⽇志的作⽤
-
记录程序运⾏状态
-
线上环境所有程序以 deamon 形式运⾏在后台, ⽆法使⽤ print输出程序状态
-
-
-
记录统计数据
-
开发时进⾏ Debug (调试)
2.基本⽤法
import logging
from logging import handlers
# 设置⽇志格式
fmt = '%(asctime)s %(levelname)7.7s %(funcName)s: %(message)s'
formatter = logging.Formatter(fmt, datefmt="%Y-%m-%d%H:%M:%S")
# 设置 handler
handler =handlers.TimedRotatingFileHandler('myapp.log',when='D', backupCount=30)
handler.setFormatter(formatter)
# 定义 logger 对象
logger = logging.getLogger("MyApp")
logger.addHandler(handler)
logger.setLevel(logging.INFO)
3.⽇志的等级
-
DEBUG: 调试信息
-
INFO: 普通信息
-
WARNING: 警告
-
ERROR: 错误
-
FATAL: 致命错误
4.对应函数
logger.debug(msg)
logger.info(msg)
logger.warning(msg)
logger.error(msg)
logger.fatal(msg)
5. ⽇志格式允许的字段
%(name)s : Logger 的名字
%(levelno)s : 数字形式的⽇志级别
%(levelname)s : ⽂本形式的⽇志级别
%(pathname)s : 调⽤⽇志输出函数的模块的完整路径名, 可能没有
%(filename)s : 调⽤⽇志输出函数的模块的⽂件名
%(module)s : 调⽤⽇志输出函数的模块名
%(funcName)s : 调⽤⽇志输出函数的函数名
%(lineno)d : 调⽤⽇志输出函数的语句所在的代码⾏
%(created)f : 当前时间, ⽤ UNIX 标准的表示时间的浮点数表示
%(relativeCreated)d : 输出⽇志信息时的, ⾃ Logger 创建以来的毫秒数
%(asctime)s : 字符串形式的当前时间。默认格式是“2003-07-08 16:49:45,896”。逗号后⾯的是毫秒
%(thread)d : 线程 ID。可能没有
%(threadName)s : 线程名。可能没有
%(process)d : 进程 ID。可能没有
%(message)s : ⽤户输出的消息
6. Django 中的⽇志配置
# 日志的配置
LOGGING = {
'version': 1,
# 打开或者关闭 Django 自带的日志 (NOTE: False 时可以查看Django生成的SQL语句),同时DEBUG = True
'disable_existing_loggers': True,
# 格式配置
'formatters': {
'simple': {
'format': '%(asctime)s %(module)s.%(funcName)s: %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S',
},
'verbose': {
'format': ('%(asctime)s %(levelname)s [%(process)d-%(threadName)s] '
'%(module)s.%(funcName)s line %(lineno)d: %(message)s'),
'datefmt': '%Y-%m-%d %H:%M:%S',
}
},
# Handler 配置
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
'info': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': f'{BASE_DIR}/logs/info.log', # 日志保存路径
'when': 'midnight', # 每天凌晨零点切割日志
'backupCount': 30, # 日志保留 30 天
'formatter': 'simple',
},
'error': {
'class': 'logging.handlers.TimedRotatingFileHandler',
'filename': f'{BASE_DIR}/logs/error.log', # 日志保存路径
'when': 'W0', # 每周一切割日志
'backupCount': 4, # 日志保留 4 周
'formatter': 'verbose',
}
},
# Logger 配置
'loggers': {
'django': {
'handlers': ['console'],
'level': 'DEBUG' if DEBUG else 'ERROR'
},
'inf': {
'handlers': ['info'],
'propagate': True,
'level': 'DEBUG' if DEBUG else 'INFO',
},
'err': {
'handlers': ['error'],
'propagate': True,
'level': 'DEBUG' if DEBUG else 'ERROR',
}
}
}
使用:
from UserApp.models import User
...
import logging
inf_log=logging.getLogger('inf')
# 发送验证码
def gen_code(phone):
key = 'Vcode-{}'.format(phone)
if cache.get(key):
return True
random_code = gen_code_random()
# print(random_code)
inf_log.info('验证码:%s'%random_code)
...

浙公网安备 33010602011771号