日志模塊

一昼扛,日志模塊介紹

1瞭恰,默認日志級別為30(輸出到屏幕)

import logging
logging.debug('debug')          #10
logging.info('info')            #20
logging.warning('warm')         #30
logging.error('error')          #40
logging.critical('critical')    #50



# WARNING:root:warm
# ERROR:root:error
# CRITICAL:root:critical

執(zhí)行可發(fā)現(xiàn)默認的日志級別是warming


圖1

2, 日志指定輸出到文件

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('warm')         
logging.error('error')          
logging.critical('critical')




執(zhí)行,在當前文件夾的access.log內(nèi)容如下瓢喉,如圖1
2021-08-27 12:55:55 PM - root - DEBUG -日志_logging:  debug
2021-08-27 12:55:55 PM - root - INFO -日志_logging:  info
2021-08-27 12:55:55 PM - root - WARNING -日志_logging:  warm
2021-08-27 12:55:55 PM - root - ERROR -日志_logging:  error
2021-08-27 12:55:55 PM - root - CRITICAL -日志_logging:  critical

二宁赤,日志模塊的四種角色

import logging

#1,logger產(chǎn)生日志
logger1=logging.getLogger('訪問日志')

#2栓票,F(xiàn)ilter(過濾日志):幾乎不用决左,略
#3,Handle:接收logger傳過來的日志走贪,進行格式化佛猛,可以打印到終端也可以打印到文件

sh=logging.StreamHandler()   #打印到終端
sh1=logging.FileHandler('s1.log',encoding='utf-8')
sh2=logging.FileHandler('s2.log',encoding='utf-8')




#4,F(xiàn)ormatter:日志格式()定義3種不同的日志格式
formatter=logging.Formatter(
    fmt='%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S %p'
)

formatter1=logging.Formatter(
    fmt='%(name)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坠狡,為handle綁定日志格式
sh.setFormatter(formatter)
sh1.setFormatter(formatter1)
sh2.setFormatter(formatter2)



#6挚躯,為logger綁定handle
logger1.addHandler(sh)
logger1.addHandler(sh1)
logger1.addHandler(sh2)



#7,設置日志級別
logger1.setLevel(0)
sh.setLevel(20)
sh1.setLevel(30)
sh2.setLevel(40)



#8擦秽,測試
logger1.debug('這是測試debug')
logger1.info('運行正陈肜螅~')
logger1.warning('可能有bug哦')
logger1.error('出bug了d銮凇!K踅痢T桨堋!')
logger1.critical('完蛋了E鸢辍>糠伞!L美稹亿傅!')






執(zhí)行結(jié)果:
終端屏幕上會輸出:
2021-08-28 20:33:57 PM - 訪問日志 - WARNING -日志_logging:  可能有bug哦
2021-08-28 20:33:57 PM - 訪問日志 - ERROR -日志_logging:  出bug了!N疗堋?妗!半哟!
2021-08-28 20:33:57 PM - 訪問日志 - CRITICAL -日志_logging:  完蛋了3曷恕!T⒄恰6⒋!




多出個s1文件內(nèi)容:
訪問日志 - -日志_logging:  可能有bug哦
訪問日志 - -日志_logging:  出bug了=淞肌L迥蟆!E雌椤几缭!




多出個s2文件內(nèi)容:
2021-08-28 20:33:57 PM - ERROR - 出bug了!D绰W嗨尽!樟插!
2021-08-28 20:33:57 PM - CRITICAL - 完蛋了T涎蟆!;拼浮L掠А!





注意??

logger1.setLevel(0)
sh.setLevel(20)
sh1.setLevel(30)
sh2.setLevel(40)

第7步的日志級別中鸵熟,logger1的日志級別必須比sh副编,sh1,sh2小流强,
如果logger1級別為30痹届,要設置sh的級別為10呻待,是輸出不了10級別(debug)和20級別(info)的日志的




總結(jié):
1,輸出日志logger需要綁定handle綁定終端輸出队腐,或者是文件輸出(一個輸出日志可以綁定給多個handle處理成多個文件)

2蚕捉,每個handle需要一個日志格式,即handle要綁定formatter(不同的handle可以綁定不同的formatter)

3柴淘,formatter需要單獨設置

4迫淹,日志級別需要設置

三,日志配置

"""
logging配置
"""

import os
import logging.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'




# 定義日志輸出格式 結(jié)束

logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目錄

logfile_name = 'all2.log'  # log文件名

# 如果不存在定義的日志目錄就創(chuàng)建一個
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)

# log文件的全路徑
logfile_path = os.path.join(logfile_dir, logfile_name)




# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {                 #standard名字可以隨便起为严,已在上方定義
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到終端的日志
        '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',  # 日志文件的編碼敛熬,再也不用擔心中文log亂碼了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 這里把上面定義的兩個handler都加上,即log數(shù)據(jù)既寫入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)傳遞
        },
    },
}


def load_my_logging_cfg():
    logging.config.dictConfig(LOGGING_DIC)  # 導入上面定義的logging配置
    logger = logging.getLogger(__name__)  # 生成一個log實例
    logger.info('It works!')  # 記錄該文件的運行狀態(tài)

if __name__ == '__main__':
    load_my_logging_cfg()




四第股,日志應用(升級ATM)

start.py

import os,sys
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

from core import src
if __name__ == '__main__':
    src.run()

setting.py

import os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 以上路徑為/Users/shiheng/PycharmProjects/py-study/ATM

LOG_PATH=os.path.join(BASE_DIR,'log','access.log')
DB_PATH=os.path.join(BASE_DIR,'db','user')



"""
logging配置
"""

import os
import logging.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'




# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {                 #standard名字可以隨便起应民,已在上方定義
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到終端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': LOG_PATH,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的編碼,再也不用擔心中文log亂碼了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        '': {
            'handlers': ['default', 'console'],  # 這里把上面定義的兩個handler都加上炸茧,即log數(shù)據(jù)既寫入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': False,  # 向上(更高level的logger)傳遞,如果是true瑞妇,會打印多個父級日志
        },
    },
}

src.py

from lib import common
def shop():
    print('購物稿静。梭冠。。')

def check_balance():
    print('查看余額改备。控漠。。')

def transfer_accounts():
    print('轉(zhuǎn)賬悬钳。盐捷。。')
    log_msg='轉(zhuǎn)賬了一個億'
    logger=common.logger_handle('轉(zhuǎn)賬')
    logger.debug(log_msg)



def  run():
    msg='''
    1 購物
    2 查看余額
    3 轉(zhuǎn)賬
    '''

    while True:
        print(msg)
        choice=input('>>:').strip()
        if not choice:continue
        if choice == '1':
            shop()
        elif choice == '2':
            check_balance()
        elif choice == '3':
            transfer_accounts()

common.py

from conf import settings
import logging.config


def logger_handle(log_name):
    logging.config.dictConfig(settings.LOGGING_DIC)  # 導入上面定義的logging配置
    logger = logging.getLogger(log_name)  # 生成一個log實例
    return logger

accesss.log

[2021-08-28 21:38:40,574][MainThread:4298358080][task_id:轉(zhuǎn)賬][src.py:12][DEBUG][轉(zhuǎn)賬了一個億]



執(zhí)行start.py

/usr/local/bin/python3 /Users/sg/PycharmProjects/py-study/ATM/bin/start.py

    1 購物
    2 查看余額
    3 轉(zhuǎn)賬
    
>>:3
轉(zhuǎn)賬默勾。碉渡。。

    1 購物
    2 查看余額
    3 轉(zhuǎn)賬
    
>>:[DEBUG][2021-08-28 21:38:54,837][src.py:12]轉(zhuǎn)賬了一個億



# 屏幕上會出現(xiàn)日志
# access.log也會有相同的日志
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末母剥,一起剝皮案震驚了整個濱河市滞诺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌环疼,老刑警劉巖习霹,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炫隶,居然都是意外死亡淋叶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門伪阶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煞檩,“玉大人处嫌,你說我怎么就攤上這事≌迮龋” “怎么了锰霜?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桐早。 經(jīng)常有香客問我癣缅,道長,這世上最難降的妖魔是什么哄酝? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任友存,我火速辦了婚禮,結(jié)果婚禮上陶衅,老公的妹妹穿的比我還像新娘屡立。我一直安慰自己,他們只是感情好搀军,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布膨俐。 她就那樣靜靜地躺著,像睡著了一般罩句。 火紅的嫁衣襯著肌膚如雪焚刺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天门烂,我揣著相機與錄音乳愉,去河邊找鬼。 笑死屯远,一個胖子當著我的面吹牛蔓姚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慨丐,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼坡脐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了房揭?” 一聲冷哼從身側(cè)響起备闲,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崩溪,沒想到半個月后浅役,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伶唯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年觉既,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞪讼,死狀恐怖钧椰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情符欠,我是刑警寧澤嫡霞,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站希柿,受9級特大地震影響诊沪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜曾撤,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一端姚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挤悉,春花似錦渐裸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诀诊,卻和暖如春洞渤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背畏梆。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工您宪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奈懒,地道東北人奠涌。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像磷杏,于是被迫代替她去往敵國和親溜畅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容