Python日誌模組之你還在用PRINT列印日誌嗎

2022-06-23 22:27:17 字數 4815 閱讀 8536

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 level')

logging.info(

'info level')

logging.warning(

'warning level')

logging.error(

'error level')

logging.critical(

'critical level

')

我們知道在日常寫python程式的時候開業用print來列印一些日誌,當然在小的程式裡不用出現什麼問題,但是你有沒有想過當你的**量到成千上萬行的時候,還是用print來列印,那就是災難,今天就給大家介紹下python中的日誌模組 logging模組。

logging可以分成兩部分來講

1.logging, 重點在於logging.basicconfig

2.logger物件,重點在於filehandler(用於向檔案輸出)和streamhandler(用於向控制台輸出)

下面看看案例

方法一logging (注意我們新建py檔案的時候,py檔名不要和包的名稱一樣,就是py檔案名字不要建成logging.py, 不然會報錯)

import logging

logging.debug('debug level')

logging.info('info level')

logging.warning('warning level')

logging.error('error level')

logging.critical('critical level')

結果:warning:root:warning level

error:root:error level

critical:root:critical level

我們會發現下面2個沒有輸出到控制台,這是因為我們python裡面的預設日誌級別是warning

logging.debug('debug level')

logging.info('info level')

下面我們自己設定下日誌級別看看,也就是logging模組的重點logging.basicconfig

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 level')

logging.info('info level')

logging.warning('warning level')

logging.error('error level')

logging.critical('critical level')

我們會發現控制台沒有輸出,但是py檔案的同路徑出現乙個test.log的日誌檔案

或者我們不加filename='test.log'

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 level')

logging.info('info level')

logging.warning('warning level')

logging.error('error level')

logging.critical('critical level')

結果sun, 24 mar 2019 11:37:26 log.py[line:9] debug debug level

sun, 24 mar 2019 11:37:26 log.py[line:10] info info level

sun, 24 mar 2019 11:37:26 log.py[line:11] warning warning level

sun, 24 mar 2019 11:37:26 log.py[line:12] error error level

sun, 24 mar 2019 11:37:26 log.py[line:13] critical critical level

控制台完整輸出了從debug到critical的日誌,而且是按照我們要想的格式

是不是更賞心悅目了呢

下面是basicconfig的引數介紹,**於網路擷取(

侵權刪logging.basicconfig()函式中可通過具體引數來更改logging模組預設行為,可用引數有:

filename:用指定的檔名建立filedhandler,這樣日誌會被儲存在指定的檔案中。

filemode:檔案開啟方式,在指定了filename時使用這個引數,預設值為「a」還可指定為「w」。

format:指定handler使用的日誌顯示格式。

datefmt:指定日期時間格式。

level:設定rootlogger(後邊會講解具體概念)的日誌級別

stream:用指定的stream建立streamhandler。可以指定輸出到sys.stderr,sys.stdout或者檔案(f=open(『test.log』,』w』)),預設為sys.stderr。若同時列出了filename和stream兩個引數,則stream引數會被忽略。

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使用者輸出的訊息

那說到這裡有人是不是就發現了,上面的方式要不就是把日誌輸出到控制台,要不就是輸出到日誌檔案,那麼如果我即想輸出到控制台也想輸出到檔案, 那怎麼辦呢?那就要用我們今天說的第二種方法 logger物件。

2. logger物件,這樣就可以同時向檔案和控制台列印日誌了,解釋都在**裡。

import logging

#固定寫法

# logger = logging.getlogger()

logger = logging.getlogger('mylogger')

#設定日誌級別

logger.setlevel(logging.debug)

# 建立乙個filehandler,用於寫入日誌檔案

file = logging.filehandler('test.log')

# 再建立乙個streamhandler,用於輸出到控制台

consle = logging.streamhandler()

#定義輸出格式,可以自己定

formatter = logging.formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')

#繫結格式和filehandler,streamhandler

file.setformatter(formatter)

consle.setformatter(formatter)

#logger物件可以新增多個filehandler和consle物件

logger.addhandler(file)

logger.addhandler(consle)

#輸出logger.debug('logger debug level')

logger.info('logger info level')

logger.warning('logger warning level')

logger.error('logger error level')

logger.critical('logger critical level')

你還在用自簽名SSL證書嗎?

目前,有一些公司或者個人出於成本的考慮,會選擇使用自簽名ssl證書,即不受信任的任意機構或個人,使用工具自己簽發的ssl證書。這絕對是www.cppcns.com得不償失的重大決策失誤,自簽證書普遍存在嚴重的安全漏洞,極易受到攻擊。一旦使用這種隨意簽發的 不受監督信任的證書,就很容易被黑客偽造用來攻...

還在用浮動嗎?CSS flex布局你了解多少?

傳統的布局 圍繞盒子模型 border margin padding 定位 position 浮動 float 等。flex 布局又叫彈性布局 主要內容包括兩大部分有 容器 父元素 的六個屬性和專案 子元素 的六個屬性 基本概念 採用 flex 布局的元素,稱為 flex 容器 flex conta...

如果你還在用STM32F103,那麼你OUT了

自從arm公司2007年首推出cortex核心,st憑藉基於arm cortex m3核心的stm32f1,無疑成為了最大的贏家之一。特別是stm32f103系列,更是成為市場上最通用的mcu系列之一。不過在cortex m3核心出來了7年之際,在我看來cortex m3核心已經不能算是價效比最高的...