python模塊知識四 包和logging日誌

11.包

包:文件夾下具有__init__.py文件就是一個包,包用來管理多個模塊

包的結構如下:

bake            

    ├── __init__.py       

    ├── api               

        ├── __init__.py

        ├── policy.py

        └── versions.py

  ├── cmd             

    ├── __init__.py

    └── manage.py

  └── db                

      ├── __init__.py

      └── models.py

在bake的同級創建一個test.py導入policy.py:

import bake.api.policy
bake.api.policy.get()
#導入的名字太長了,可以起別名
import bake.api.policy as p
p.get()
#from 導入在__init__.py修改
from . import policy

#我們需要在policy文件中向sys.path添加了當前的路徑
import os
import sys
sys.path.insert(os.path.dirname(__file__))
#print(__file__)查看一下

#使用__all__,在__init__.py中
__all__ = ["policy"]
#或
from . import policy

總結:

​ import 包.包.包

​ from 包.包.包 import 模塊

​ 路徑:

​ 絕對:從在外層開始導入

​ 相對:從當前開始(.)導入或者從父級(..)導入

​ 使用相對路徑時必須在包的最外層且同級

​ from 包 import *

​ 需要在__init__.py做操作

​ python2:import文件夾(沒有__init__.py)會報錯

​ python3:import文件夾(沒有__init__.py)不會報錯

12.logging模塊

​ logging模塊用於記錄軟件的各種狀態,交易記錄,錯誤記錄,登錄記錄……

1.函數式簡單配置:

import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')

​ 默認情況下python的logging模塊將日誌打印到了標準輸出中,且只显示了大於等於WARNING級別的日誌,證明默認的級別為WARNING

日誌級別:CRITICAL > ERROR > WARNING > INFO > DEBUG

2.靈活配置日誌級別,日誌模式,輸入位置(低配版)

​ 只能寫入日誌,不能公屏輸出

import logging
logging.basicConfig(level = logging.DEBUG,
                    format = '%(astime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt = '%Y-%m-%d %H:%M:%S',
                    filename = 'test.log',
                    filemode = 'a')
dic = {"key":123}
logging.debug(dic)

num = 100
logging.info(f"用戶餘額:{num - 50}")

try:
    num = int(input("請輸入数字:"))
except Exception as e:
    logging.warning("e")

logging.error('error message')
logging.critical('critical message')

basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有:

  • filename:用指定的文件名創建FiledHandler,這樣日誌會被存儲在指定的文件中。
  • filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
  • format:指定handler使用的日誌显示格式。
  • datefmt:指定日期時間格式。
  • level:設置記錄日誌的級別
  • 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用戶輸出的消息

3.logger對象配置(中配版)

import logging
logger = logging.getLogger()
# 創建一個logger
fh = logging.FileHandler('test.log',mode="a",encoding='utf-8')   # 文件
ch = logging.StreamHandler()   # 屏幕
formatter = logging.Formatter('%(asctime)s - %(name)s - %(filename)s - [line:%(lineno)d] -  %(levelname)s - %(message)s')
# 將屏幕和文件都是用以上格式
logger.setLevel(logging.DEBUG)
# 設置記錄級別
fh.setFormatter(formatter)
# 使用自定義的格式化內容
ch.setFormatter(formatter)
logger.addHandler(fh) #logger對象可以添加多個fh和ch對象
logger.addHandler(ch)

logger.debug('logger debug message')
logger.info('logger info message')
logger.warning('logger warning message')
logger.error('logger error message')
logger.critical('logger critical message')

点赞

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *