日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


 

大綱

今天我們就來一起挖一挖Python/ target=_blank class=infotextkey>Python里面的各種日志的用法,廢話不多說,日志包我為了講清楚,涉及到的內容大綱如下:


 

基本打印


 

如上圖看到的那么簡單,在python中打印日志只要import logging包即可。直接執行效果如下圖:


 

日志配置

如果沒有日志配置,日志只能打印到stdout,那就會很糟糕,因此我們需要有一些配置可以輸出到文件

import logging # add filemode="w" to overwrite logging.basicConfig(filename="sample.log", level=logging.INFO) logging.debug("This is a debug message") # This one won't log logging.info("Informational message") logging.error("An error has hAppened!")

增加basicconfig后日志就可以打印到指定文件,但是日志我們還需要設置日志格式

import logging logger = logging.getLogger('stream_logger') logger.setLevel(logging.INFO) console = logging.StreamHandler() formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') console.setFormatter(formatter) logger.addHandler(console) logger.info("This is an informational message")

在python中還可以從配置文件讀取日志規則

import logging import logging.config logging.config.fileConfig('logging.conf') logger = logging.getLogger("exampleApp") logger.info("Program started") logger.info("Done!")

logging.conf配置如下:

[loggers] keys=root,exampleApp [handlers] keys=fileHandler, consoleHandler [formatters] keys=myFormatter [logger_root] level=CRITICAL handlers=consoleHandler [logger_exampleApp] level=INFO handlers=fileHandler qualname=exampleApp [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=myFormatter args=(sys.stdout,) [handler_fileHandler] class=FileHandler formatter=myFormatter args=("config.log",) [formatter_myFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=日志過濾

通過Formatter就可以搞定日志格式問題,如果生產環境日志太多,又想有一些日志過濾。

import logging import sys class MyFilter(logging.Filter): def filter(self, record): if record.funcName == 'a': return False return True logger = logging.getLogger('filter_test') logger.addFilter(MyFilter()) def a(): """ Ignore this function's log messages """ logger.debug('Message from function a') def b(): logger.debug('Message from B') if __name__ == '__main__': logging.basicConfig(stream=sys.stderr, level=logging.DEBUG) a() b()

這樣你的日志就可以實現過濾效果。

日志切割

可是生產環境真正運行的服務,又不僅僅是運行一天,日志一直打印到同一個文件非常不方便debug和定位,有時候一天幾個G的文件,如果運行30天去查日志時會非常耗時,我們需要一個日志切割的邏輯來保障日志可以按照時間動態切換文件。

 

  • 按照時間切割
import logging import time from logging.handlers import TimedRotatingFileHandler def create_timed_rotating_log(path): """""" logger = logging.getLogger("Rotating Log") logger.setLevel(logging.INFO) handler = TimedRotatingFileHandler(path, when="s", interval=5, backupCount=5) logger.addHandler(handler) for i in range(6): logger.info("This is a test!") time.sleep(75) if __name__ == "__main__": log_file = "timed_rotation.log" create_timed_rotating_log(log_file)
  • 按照大小切割,并設置保留數
import logging import time from logging.handlers import RotatingFileHandler def create_rotating_log(path): """ Creates a rotating log """ logger = logging.getLogger("Rotating Log") logger.setLevel(logging.INFO) # add a rotating handler handler = RotatingFileHandler(path, maxBytes=20, backupCount=5) logger.addHandler(handler) for i in range(10): logger.info("This is test log line %s" % i) time.sleep(1.5) if __name__ == "__main__": log_file = "rotated.log" create_rotating_log(log_file)多進程日志

 

在python中因為受GIL的影響,涉及到并發性能問題時經常使用多進程方式來解決,此時多進程日志打印會受到文件鎖的影響,為了避免日志打印錯亂,日志異常,我們針對這種場景需要定制化處理下日志:

import logging from logging.handlers import RotatingFileHandler, QueueHandler from multiprocessing import Process class MultiProcessQueueLoggingListner(Process): def __init__(self, name, queue): super().__init__() self.name = name self.queue = queue self.logger = logging.getLogger(name) self.file_handler = RotatingFileHandler(name, maxBytes=536870912, backupCount=2) self.formatter = logging.Formatter('%(asctime)s %(processName)-10s %(name)s %(levelname)-8s %(message)s') self.file_handler.setFormatter(self.formatter) self.logger.addHandler(self.file_handler) def run(self): while True: try: record = self.queue.get() if record is None: break self.logger.handle(record) except Exception: import sys, traceback print('Whoops! Problem:', file=sys.stderr) traceback.print_exc(file=sys.stderr) class MulitProcessQueueLogger(object): def __init__(self, name, queue): self.name = name self.queue = queue self.queue_handler = QueueHandler(queue) self.logger = logging.getLogger(name) self.logger.addHandler(self.queue_handler) self.logger.setLevel(logging.DEBUG)

測試代碼如下:

import multi_process_logging import multiprocessing from time import sleep def worker(po): name = multiprocessing.current_process().name po = multi_process_logging.MulitProcessQueueLogger('test.log', q) print("In worker") for i in range(10): po.logger.info(f"Logging from {name} line {i}") po.queue.put(None) def main(): q = multiprocessing.Queue() lp = multi_process_logging.MultiProcessQueueLoggingListner('test.log', q) lp.start() p = multiprocessing.Process(target=worker, args=(q,)) p.start() p.join() lp.join() if __name__ == '__main__': main()總結

至此,大部分python打印日志的場景使用方式都講解到了,希望對讀者有所幫助。

分享到:
標簽:python
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定