更新時間:2020年08月03日14時12分 來源:傳智播客 瀏覽次數(shù):
· 日志對于Web應(yīng)用的作用就像飛機(jī)的黑匣子,用于記錄Web應(yīng)用的運行狀態(tài),方便開發(fā)者快速定位錯誤并進(jìn)行修復(fù)。
· python中內(nèi)置的 logging模塊功能全面,web應(yīng)用集成日志功能基本都是基于該模塊。
1. 基本使用
· logging模塊提供了默認(rèn)日志,只需要通過basicConfig()函數(shù)就可以快速配置
· logging模塊提供了多個日志級別: 致命錯誤CRITICAL /錯誤ERROR /警告WARNING /信息INFO /調(diào)試DEBUG,方便開發(fā)者提供需求進(jìn)行日志過濾。
代碼示例
import logging
def basic_log():
"""使用默認(rèn)日志
缺點: 文件輸出/控制臺輸出 二選一"""
format = "%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s"
# 設(shè)置默認(rèn)日志
logging.basicConfig(level="DEBUG", format=format, filename='basic.log')
# 使用默認(rèn)日志
logging.debug('this is a debug message')
logging.info('this is a info message')
logging.warning('this is a warn message')
logging.error('this is a error message')
if __name__ == '__main__':
basic_log()
· 注意點:
默認(rèn)日志的缺點是文件輸出/控制臺輸出只能二選一
2. 自定義日志器
· 自定義日志器可以添加多個輸出處理器, 將日志同時輸出到 控制臺 & 文件 & 郵件 等環(huán)境中
· 自定義日志器的基本使用步驟:
(1)創(chuàng)建/獲取自定義日志器
(2)創(chuàng)建輸出處理器
(3)日志器添加處理器
(4)使用自定義日志
import logging
from logging.handlers import RotatingFileHandler
def custem_log():
"""使用自定義日志 可以同時在控制臺和文件輸出"""
# 創(chuàng)建/獲取自定義的日志器
mylogger = logging.getLogger('mylogger')
# 設(shè)置全局級別
mylogger.setLevel('DEBUG')
# 創(chuàng)建控制臺處理器
console_handler = logging.StreamHandler()
# 給處理器設(shè)置輸出格式
console_formatter = logging.Formatter(fmt='%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s')
console_handler.setFormatter(console_formatter)
# 日志器添加處理器
mylogger.addHandler(console_handler)
# 創(chuàng)建文件處理器
file_handler = RotatingFileHandler(filename='mylogger.log', maxBytes=100 * 1024 * 1024, backupCount=10) # 轉(zhuǎn)存文件處理器 當(dāng)達(dá)到限定的文件大小時, 可以將日志轉(zhuǎn)存到其他文件中
# 給處理器設(shè)置輸出格式
file_formatter = logging.Formatter(fmt='[%(asctime)s] %(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s')
file_handler.setFormatter(file_formatter)
# 單獨設(shè)置文件處理器的日志級別
file_handler.setLevel('WARN')
# 日志器添加處理器
mylogger.addHandler(file_handler)
# 使用自定義日志
mylogger.debug('this is a debug message')
mylogger.info('this is a info message')
mylogger.warning('this is a warn message')
mylogger.error('this is a error message')
if __name__ == '__main__':
custem_log()
3. 郵件發(fā)送日志
· 項目上線后,開發(fā)者往往不會持續(xù)關(guān)注所有的日志信息,為了更快的發(fā)現(xiàn)和解決錯誤,比較常規(guī)的一種方式是將一般或者高級別的錯誤寫入電子郵件并發(fā)送給開發(fā)者。
· logging模塊可以配置一個SMTPHandler郵件輸出處理器來實現(xiàn)該需求
代碼示例
import logging
from logging.handlers import SMTPHandler
def mail_log():
"""使用郵件輸出日志, 將日志以郵件形式發(fā)送"""
# 創(chuàng)建/獲取自定義的日志器
mylogger = logging.getLogger('mylogger')
# 設(shè)置全局級別
mylogger.setLevel('DEBUG')
# 創(chuàng)建郵件處理器
mail_handler = SMTPHandler(
mailhost=('smtp.163.com', 25), # SMTP稱為簡單郵件傳輸協(xié)議, 163提供了支持該協(xié)議的郵件服務(wù)器, 端口為25
fromaddr='czbk_zzz@163.com', # 發(fā)件人地址
toaddrs=['xxx@itcast.cn', 'xx@qq.com'], # 收件人地址
subject='Log Error',
credentials=('czbk_zzz@163.com', 'HZLLPADWYUWUVDIQ') # 發(fā)件人的郵件地址 和 發(fā)件人的授權(quán)密碼
)
# 給處理器設(shè)置輸出格式
mail_formatter = logging.Formatter(fmt='%(name)s %(levelname)s %(pathname)s %(lineno)d %(message)s')
mail_handler.setFormatter(mail_formatter)
# 設(shè)置郵件處理器的日志級別
mail_handler.setLevel('ERROR')
# 日志器添加處理器
mylogger.addHandler(mail_handler)
# 使用自定義日志
mylogger.debug('this is a debug message')
mylogger.info('this is a info message')
mylogger.warning('this is a warn message')
mylogger.error('this is a error message')
if __name__ == '__main__':
mail_log()
發(fā)送郵件是耗時操作,可以考慮使用celery執(zhí)行異步任務(wù),提高響應(yīng)速度。
猜你喜歡