python logging 使用記錄:設置INFO級別不生效,格式化,輸出到文件

錯誤示範

import logging

log = logging.getLogger()
log.setLevel(logging.INFO)
log.info("INFO INFO INFO")
log.warning("這是WARN")
複製代碼
# 輸出
D:\workspace\investment\venv\Scripts\python.exe D:/workspace/python-common/basic/logging_test.py
這是WARN
複製代碼

沒有輸出INFO的日誌級別。默認是WARN級別的日誌,這裏沒有輸出WARN說明沒有設置成功。java

設置一個handler

import logging

if __name__ == '__main__':
    log = logging.getLogger()
    handler = logging.StreamHandler()
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("這是INFO-1")
複製代碼

這時能夠正常輸出INFO了python

logging.getLogger() 和 logging.getLogger(name)

import logging

if __name__ == '__main__':
    log = logging.getLogger()
    handler = logging.StreamHandler()  # StreamHandler是輸出到控制檯
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("這是INFO-1")

    logger = logging.getLogger()
    logger.info("這是INFO-2")
複製代碼

image

此時第二個logger也被設置了INFO級別了,查看源碼:markdown

image

能夠看到名字爲None時返回的是一個root對象,這也是爲何第二個logger也被修改的緣由。app

日誌輸出位置

常見的輸出到控制檯和文件函數

import logging

if __name__ == '__main__':
    log = logging.getLogger("console-logger")
    handler = logging.StreamHandler()
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("這是INFO-1")

    log2 = logging.getLogger("file-logger")
    file_handler = logging.FileHandler("E:/test.log")
    log2.addHandler(file_handler)
    log2.setLevel(logging.WARNING)
    log2.info("這個不會被記錄")
    log2.warning("警告警告~~~~")
複製代碼

設置格式

默認只是輸出了message,這樣子還不如直接用print()函數了。因此還須要格式化一下:ui

image

設置格式化要用到logging.Handlerspa

import logging


def print_name(logger, name):
    logger.info("name={}".format(name))


if __name__ == '__main__':
    log = logging.getLogger("console-logger")
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter("%(asctime)s %(filename)s %(funcName)s[line:%(lineno)d]%(levelname)s - %(message)s"))
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("這是INFO-1")
    print_name(log, "happyjava")
複製代碼

輸出效果:線程

image

formatter參數日誌

# format參數中可能用到的格式化串
# %(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用戶輸出的消息
複製代碼
相關文章
相關標籤/搜索