logging:不喜歡寫日誌可很差哦

logging模塊簡介

logging模塊是python內置的標準模塊,主要用於輸出程序的運行日誌。
能夠設置輸出日誌的等級,日誌保存路徑,日誌文件回滾等等。

logging模塊的基本使用

import logging


logging.basicConfig(
    level=logging.INFO,  # 指定日誌的等級爲INFO
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"  # 輸出的日誌格式
)
"""
日誌等級以下:
DEBUG:調試過程當中使用DEBUG等級,如算法中每一個循環的中間狀態
INFO:處理請求或者狀態變化等平常事務
WARNING:發生很重要的事件,可是並非錯誤時,如用戶登陸密碼錯誤
ERROR:發生錯誤時,如IO操做失敗或者鏈接問題
CRITICAL:特別糟糕的事情,如內存耗盡、磁盤空間爲空,通常不多使用
FATAL:致命錯誤
"""

"""
日誌格式以下:
%(levelno)s:打印日誌級別的數值
%(levelname)s:打印日誌級別的名稱
%(pathname)s:打印當前執行程序的路徑,其實就是sys.argv[0]
%(filename)s:打印當前執行程序名
%(funcName)s:打印日誌的當前函數
%(lineno)d:打印日誌的當前行號
%(asctime)s:打印日誌的時間
%(thread)d:打印線程ID
%(threadName)s:打印線程名稱
%(process)d:打印進程ID
%(message)s:打印日誌信息
datefmt:指定時間格式,同time.strftime();
level:設置日誌級別,默認爲logging.WARNNING;
stream:指定將日誌的輸出流,能夠指定輸出到sys.stderr,sys.stdout或者文件,默認輸出到sys.stderr,當stream和filename同時指定時,stream被忽略
"""

# 建立一個日誌打印器
logger = logging.getLogger(name="satori")  # 若是name不指定,那麼默認爲"root"

# 下面就能夠打印了
logger.debug("i am a debug")
logger.info("i am a info")
logger.warning("i am a warning")
logger.error("i am a error")
logger.critical("i am a critical")
logger.fatal("i am a fatal")
"""
2019-06-27 17:08:55,206 - satori - INFO - i am a info
2019-06-27 17:08:55,206 - satori - WARNING - i am a warning
2019-06-27 17:08:55,206 - satori - ERROR - i am a error
2019-06-27 17:08:55,206 - satori - CRITICAL - i am a critical
2019-06-27 17:08:55,206 - satori - CRITICAL - i am a fatal
"""

# 可是咱們發現debug貌似沒有打印,這是由於咱們將日誌等級設置成了INFO
# 那麼等級比它弱的將不會輸出,若是咱們將日誌等級設置爲ERROR,那麼同理debug、info、warning將不會起做用

將日誌寫入文件

import logging


# 咱們設置日誌等級和輸出格式其實有兩種,剛纔的是一種,下面介紹第二種。
logger = logging.getLogger("satori")

# 能夠經過logger設置日誌等級
logger.setLevel(level=logging.ERROR)

# 建立FileHandler,相似於open
file_handler = logging.FileHandler("1.txt", mode="a", encoding="utf-8")

# 建立輸出的格式
format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

# 將格式設置到handler裏面去
file_handler.setFormatter(format)

# 再將handler添加到logger裏面去,那麼此時logger在輸出的時候即可以輸出到文件裏面去
logger.addHandler(file_handler)

logger.warning("i am a warning")
logger.fatal("yabai,fatal occurred")

此時1.txt文件內容以下python

2019-06-27 17:19:46,525 - satori - CRITICAL - yabai,fatal occurred

並且此時並無輸出到控制檯,但若是我同時也想輸出到控制檯呢?而且我想爲輸出到文件和輸出到控制檯設置不一樣的等級,文件我想記錄的簡單一點,可是控制檯我想看的詳細一點,怎麼辦呢?算法


將日誌同時寫到文件和控制檯

import logging


logger = logging.getLogger("satori")

# 這裏就不要再使用logger設置日誌等級了
# logger.setLevel(level=logging.ERROR)

# 建立FileHandler實例,相似於open
file_handler = logging.FileHandler("2.txt", mode="a", encoding="utf-8")

# 使用FileHandler設置日誌等級
file_handler.setLevel(level=logging.ERROR)

# 建立輸出的格式
file_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

# 將格式設置到handler裏面去
file_handler.setFormatter(file_format)


# 既然文件有一個FileHandler,那麼控制檯也有一個StreamHandler
# 既然是輸出到控制檯,那麼就不須要參數了
console_handler = logging.StreamHandler()

# 設置日誌等級,控制檯我想看的詳細一點,因此設置爲INFO
console_handler.setLevel(level=logging.INFO)

# 一樣要設置日誌格式
console_format = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

console_handler.setFormatter(console_format)


# 再將handler添加到logger裏面去
logger.addHandler(file_handler)
logger.addHandler(console_handler)


logger.info("i am a info")
logger.warning("i am a warning")
logger.error("i am a error")

在控制檯和文件中分別輸出以下函數

控制檯
2019-06-27 17:32:46,031 - satori - WARNING - i am a warning
2019-06-27 17:32:46,032 - satori - ERROR - i am a error

文件
2019-06-27 17:32:46,032 - satori - ERROR - i am a error
相關文章
相關標籤/搜索