日志处理

1.⽇志的作⽤

  1. 记录程序运⾏状态

    • 线上环境所有程序以 deamon 形式运⾏在后台, ⽆法使⽤ print输出程序状态

    • 线上程序⽆⼈值守全天候运⾏, 需要有⼀种能持续记录程序运⾏状态的机制, 以便遇到问题后分析处理

  2. 记录统计数据

  3. 开发时进⾏ 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)
  ...

 

 

posted @ 2020-06-10 14:51  JustInTime  阅读(242)  评论(0)    收藏  举报