日志配置

1.日志級(jí)別

import logging

logging.debug("調(diào)試日志")
logging.info("信息日志")
logging.warn("警告warn日志")
logging.error("錯(cuò)誤erroe日志")
logging.critical("嚴(yán)重critical")

2.日志配置

  • 格式化字符串
    logging中定義好的
字段/屬性名稱 使用格式 描述
asctime %(asctime)s 日志事件發(fā)生的時(shí)間--人類可讀時(shí)間,如:2003-07-08 16:49:45,896
created %(created)f 日志事件發(fā)生的時(shí)間--時(shí)間戳,就是當(dāng)時(shí)調(diào)用time.time()函數(shù)返回的值
relativeCreated %(relativeCreated)d 日志事件發(fā)生的時(shí)間相對(duì)于logging模塊加載時(shí)間的相對(duì)毫秒數(shù)(目前還不知道干嘛用的)
msecs %(msecs)d 日志事件發(fā)生事件的毫秒部分
levelname %(levelname)s 該日志記錄的文字形式的日志級(jí)別('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
levelno %(levelno)s 該日志記錄的數(shù)字形式的日志級(jí)別(10, 20, 30, 40, 50)
name %(name)s 所使用的日志器名稱,默認(rèn)是'root',因?yàn)槟J(rèn)使用的是 rootLogger
message %(message)s 日志記錄的文本內(nèi)容,通過 msg % args計(jì)算得到的
pathname %(pathname)s 調(diào)用日志記錄函數(shù)的源碼文件的全路徑
filename %(filename)s pathname的文件名部分,包含文件后綴
module %(module)s filename的名稱部分,不包含后綴
lineno %(lineno)d 調(diào)用日志記錄函數(shù)的源代碼所在的行號(hào)
funcName %(funcName)s 調(diào)用日志記錄函數(shù)的函數(shù)名
process %(process)d 進(jìn)程ID
processName %(processName)s 進(jìn)程名稱,Python 3.1新增
thread %(thread)d 線程ID
threadName %(thread)s 線程名稱

  • 基本配置
import logging

logging.basicConfig(
    # 日志輸出位置:1.終端(控制臺(tái)),2.文件,
    filename="access.log", # 不指定filename,默認(rèn)打印到終端,指定輸出到文件,二者只能其一,兩者接口用日志字典形式

    # 日志格式
    # 2020-08-10 23:13:38 PM - root - DEBUG - logDemo: 調(diào)試日志
    format='%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s',

    # 時(shí)間格式
    datefmt = '%Y-%m-%d %H:%M:%S %p',

    # 日志級(jí)別,默認(rèn)level = 30
    # critical => 50
    # error => 40
    # warn => 30
    # info => 20
    # debug => 10
    level = 10
)

logging.debug("調(diào)試日志") # 2020-08-10 23:13:38 PM - root - DEBUG - logDemo: 調(diào)試日志og
  • 字典配置
    創(chuàng)建一個(gè)文件setting.py
simple_format = '%(asctime)s - %(name)s - %(levelname)s - %(module)s: %(message)s'
test_format = ''

LOGGING_DIR = {
    # 版本,自定義,可不指定
    'version': 1,
    # 關(guān)閉存在的日志,默認(rèn)fasle
    'disable_existing_loggers': False,
    # 日志格式配置
    'formatters': {
        # k-v,k可以任意,自定義日志格式名稱
        'standard': {
            # format固定參數(shù),不可修改
            'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]'
        },
        'simple': {
            'format': simple_format
        },
        'test': {
            'format': test_format
        }
    },
    # 日志接受者,將日志輸出到不同的位置
    'handlers': {
        # k:任意,打印到終端
        'console': {
            # k:固定參數(shù),level可以寫數(shù)字級(jí)別,字符串必須大寫
            'level': 'DEBUG',
            # 輸出調(diào)用類,如下:打印到屏幕
            'class': 'logging.StreamHandler',
            # 日志輸出格式->調(diào)用formatters中定義的key
            'formatter': 'simple'
        },
        # 打印到文件日志
        'default': {
            'level': 'INFO',
            # 日志輪轉(zhuǎn),日志大小超過maxBytes,切割
            'class': 'logging.handlers.RotatingFileHandler',
            'formatter': 'standard',
            # 指定文件路徑
            # base_path = os.path.dirname(os.path.abspath(__file__))
            # log_path = os.path.join(base_path,'logs/','a.log')
            'filename': 'a.log',
            # 日志大小 5M
            'maxBytes': 1024 * 1024 * 5,
            # 日志備份數(shù)量
            'backupCount': 5,
            'encoding': 'utf-8'
        },
        'other': {
            'level': 10,
            # 報(bào)存到文件,就一個(gè)文件存儲(chǔ)
            'class': 'logging.FileHandler',
            'formatter': 'test',
            'filename': 'a1.log',
            'encoding': 'utf-8'
        }
    },
    # 日志產(chǎn)生者,產(chǎn)生的日志會(huì)傳遞給handler,然后輸出打印
    'loggers': {
        # logging.getLogger(__name__)拿到logger配置,logging.getLogger('kkk')
        # 日志名稱;定義的展示格式%(name)s
        'kkk': {
            # 同時(shí)日志傳遞給兩個(gè)handler
            'handlers': ['default', 'console'],
            # 生成日志級(jí)別
            'level': 'DEBUG',  # 傳遞給handler日志-->handlder中日志級(jí)別比此日志更高,handler中才能接受
            'propagate': False,  # 默認(rèn)True,向上傳遞,如果此為True->傳遞給info->error...,為flase,日志獨(dú)立,只傳遞給handler
        },
        'bbb': {
            'handlers': ['console']
            # ...
        },
        # 當(dāng)logging.getLogger('用戶')找不到時(shí)候,就用空配置,%(name)s=用戶
        '':{
            #...
        }
    }
}

測(cè)試

from logging import config,getLogger
import setting

config.dictConfig(setting.LOGGING_DIR)
logger1 = getLogger('kkk')
# 去setting.py中找loggers下有無aaa,無就找空key:"",日志名稱%(name)s="aaa"
logger1.info("aaa") 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容