logging

日志级别等级 CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

#!/usr/bin/env python
# coding:utf-8

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
    datefmt='%a, %d %b %Y %H:%M:%S',
    filename='test.log',
    filemode='w'
)

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
%(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用户输出的消息

Django logging

代码文件中,直接可以 get 到自定义的 onlyoffice logger,使用自定义的 onlyoffice logger 来处理。

logger = logging.getLogger('onlyoffice')

代码文件中(seahub/api2/endpoints/upload_links.py),get logger 时,获取到的是 __name__seahub.api2.endpoints.upload_links),按层级关系依次向上寻找 logger。

logger = logging.getLogger(__name__)
logger.error('in upload link')

如果自定义或者层级关系均未找到 logger,则使用 root(或 '')定义的 logger。

settins.py

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,

    'formatters': {
        'upload_link_format': {
            'format': '%(lineno)s %(funcName)s %(message)s',

        },
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s:%(lineno)s %(funcName)s %(message)s',

        }
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        },
        'require_debug_true': {
            '()': 'django.utils.log.RequireDebugTrue'
        },
    },
    'handlers': {
        'upload_link_handler': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'upload_link_format',
        },
        'console': {
            'level': 'DEBUG',
            'filters': ['require_debug_true'],
            'class': 'logging.StreamHandler',
            'formatter': 'standard',
        },
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'seahub.log'),
            'maxBytes': 1024*1024*100,  # 100 MB
            'backupCount': 5,
            'formatter': 'standard',
        },
        'onlyoffice_handler': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': os.path.join(LOG_DIR, 'onlyoffice.log'),
            'maxBytes': 1024*1024*100,  # 100 MB
            'backupCount': 5,
            'formatter': 'standard',
        },
    },
    'loggers': {
        '': {  # 默认 logger
            'handlers': ['default'],
            'level': 'INFO',
            'propagate': True
        },
        'seahub.api2.endpoints': {  # 按层级关系依次向上寻找 logger
            'handlers': ['upload_link_handler', ],
            'level': 'DEBUG',
            'propagate': False
        },
        'onlyoffice': {  # 自定义的 onlyoffice logger
            'handlers': ['onlyoffice_handler', ],
            'level': 'INFO',
            'propagate': False
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': "DEBUG",
            'propagate': False,
        },
    }
}