1. 程式人生 > >包和日誌模塊的使用

包和日誌模塊的使用

定制 有關 alex 超出 code 相同 保存 setting war

一、包

1.包就是一個保護有__init__.py文件的文件夾,包的本質就是一種模塊,即包是用來導入使用的,包內部包含的文件也都是用來被導入使用的.包是為了更好組織好模塊,就是一個文件夾.

註:在python2中,包下必須有一個__init__.py文件,而python3中即便沒有也不會報錯

首次導入包,會發生三件事

  1.以包下的__init__.py文件為基準來產生一個名稱空間

  2.執行包下的__init__.py文件的代碼,將執行過程中產生的名字都丟到名稱空間中

  3.在當前執行文件中拿到一個名字p1,該p1就是指向__init__.py名稱空間的

總結包的使用需要註意的地方:

  1.但凡是在導入語句中帶點的,點的左邊都必須是一個包

  2.導入包就是在導入包下的__init__.py文件

  3.如果使用絕對導入,絕對導入的起始位置都是以包的頂級目錄為起始點

  4.但是包內部模塊的導入通常應該使用相對導入,用"."代表當前所在的文件(而非執行文件),兩個點代表上一級

  強調:

    1.相對導入只能包內部的模塊之間互相導入使用

    2. ".."上一級不能超出頂級包

二、日誌模塊的使用

logging模塊主要是用來記錄日誌信息的,需要註意的三點有,控制日誌級別,控制日誌格式,控制輸出的目標為文件

等級:

  1.logging.debug("debug日誌") #10

  2.logging.info("info日誌") #20

  3.logging.warning("warning日誌") #30

  4.logging.error("error日誌") #40

  5.logging.critical("critical日誌") #50

技術分享圖片
可在logging.basicConfig()函數中通過具體參數來更改logging模塊默認行為,可用參數有
filename:用指定的文件名創建FiledHandler(後邊會具體講解handler的概念),這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
format:指定handler使用的日誌顯示格式。 
datefmt:指定日期時間格式。 
level:設置rootlogger(後邊會講解具體概念)的日誌級別 
stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件,默認為sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。



#格式
%(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:用戶輸出的消息

 

logging.basicConfig()
技術分享圖片 技術分享圖片
#======介紹
可在logging.basicConfig()函數中可通過具體參數來更改logging模塊默認行為,可用參數有
filename:用指定的文件名創建FiledHandler(後邊會具體講解handler的概念),這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值為“a”還可指定為“w”。
format:指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(後邊會講解具體概念)的日誌級別
stream:用指定的stream創建StreamHandler。可以指定輸出到sys.stderr,sys.stdout或者文件,默認為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用戶輸出的消息




#========使用
import logging
logging.basicConfig(filename=‘access.log‘,
                    format=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s‘,
                    datefmt=‘%Y-%m-%d %H:%M:%S %p‘,
                    level=10)

logging.debug(‘調試debug‘)
logging.info(‘消息info‘)
logging.warning(‘警告warn‘)
logging.error(‘錯誤error‘)
logging.critical(‘嚴重critical‘)





#========結果
access.log內容:
2017-07-28 20:32:17 PM - root - DEBUG -test:  調試debug
2017-07-28 20:32:17 PM - root - INFO -test:  消息info
2017-07-28 20:32:17 PM - root - WARNING -test:  警告warn
2017-07-28 20:32:17 PM - root - ERROR -test:  錯誤error
2017-07-28 20:32:17 PM - root - CRITICAL -test:  嚴重critical

part2: 可以為logging模塊指定模塊級的配置,即所有logger的配置
技術分享圖片

logging模塊中的Formatter,Handler,Logger,Filter對象

技術分享圖片
#logger:產生日誌的對象

#Filter:過濾日誌的對象

#Handler:接收日誌然後控制打印到不同的地方,FileHandler用來打印到文件中,StreamHandler用來打印到終端

#Formatter對象:可以定制不同的日誌格式對象,然後綁定給不同的Handler對象使用,以此來控制不同的Handler的日誌格式
技術分享圖片

logger是第一級過濾,然後才能到handler,我們可以給logger和handler同時設置level

技術分享圖片
import logging

# 1. logger對象: 負責生產各種級別的日誌
logger1 = logging.getLogger(‘用戶交易‘)  # 日誌名用來標識日誌的與什麽業務有關

# 2. filter對象: 過濾日誌

# 3. handler對象: 控制日誌輸出目標位置
fh1 = logging.FileHandler(‘a1.log‘,encoding=‘utf-8‘)
fh2 = logging.FileHandler(‘a2.log‘,encoding=‘utf-8‘)
ch = logging.StreamHandler()

# 4. formmater對象
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 - %(levelname)s :  %(message)s‘,
    datefmt=‘%Y-%m-%d %H:%M:%S %p‘
)

# 5. 綁定logger對象與handler對象
logger1.addHandler(fh1)
logger1.addHandler(fh2)
logger1.addHandler(ch)

# 6. 綁定handler對象與formatter對象

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

# 7. 設置日誌級別,有logger對象與handler對象兩層關卡,必須都放行最終日誌才會放行,通常二者級別相同
logger1.setLevel(10)
fh1.setLevel(10)
fh2.setLevel(10)
ch.setLevel(10)

# 8. 使用logger對象產生日誌
logger1.info(‘alex給egon轉賬1個億‘)
技術分享圖片

應用:

settings.py

技術分享圖片
standard_format = ‘%(asctime)s - task:%(name)s - %(filename)s:%(lineno)d -‘                   ‘ %(levelname)s : [%(message)s]‘

simple_format = ‘%(filename)s:%(lineno)d - %(levelname)s : [%(message)s]‘

fh1_path = r‘a1.log‘
fh2_path = r‘a2.log‘

# log配置字典
LOGGING_DIC = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘formatters‘: {
        ‘standard‘: {
            ‘format‘: standard_format
        },
        ‘simple‘: {
            ‘format‘: simple_format
        },
    },
    ‘filters‘: {},
    ‘handlers‘: {
        #打印到終端的日誌
        ‘ch‘: {
            ‘level‘: ‘DEBUG‘,
            ‘class‘: ‘logging.StreamHandler‘,  # 打印到終端
            ‘formatter‘: ‘simple‘
        },
        #打印到a1.log文件的日誌
        ‘fh1‘: {
            ‘level‘: ‘DEBUG‘,
            ‘class‘: ‘logging.FileHandler‘,  # 保存到文件
            ‘formatter‘: ‘standard‘,
            ‘filename‘: fh1_path,  # 日誌文件的路徑
            ‘encoding‘: ‘utf-8‘,  # 日誌文件的編碼,再也不用擔心中文log亂碼了
        },
        # 打印到a2.log文件的日誌
        ‘fh2‘: {
            ‘level‘: ‘DEBUG‘,
            ‘class‘: ‘logging.FileHandler‘,  # 保存到文件
            ‘formatter‘: ‘simple‘,
            ‘filename‘: fh2_path,  # 日誌文件的路徑
            ‘encoding‘: ‘utf-8‘,  # 日誌文件的編碼,再也不用擔心中文log亂碼了
        },

    },
    ‘loggers‘: {
        ‘‘: {
            ‘handlers‘: [‘fh1‘, ‘fh2‘, ‘ch‘],
            ‘level‘: ‘DEBUG‘,
        },
    },
}
技術分享圖片

run.py

技術分享圖片
import logging.config
import settings

logging.config.dictConfig(settings.LOGGING_DIC)

logger1=logging.getLogger(‘用戶交易‘)
#logger1-> fh1,fh2,ch
logger1.info(‘alex給egon轉賬1個億‘)

logger2=logging.getLogger(‘用戶權限‘)
#logger2-> fh1,fh2,ch
logger2.error(‘egon沒有執行權限‘)

包和日誌模塊的使用