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的所有子集作為它的元素,該集合稱為...