Python中利用logger進行日誌格式輸出

2021-10-24 11:10:03 字數 4645 閱讀 5283

本文主要是針對python程式設計師小白在寫專案**時的焦慮:什麼時候列印日誌?日誌列印格式是什麼樣的?列印日誌怎麼存?等等這些問題都是剛開始需要考慮的。

其中logs資料夾是專門儲存日誌檔案的,對日誌檔案的輸出要求是:

1. logs資料夾下包括三種型別:log.log、error.log、歷史日誌資料夾。其中log.log是當前程式執行輸出的所有日誌(包括warnings),error.log是當前程式執行輸出的所有錯誤日誌。結構如下:

2. 要求每次重新執行程式都會生成新的log.log和error.log,之前的相應日誌檔案按照日期儲存到對應日期資料夾下,要求一天儲存乙個日誌檔案(除非日誌檔案超過最大限制)

下面附上部分**做解釋:

首先是logger模組:

class log(metaclass=singletontype):

def __init__(self):

# 檔案的命名

self.info_log_name = os.path.join(log_path, 'log') + '.log'

self.error_log_name = os.path.join(log_path, 'error') + '.log'

self.logger = logging.getlogger()

# 設定日誌級別,其中log_level提前在config資料夾下配置好

if log_level == "debug":

self.logger.setlevel(logging.debug)

elif log_level == "critical":

self.logger.setlevel(logging.critical)

elif log_level == "warning":

self.logger.setlevel(logging.warning)

else:

self.logger.setlevel(logging.info)

# 日誌輸出格式(這裡主要列印的是:時間-執行緒id-程序id-級別名稱-日誌訊息)

self.formatter = logging.formatter('[%(asctime)s] - thread_id:%(thread)d - process_id:%(process)d - %(levelname)s: %(message)s')

def __console(self, level, log_name, message, handler_flag=true):

# 建立乙個filehandler,用於寫到本地

os.makedirs(log_path, exist_ok=true)

fh = logging.filehandler(log_name, 'a') # 追加模式

fh.setlevel(logging.debug)

fh.setformatter(self.formatter)

self.logger.addhandler(fh)

# 建立乙個streamhandler,用於輸出到控制台

ch = logging.streamhandler()

ch.setlevel(logging.debug)

ch.setformatter(self.formatter)

self.logger.addhandler(ch)

# 根據日誌等級來列印日誌內容

if level == 'info':

self.logger.info(message)

elif level == 'debug':

self.logger.debug(message)

elif level == 'warning':

self.logger.warning(message)

elif level == 'error':

if not handler_flag:

self.logger.removehandler(ch)

ch.close()

self.logger.error(message)

# 這兩行**是為了避免日誌輸出重複問題

self.logger.removehandler(ch)

self.logger.removehandler(fh)

# 關閉開啟的檔案

fh.close()

ch.close()

def debug(self, message):

self.__console('debug', self.info_log_name, message, true)

def info(self, message):

self.__console('info', self.info_log_name, message, true)

def warning(self, message):

self.__console('warning', self.info_log_name, message, true)

def error(self, message):

self.__console('error', self.info_log_name, message, true)

self.__console('error', self.error_log_name, message, false)

然後是logger模組下的儲存格式設定模組log_subarea:

def merge_logs(file_path, new_file):  # 將歷史日誌檔案合併到乙個檔案裡

k = open(new_file, 'a+')

f = open(file_path)

k.write(f.read()+"\n") # 換行拼接到後面

k.close()

def log_to_folder(from_path, file_name, file_type=".log"):

from_path = path(from_path)

folder = path(from_path)

cnt = 1

src_file = from_path / (file_name + file_type) # 先檢視是否有已存在日誌檔案

# src_file = path(src_file)

if src_file.exists():

file_date = datetime.datetime.fromtimestamp(os.stat(src_file).st_mtime).date() # 獲取日誌檔案生成日期

folder = folder / str(file_date)

os.makedirs(folder, exist_ok=true) # 建立日期資料夾

shutil.move(str(src_file), str(folder)) # 將檔案移動到對應日期資料夾

src_file2 = folder / (file_name + file_type)

# 若檔案大小超過最大值則新建檔案進行儲存

new_name = file_name+str(file_date)

new_file = path(f"/-" + file_type)

if src_file2.exists():

if new_file.exists():

while os.path.getsize(new_file)/float(1024**2) > max_log_size:

cnt += 1

new_file = path(f"-" + file_type)

merge_logs(src_file2, new_file)

os.remove(src_file2)

else:

merge_logs(src_file2, new_file)

os.remove(src_file2)

最後以python讀取json檔案為例來列印日誌:

def read_txt_file(file_name):

log_to_folder(f"/logs", "log") # 判斷是否存在日誌檔案存在的話就移動到對應日期資料夾下

log_to_folder(f"/logs", "error")

try:

with open(file_name, encoding="utf-8") as file:

js_data = json.load(file)

log.info("json data has read successfully") # info級別日誌

except exception as e:

log.error(e.__str__()) # erro級別日誌

return js_data

輸出日誌檔案的內容效果如下:

python常用模組 logger模組

python的logging模組提供了通用的日誌系統,熟練使用logging模組可以方便開發者開發第三方模組或者是自己的python應用。python使用logging模組記錄日誌涉及四個主要的類 logger 提供了應用程式可以直接使用的介面 handler 將 logger建立的 日誌記錄傳送到...

python 3 6 logger 日誌格式

今天使用python3.6來例項化logging,但是發現logger logging.getlogger name 記錄中文時日誌會顯示亂碼 發現python3.6需要設定下logging.handler才可以正常顯示中文,沒仔細研究,先貼上 後續補充原因 設定這樣格式中文還是會顯示亂碼 logg...

flask中logger日誌的使用

日誌是乙個正規系統都應該有的功能,否則當執行良好的系統突然無法正常運轉的時候,你就會束手無策,而有了日誌,你就可以通過日誌檢視其中緣由,從而解決問題。1.python中使用logger非常簡單,可以直接使用 2.我們可以通過設定logger的存貯方式,比如寫入檔案 import logging ha...