1. 程式人生 > >login,shevle和sys模組

login,shevle和sys模組

import logging

簡單的使用
logging.debug("這是一條日誌資訊!") # 沒有輸出任何內容
因為loggong模組為日誌劃分了級別
由於你輸出的級別沒有達到最低級別所以沒有輸出
為什麼要設定最低等級
因為一些級別的日誌
對我是無用的

logging.info("info")
logging.debug("debug")
logging.warning("warning")
logging.error("error")
logging.critical("critical")

預設情況下, 級別為warning, 輸出的位置是控制檯, 預設的日誌格式

級別: 日誌生成器的名稱:除錯的訊息

如何修改預設的行為

logging.basicConfig(filename="mylog.txt", # 指定的日誌檔名
filemode="a", # 指定的是檔案開啟的模式 通常為a
level=logging.DEBUG, # 指定級別
format="%(filename)s %(levelname)s %(asctime)s %(message)s", # 指定顯示格式
)

logging.info("info")
logging.debug("debug")

logging.warning("warning")
logging.error("error")
logging.critical("critical")

需求: 有一個登陸註冊
功能
需要記錄使用者操作日誌, 程式設計師需要看到最詳細的資訊, 而boss只需要看到簡單的操作資訊

自定義四種核心角色
完成日誌的輸出
引數指定的是生成器的名稱(因為可以同時存在多個生成器)
mylog = logging.getLogger("mylog")
# 設定生成器的級別 低於該級別的不會生成
mylog.setLevel(10)

# 過濾器 這裡不講! 需要使用面向物件的基礎知識點! (不常用)

# 處理器
handler = logging.FileHandler("youlog.txt", encoding="utf8", )

# 將處理器 繫結給生成器, add函式表明了 一個生成器可以新增多個處理器
mylog.addHandler(handler)

# 格式化處理器
formater = logging.Formatter(fmt="%(filename)s %(levelname)s %(asctime)s %(message)s")
# 將格式化處理器 繫結給 handler
handler.setFormatter(formater)

mylog.info("info")
mylog.debug("debug")
mylog.warning("warning")
mylog.error("error")
mylog.critical("critical")

實現
按照不同的格式輸出到不同的檔案中
mylog = logging.getLogger("mylog")
# 設定生成器的級別 低於該級別的不會生成
mylog.setLevel(10)

# 過濾器 這裡不講! 需要使用面向物件的基礎知識點! (不常用)

# 給程式設計師看的日誌處理器
handler1 = logging.FileHandler("youlog.txt", encoding="utf8", )
# 將處理器 繫結給生成器, add函式表明了 一個生成器可以新增多個處理器
mylog.addHandler(handler1)

# 給老闆看的日誌處理器
handler2 = logging.FileHandler("boss.txt", encoding="utf8", )
# 將處理器 繫結給生成器, add函式表明了 一個生成器可以新增多個處理器
mylog.addHandler(handler2)

# 程式設計師的格式化處理器
formater1 = logging.Formatter(
fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s")
# 將格式化處理器 繫結給 handler
handler1.setFormatter(formater1)

# 老闆的格式化處理器
formater2 = logging.Formatter(fmt="%(levelname)s %(asctime)s %(message)s")
# 將格式化處理器 繫結給 handler
handler2.setFormatter(formater2)

mylog.info("info")
mylog.debug("debug")
mylog.warning("warning")
mylog.error("error")
mylog.critical("critical")

現在需求已經實現了
但是
每次用日誌都要寫這麼一堆程式碼, 最好
能把配置寫死
直接複製已有的配置資訊

logging.config
專門用於配置logging
模組
import logging.config

# 匯入包含配置字典的模組
import loggin_config

# 通過一個字典來配置 logging模組
logging.config.dictConfig(loggin_config.LOGGING_DIC)

通過名稱
來獲取一個生成器
aaloger = logging.getLogger("aa")

# 輸出日誌
aaloger.info("測試資訊!")

# 當要獲取的名稱不存在時 會返回一個預設的生成器
aaloger = logging.getLogger("aasadsadsa")

print(aaloger.name)
# # 輸出日誌
aaloger.warning("測試資訊!")



日誌的繼承:



# 瞭解知識點

# 自己來定義四種核心角色

import logging

mylog = logging.getLogger("father")
mylog.setLevel(10)

handler = logging.FileHandler("father.log")
mylog.addHandler(handler)
handler.setLevel(10)

fmter = logging.Formatter(
fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s")
handler.setFormatter(fmter)

# 在獲取一個生成器 同時指定該生成器的父生成器是father這個生成器
sonlog = logging.getLogger("father.son")

# 需求:子生成器 的輸出位置與父生成器不同 格式相同
sonhandler = logging.FileHandler("son.txt", encoding="utf8")
sonlog.addHandler(sonhandler)

sonfmt = logging.Formatter(
fmt="%(threadName)s %(funcName)s %(module)s %(filename)s %(levelname)s %(asctime)s %(message)s")
sonhandler.setFormatter(sonfmt)

# 繼承後子生成器 可以直接使用父生成器的配置

# mylog.info("這是一條日誌資訊!")
# sonlog.info("這是 son 輸出的日誌資訊!")


# 子生成器 在生成一個日誌時 會自動給父生成器也發一個

# 取消傳遞效果
sonlog.propagate = False

sonlog.info("這是 son 輸出的日誌資訊!")



login_config:


standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' #其中name為getlogger指定的名字

simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'

id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'

logfile_path = "dictconfig.log"

LOGGING_DIC = {
'version': 1,
# 是否禁用已存在的生成器 這個值保持為False
'disable_existing_loggers': False,
# 四個key不能隨便寫 是固定
'formatters': {
# standard 表示格式化處理器的名字 相當於變數名稱 可以隨便寫
'standard': {
# format是固定的不能隨便寫
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {},
'handlers': {
#列印到終端的日誌
#console是處理器的名稱 可以隨便寫
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 列印到螢幕
'formatter': 'simple'
},
#列印到檔案的日誌,收集info及以上的日誌
'default': {
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 儲存到檔案
'formatter': 'standard',
'filename': logfile_path, # 日誌檔案
'maxBytes': 1024*1024*5, # 日誌大小 5M
'backupCount': 5, #日誌檔案最大個數
'encoding': 'utf-8', # 日誌檔案的編碼
},
"ATM":{
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', # 儲存到檔案
'formatter': 'standard',
'filename': "ATMlog.txt", # 日誌檔案
'maxBytes': 1024*1024*5, # 日誌大小 5M
'backupCount': 5, #日誌檔案最大個數
'encoding': 'utf-8', # 日誌檔案的編碼
}
},
'loggers': {
#logging.getLogger(__name__)拿到的logger配置
#aa是生成器的名稱 可以隨便寫
# 如果將key(生成器名稱)設定為空 則意味著將它作為預設的是你生成器
'': {
'handlers': ['default', 'console'], # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)傳遞 日誌的繼承
},
"atm":{
'handlers': ['ATM'], # 這裡把上面定義的兩個handler都加上,即log資料既寫入檔案又列印到螢幕
'level': 'DEBUG',
'propagate': True, # 向上(更高level的logger)傳遞 日誌的繼承
}
},
}
|
|
|
|
|
|
# 需求:寫一個登陸和註冊 要求在使用者執行登陸 或註冊時 記錄日誌資訊

import logging.config
import loggin_config

logging.config.dictConfig(loggin_config.LOGGING_DIC)

atmlogger = logging.getLogger("atm")

def login():
print("執行了登陸")
atmlogger.info("run login")
pass

def register():
print(":執行了註冊!")
atmlogger.info("run register")
pass


while True:
res = input("請選擇功能:")
if res == "login":
login()
elif res == "register":
register()
else:
print("輸入不正確!")


shevle 模組


shelve 模組
用於序列化的模組
json,pickle


import shelve

s = shelve.open("test.she")
s["name"] = "愛跟"


s = shelve.open("test.she")
s["dic"] = {"age":20}

s = shelve.open("test.she")
print(s["dic"])


shelve 模組只有一個函式 就時 open 用於開啟一個檔案,
開啟以後 操作方式與字典完全一致,你可以把它當成字典,而且自帶buff的字典,可以字典給完成序列化
同樣支援 python所有的基礎資料型別
該模組序列化得到的資料 只能被該模組使用 其他語言沒有這個模組 所有無法使用 即無法跨平臺
當你寫的程式是一個單機程式時 可以考慮
後期 只要設計到資料交換 就應該使用json


sys模組




"""
sys模組
是system的縮寫 表示系統

注意
os operation system 指的是 作業系統

而sys值的是python 直譯器

"""

import sys

用於接收作業系統呼叫直譯器時傳入的引數

當你要開發一款基於CMD的程式時
就需要使用這個屬性了
因為一些作業系統沒有介面
只能通過CMD來使用
print(sys.argv)

用於退出直譯器
0
表示正常退出
3.
sys.exit(0)

print(sys.version)

print(sys.platform)

需求
開發一個基於CMD的複製檔案的工具
第一個引數表示被執行的py檔案
第二個作為原始檔路徑
第三個作為目標檔案的路徑

source_path = sys.argv[1]
target_path = sys.argv[2]

print(source_path)
print(target_path)

with open(source_path, "rb") as f:
with open(target_path, "wb") as f1:
while True:
data = f.read(1024)
if not data:
break
f1.write(data)

總結
3.
sys
處理與python直譯器相關的一些操作
常用的兩個
新增環境變數
3.
sys.path
獲取呼叫直譯器引數
3.
sys.argv