Python拾趣014 logging日誌模組

2021-10-05 12:46:51 字數 4783 閱讀 3604

python內建的日誌模組logging可以完成各種日誌任務,方便記錄軟體運**況,方便回溯。

import logging

import os

logging.basicconfig(level=logging.info, format='%(asctime)s-%(levelname)s : %(message)s')

logger = logging.getlogger(__name__)

logger.info("start print log")

logger.debug("do something")

logger.warning("something maybe fail")

logger.info("finish")

執行,可以見到輸出:

其中輸出格式如下:

index

內容描述

1%(levelno)s

日誌級別數值

2%(levelname)s

日誌級別名稱

3%(pathname)s

當前程式路徑

4%(filename)s

當前程式名

5%(funcname)s

當前函式名

6%(lineno)d行號7

%(asctime)s時間8

%(thread)d

執行緒id

9%(threadname)s

執行緒名稱

10%(process)d

程序id

11%(message)s

日誌訊息

也可以方便把日誌寫入檔案中:

import logging

import os

logger = logging.getlogger(__name__)

logger.setlevel(level=logging.info)

handler = logging.filehandler("d:/pic/log.txt")

handler.setlevel(level=logging.debug)

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

handler.setformatter(formatter)

logger.addhandler(handler)

logger.info("start print log")

logger.debug("do something")

logger.warning("something maybe fail")

logger.info("finish")

也可以同時執行多個handler,如同時寫入檔案和在控制台輸出日誌:

import logging

import os

logger = logging.getlogger(__name__)

logger.setlevel(level=logging.debug) # 這一句必須要有,要不會產生錯誤

handler = logging.filehandler("d:/pic/log.txt")

handler.setlevel(level=logging.debug)

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

handler.setformatter(formatter)

logger.addhandler(handler)

console = logging.streamhandler()

console.setlevel(logging.info)

console.setformatter(formatter)

logger.addhandler(console)

logger.info("start print log")

logger.debug("do something")

logger.warning("something maybe fail")

logger.info("finish")

handler種類還有好多,如下:

index

handler描述1

streamhandler

日誌輸出到流

2filehandler

日誌輸出到檔案

3baserotatinghandler

基本的日誌回滾方式

4rotatinghandler

日誌回滾方式

5timerotatinghandler

在一定時間回滾的日誌

6sockethandler

日誌遠端輸出 tcp/ip方式

7datagramhandler

日誌遠端輸出 udp方式

8smtphandler

日誌輸出到郵件系統

9sysloghandler

日誌輸出到syslog

10nteventloghandler

日誌輸出到windows nt/200/xp的事件日誌

11memoryhandler

日誌輸出到記憶體中指定的buffer

通過get或者post遠端輸出到http伺服器

可以通過yaml檔案方便配置logging模組,logging.yaml如下:

version: 1

disable_existing_loggers: false

formatters:

******:

format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

handlers:

console:

class: logging.streamhandler

level: debug

formatter: ******

info_file_handler:

class: logging.handlers.rotatingfilehandler

level: info

formatter: ******

filename: d:/pic/info.log

maxbytes: 10485760

backupcount: 20

encoding: utf8

error_file_handler:

class: logging.handlers.rotatingfilehandler

level: error

formatter: ******

filename: d:/pic/errors.log

maxbytes: 10485760

backupcount: 20

encoding: utf8

loggers:

my_module:

level: error

handlers: [info_file_handler]

propagate: no

root:

level: info

handlers: [console, info_file_handler, error_file_handler]

程式如下:

"""

有趣的事情

沒有結束

2020/4/27 15:14

"""import logging

import logging.config

import yaml

import os

import pathlib2

def setup_logging(default_path="logging.yaml", default_level=logging.info, env_key="log_cfg"):

path = default_path

value = os.getenv(env_key, none)

if value:

path = value

if os.path.exists(path):

with open(path, "r") as f:

config = yaml.safe_load(f)

logging.config.dictconfig(config)

else:

logging.basicconfig(level=default_level)

def func():

logging.info("start func")

logging.info("exec func")

if __name__ == '__main__':

path = pathlib2.purepath("logging.yaml")

print(path)

setup_logging(default_path=path)

func()

可以看到結果:

參考:多謝,美美。

Python拾趣001 中文變數

一直用c 的人對於中文變數是比較難言的,但是現在好多的開發語言都加入了unicode變數的支援,中文變數也 可以使用了。由於python一直也是按照這個思維,也是從不使用中文變數的,但是今天一試,也是可以的,如下 python拾趣 001 中文變數 by linyoubiao 2020 03 18 ...

C 拾趣 類建構函式的隱式轉換

寫這個系列的博文,並不是我想對c 進行什麼批判,也不是想對其進行辯護。只是想羅列一些有意思的東西,故取名拾趣。首先我們看下一種比較常見的技術 類建構函式的隱式轉換。這兒先說明下,之後的例子中,我會為了盡量突出主要內容,而忽略一些可以作為充分條件但非必要條件的東西,故設計的一些 存在 不完善 的嫌疑。...

離散數學拾趣(三) 集合的子集有多少個

集合廣泛應用於計數問題,這類問題需要討論集合的大小。令s為集合。若s中恰有n個不同的元素,n是非負整數,就說s是有限集合,而n是s的基數,用 s 表示。若s 則 s 3。有時候需要考慮乙個集合的元素所有可能的組合,看它們是否具有某種性質。為此構造乙個新的集合,它以s的所有子集作為它的元素,該集合稱為...