python 之 軟件開發目錄規範 、logging模塊

6.4 軟件開發目錄規範

軟件(例如:ATM)目錄應該包含:數據庫

文件名 存放 備註
bin start.py,用於起動程序  
core src.py,程序核心功能代碼  
conf settings.py, 程序配置信息  
db db.txt 數據庫信息  
lib common.py ,存放經常使用功能  
log access.log ,存放記錄  

start.py :app

import sys,os         #應該把項目的根目錄添加到環境變量中
BASE_DIR=os.path.dirname(os.path.dirname(__file__)#os.path.dirname(__file__) 獲取當前文件上一級路徑名
sys.path.append(BASE_DIR) #拿到ATM所在的文件夾
from core import src

src.run()

sys.path.append(r'D:\code\SH_fullstack_s1\day15\ATM') 添加的是絕對路徑,不支持移植到別的硬件上運行測試

src.py :ui

from conf import settings
from lib import common

logger1=common.get_logger('atm')

def login():
   print('登陸....')
   with open(settings.DB_PATH,encoding='utf-8') as f:
       for line in f:
           print(line)

def register():
   print('註冊....')

def shop():
   print('購物....')

def pay():
   print('支付...')

def transter():
   print('轉帳...')
   common.logger('xxxx給他爹xx轉帳10000')
   logger1.debug('xxxx給他爹xx轉帳10000')
   logger1.error('xxxx給他爹xx轉帳10000,轉帳失敗')

def run():
   while True:
       print("""
      1 登陸
      2 註冊
      3 購物
      4 支付
      5 轉帳
      """)

       choice=input('>>: ').strip()
       if choice == '1':
           login()
       elif choice == '2':
           register()
       elif choice == '3':
           shop()
       elif choice == '4':
           pay()
       elif choice == '5':
           transter()
       else:
           print('輸入錯誤指令')

settings.py:spa

DB_PATH=r'D:\code\SH_fullstack_s1\day15\ATM\db\db.txt' #自定義設置的文件路徑
LOG_PATH=r'D:\code\SH_fullstack_s1\day15\ATM\log\access.log'
LOGGING_DIC = {.....} #log配置字典

common.py :debug

from conf import settings

def logger(msg):
   with open(settings.LOG_PATH,'a',encoding='utf-8') as f:
       f.write('%s\n' %msg)

       
import logging.config
import logging
from conf import settings

def get_logger(name): #name='atm'
   logging.config.dictConfig(settings.LOGGING_DIC)  # 導入上面定義的logging配置
   l1=logging.getLogger(name)
   return l1

6.5 logging 模塊

import logging
logging.basicConfig(      #爲logging模板指定全局配置,針對全部logger有效,控制打印到文件中
filename='access.log', # /stream=sys.stdout 打印在屏幕上,但和filename只能存在其一
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=40
)
logging.debug('debug...') # 10
logging.info('info....') #20
logging.warning('.....') #30
logging.error('......') # 40
logging.critical('.....') #50

6.51 logging模塊的四類對象

logger:負責產生日誌調試

logger1=logging.getLogger('xxx')

filter:過濾日誌(不經常使用)日誌

handler:控制日誌打印到文件or終端code

fh1=logging.FileHandler(filename='a1.log',encoding='utf-8')
fh2=logging.FileHandler(filename='a2.log',encoding='utf-8')
sh=logging.StreamHandler()

formatter:控制日誌的格式orm

formatter1=logging.Formatter(
fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
)

formatter2=logging.Formatter(fmt='%(asctime)s - %(message)s',)

logger ---->多個file handler <----多個formatter

綁定關係:

1.爲logger1對象綁定handler:

logger1.addHandler(fh1)
logger1.addHandler(fh2)
logger1.addHandler(sh)

2.爲handler對象綁定日誌格式

fh1.setFormatter(formatter1)
fh2.setFormatter(formatter1)
sh.setFormatter(formatter2)

設定日誌級別: 兩層關卡,必須都經過,日誌才能正常記錄

logger1.setLevel(10)
fh1.setLevel(10)
fh2.setLevel(10)
sh.setLevel(10)

#調用logger1對象下的方法,產生日誌,而後交給不一樣的handler,控制日誌記錄到不一樣的地方
logger1.debug('調試信息') #調用logger1,產生日誌

日誌的繼承

import logging
logger1=logging.getLogger('xxx')
logger2=logging.getLogger('xxx.son')
logger3=logging.getLogger('xxx.son.grandson')

sh=logging.StreamHandler()

formatter2=logging.Formatter(fmt='%(asctime)s - %(message)s',)

sh.setFormatter(formatter2)

logger1.addHandler(sh)
logger2.addHandler(sh)
logger3.addHandler(sh)

logger1.setLevel(10)
logger2.setLevel(10)
logger3.setLevel(10)
sh.setLevel(10)

logger1.debug('測試。。。。')
logger2.debug('測試。。。。')
logger3.debug('測試。。。。')
相關文章
相關標籤/搜索