python日誌列印和寫入併發簡易版本實現

2022-08-28 13:12:13 字數 3210 閱讀 8268

大家一般都用logging日誌列印,但logging是執行緒安全的,多程序也有很多介紹,引入一些檔案鎖,對logging做好配置,能過支援。

但通過測試,發現多程序時還是容易出現重複寫入檔案或者列印正常漏寫入檔案的問題。

我的日誌需求比較簡單,能夠區分檔案,正確的寫入日誌檔案。

引入檔案鎖;日誌寫入函式封裝到乙個操作_logger類中; 日誌名稱和寫入級別封裝到乙個業務類logger中。

本範例基於python3實現。本範例20個程序併發,分別寫入3個檔案,每s每個檔案寫入超過100行資料,日誌檔案中沒有資料冗餘,也沒有資料遺漏。

date:2017/3/5 0005下午 10:50

"""# import logging

import os

import time

# 利用第三方系統鎖實現檔案鎖定和解鎖

class _logger:

file_path = ''

#初始化日誌路徑

@staticmethod

def init():

if not _logger.file_path:

_logger.file_path = '%s/log' % os.path.abspath(os.path.dirname(__file__))

return true

@staticmethod

def _write(messge, file_name):

if not messge:

return true

messge = messge.replace('\t', ',')

file = '{}/{}'.format(_logger.file_path, file_name)

while true:

try:

f = open(file, 'a+')

lock(f, lock_ex)

break

except:

time.sleep(0.01)

continue

# 確保緩衝區內容寫入到檔案

while true:

try:

f.write(messge + '\n')

f.flush()

break

except:

time.sleep(0.01)

continue

while true:

try:

unlock(f)

f.close()

return true

except:

time.sleep(0.01)

continue

@staticmethod

def write(message, file_name, only_print=false):

if not _logger.init(): return

print(message)

if not only_print:

_logger._write(message, file_name)

class logger:

def __init__(self, logger_name, file_name=''):

self.logger_name = logger_name

self.file_name = file_name

# 根據訊息級別,自定義格式,生成訊息

def _build_message(self, message, level):

try:

return '[%s]\t[%5s]\t[%8s]\t%s' \

% (time.strftime('%y-%m-%d %h:%m:%s'), level, self.logger_name, message)

except exception as e:

print('解析日誌訊息異常:{}'.format(e))

return ''

def warning(self, message):

_logger.write(self._build_message(message, 'warn'), self.file_name)

def warn(self, message):

_logger.write(self._build_message(message, 'warn'), self.file_name)

def error(self, message):

_logger.write(self._build_message(message, 'error'), self.file_name)

def info(self, message):

_logger.write(self._build_message(message, 'info'), self.file_name, true)

def debug(self, message):

_logger.write(self._build_message(message, 'debug'), self.file_name)

# 迴圈列印日誌測試函式

def _print_test(count):

logger = logger(logger_name='test{}'.format(count), file_name='test{}'.format(count % 3))

key = 0

while true:

key += 1

# print('{}-{}'.format(logger, key))

logger.debug('%d' % key)

logger.error('%d' % key)

if __name__ == '__main__':

from multiprocessing import pool, freeze_support

freeze_support()

# 程序池進行測試

python列印日誌到控制台並將日誌寫入檔案

import sys import logging logger logging.getlogger log logger.setlevel logging.debug 呼叫模組時,如果錯誤引用,比如多次呼叫,每次會新增handler,造成重複日誌,這邊每次都移除掉所有的handler,後面在重新新...

python之寫入日誌

對 程式發生錯誤的時候,通過記錄日誌的方式,來排查問題,是乙個很好的習慣 對於日誌的設定,需要以下幾點 1 存放路徑 2 日誌檔名 3 內容格式 format 2020 10 14.21.34.24 logbasic.py 錯誤的行號 級別 具體內容 執行時間 檔名 報錯行號 等級 msg 具體資訊...

Python日誌列印

簡單示例 import sys import ctypes import logging import logging.handlers reload sys sys.setdefaultencoding utf 8 log file test log logging.basicconfig fil...