python log日誌 多執行緒安全

2021-10-01 02:53:36 字數 4780 閱讀 1715

python中的日誌檔案為logger,常用的有兩個-rotatingfilehandler;timedrotatingfilehandler。檔案沒滿足分割條件前,儲存在『info.log』(自己命名的檔案)中,如果滿足分割條件,會生成『info.log.1』。下一次滿足分割條件後,將『info.log』儲存成『info.log.1』,而『info.log.1』順延成『info.log.2』;滿足最多儲存的個數後,會將其刪掉。

rotatingfilehandler,是按大小劃分日誌檔案,使用方法如下。rotatingfilehandler是按檔案大小自動分割儲存,下文中設定的是1m儲存乙個檔案,最多儲存30個。此種方式支援多執行緒安全,支援軟體的開關機(timedrotatingfilehandler不支援,一旦關機,會重新計時)

import logging

from logging import handlers

def log_init():

log = logging.getlogger('error.log') # log儲存位置

format_str = log.formatter('%(asctime)s - \ # log時間戳格式

%(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')

log.setlevel(logging.debug) # log日誌等級(往下的內容不儲存)

sh = logging.streamhandler() # 往螢幕上輸出

# filename:log檔名;maxbytes:超過最大尺寸,log會另存乙個檔案;

# backupcount:最多儲存多少個日誌;encoding:儲存編碼格式

th = handlers.rotatingfilehandler(filename='error.log', maxbytes=1024*1024, \

backupcount=30, encoding='uft-8')

th.setformatter(format_str) # 設定檔案裡寫入的格式

log.addhandler(sh)

log.addhandler(th)

return log

if __name__ == '__main__':

log = log_init()

log.debug('debug_msg')

log.info('info_msg')

log.warning('warning_msg')

log.error('error_msg')

log.critical('critical_msg')

timedrotatingfilehandler是按日期劃分日誌檔案,使用方法如下。timedrotatingfilehandler是按檔案大小自動分割儲存,下文中設定的是每天儲存乙個log檔案,最多儲存30個。此種方式支援多執行緒不安全,不支援軟體的關機(軟體關機後,會重新計時,如果經常關機的專案,會只記錄在乙個檔案中)。

import logging

from logging import handlers

def log_init():

log = logging.getlogger('error.log') # log儲存位置

format_str = log.formatter('%(asctime)s - \ # log時間戳格式

%(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')

log.setlevel(logging.debug) # log日誌等級(往下的內容不儲存)

sh = logging.streamhandler() # 往螢幕上輸出

# filename:log檔名;when:多久另存乙個檔案(s/m/h/d/w/midnight);

# backupcount:最多儲存多少個日誌;encoding:儲存編碼格式

th = handlers.timedrotatingfilehandler(filename='error.log', when='d', \

backupcount=30, encoding='uft-8')

th.setformatter(format_str) # 設定檔案裡寫入的格式

log.addhandler(sh)

log.addhandler(th)

return log

if __name__ == '__main__':

log = log_init()

log.debug('debug_msg')

log.info('info_msg')

log.warning('warning_msg')

log.error('error_msg')

log.critical('critical_msg')

如果想多執行緒使用timedrotatingfilehandler,就需要自己寫乙個執行緒,然後每乙個log往訊息佇列中丟,用執行緒處理這個訊息佇列。queue是執行緒安全的,所以作為訊息佇列使用沒有影響。

import time

import _thread

import logging

from logging import handlers

from queue import queue

logs_queue = queue()

class logmsg(object):

def __init__(self, type, msg):

self._type = type

self._msg = msg

def log_init():

log = logging.getlogger('error.log') # log儲存位置

format_str = log.formatter('%(asctime)s - \ # log時間戳格式

%(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')

log.setlevel(logging.debug) # log日誌等級(往下的內容不儲存)

sh = logging.streamhandler() # 往螢幕上輸出

# filename:log檔名;when:多久另存乙個檔案(s/m/h/d/w/midnight);

# backupcount:最多儲存多少個日誌;encoding:儲存編碼格式

th = handlers.timedrotatingfilehandler(filename='error.log', when='d', \

backupcount=30, encoding='uft-8')

th.setformatter(format_str) # 設定檔案裡寫入的格式

log.addhandler(sh)

log.addhandler(th)

return log

def cop_log_queue(logger):

while true:

if logs_queue.empty():

time.sleep(1)

log_msg = logs_queue.get()

if log_msg._type == 'debug':

logger.debug(log_msg._msg)

elif log_msg._type == 'info':

logger.info(log_msg._msg)

elif log_msg._type == 'warning':

logger.warning(log_msg._msg)

elif log_msg._type == 'error':

logger.error(log_msg._msg)

elif log_msg._type == 'critical':

logger.critical(log_msg._msg)

def error_thread1():

while true:

logs_queue.put(logmsg('debug','debug_msg'))

time.sleep(1)

def error_thread2():

while true:

logs_queue.put(logmsg('info','info_msg'))

time.sleep(1)

if __name__ == '__main__':

logger = log_init()

_thread.start_new_thread(cope_log_queue, (logger, ))

_thread.start_new_thread(error_thread1, ())

_thread.start_new_thread(error_thread2, ())

Python log 日誌的使用

import logging import logging.handlers import os import time class logs object def init self self.logger logging.getlogger 設定輸出的等級 levels 建立檔案目錄 logs ...

安卓 多執行緒

方法1 建立單獨的執行緒 new thread new runnable start 方法2 利用執行緒池 private executorservice executorservice executors.newfixedthreadpool 4 上面是建立乙個固定大小的執行緒池,這裡面的執行緒不...

安卓 多執行緒

第一種實現子執行緒的方法 繼承thread類 private class mythread extends thread new mythread start 第二種實現子執行緒的方式 實現runnable 任務 介面 private class myrunnable implements runn...