本文主要是針對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...