python(14)实践Django-logging

在工作中遇到的开发对logging的使用是分两个极端的,有些人喜欢把什么信息都打印出来,一不小心日志就刷屏,另一些人什么信息都不打印,当功能操作不对时定位问题都不知道从哪里开始。

个人认为使用日志的目的是定位问题方便,围绕着容易出问题的地方,最好有日志出现。

在当前的项目中容易出问题的是在和Jenkins交互的过程中,因此在jenkins的任务中加入日志。

  1. setting配置
    # Logging setting
      LOGGING = {
         'version': 1,
         'disable_existing_loggers': False,
         'formatters': {
             'verbose': {
                 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
             },
             'main': {
                 'datefmt': '%Y-%m-%d %H:%M:%S',
                 'format': '%(asctime)s [%(module)s %(levelname)s] %(message)s',
             },
             'simple': {
                'format': '%(levelname)s %(message)s'
             },
        },
     'handlers': {
         'null': {
             'level': 'DEBUG',
             'class': 'logging.NullHandler',
         },
         'console': {
             'level': 'DEBUG',
             'class': 'logging.StreamHandler',
             'formatter': 'main'
         },
         'file': {
             'level': 'DEBUG',
             'class': 'logging.FileHandler',
             'formatter': 'main',
             'filename': os.path.join(BASE_DIR, 'data/logs', 'Testmanager.log')
         },
         'jenkins_logs': {
             'level': 'DEBUG',
             'class': 'logging.FileHandler',
             'formatter': 'main',
             'filename': os.path.join(BASE_DIR, 'data/logs', 'jenkins.log')
         },
     },
     'loggers': {
         'django': {
             'handlers': ['null'],
             'propagate': False,
             'level': LOG_LEVEL,
         },
          'django.request': {
              'handlers': ['console', 'file'],
              'level': LOG_LEVEL,
              'propagate': False,
          },
          'django.server': {
               'handlers': ['console', 'file'],
               'level': LOG_LEVEL,
               'propagate': False,
          },
           'Testmanager': {
               'handlers': ['console', 'file'],
               'level': LOG_LEVEL,
           },
           'devops.tasks': {
               'handlers': ['console', 'jenkins_logs'],
               'level': LOG_LEVEL,
            }
        }
    }
    
  2. 再devops的tasks任务中加日志
    import logging
    logger = logging.getLogger(__name__)
    
    @shared_task
    def update_pci_build_by_jenkins(job_name,build_number,pci_build_id,pid):
    jen = jenkins.Jenkins(jenkins_url, username=jenkins_user, password=jenkins_passwd)
    pci_build = PCI_BUILDS.objects.get(id=pci_build_id)
    pci = PCI.objects.get(id=pid)
    # 最后一次build号
    logger.info('update_pci_build_by_jenkins:' + "pci:" +  str(pid) + ':job_name:' + job_name + ':build_number:' + str(build_number) )
    times = jen.get_build_info(job_name, build_number)['timestamp']
    # build的日期
    result = jen.get_build_info(job_name, build_number)['result']
    ...
    
  3. 查看日志结果
    在data/logs/目录下生成jenkins.log文件
    jenkins.log中记录
    2017-08-09 19:02:02 [tasks INFO update_pci_build_by_jenkins:pci:3:job_name:epg_probe_collect:build_number:24
    
  4. 补充
    logger.critical()
    logger.error()
    logger.warning()
    logger.info()
    logger.debug()
    可根据日志信息的性质选择打压日志的级别。

推荐阅读更多精彩内容