我正在嘗試創建一個class可以使用保存的.log.
這是我的代碼:
import logging
from datetime import datetime
import sys
import os
class DummyLog:
def __init__(self,
log_name: str = datetime.now().strftime('%d_%m_%Y__%H_%M_%S'),
logging_level: str = 'debug',
string_format: str = '%(asctime)s: %(levelname)s: %(message)s',
datetime_format: str = '%m/%d/%Y %I:%M:%S %p',
log_on_folder: bool = True,
log_folder_name: str = 'logs'
):
self.logName = log_name
self.logger = None
self.loggingLevel = logging_level
self.stringFormat = string_format
self.datetimeFormat = datetime_format
if log_on_folder:
if not os.path.exists(log_folder_name):
os.mkdir(log_folder_name)
self.logName = log_folder_name '/' self.logName
self.initiateLogger()
def initiateLogger(self):
""" This function will initiate the logger as a single threaded log"""
self.logger = logging.getLogger(self.logName)
if self.loggingLevel == 'debug':
self.loggingLevel = logging.DEBUG
self.logger.setLevel(self.loggingLevel)
logFormat = logging.Formatter(self.stringFormat, datefmt=self.datetimeFormat)
# Creating and adding the console handler
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logFormat)
self.logger.addHandler(consoleHandler)
# Creating and adding the file handler
fileHandler = logging.FileHandler(self.logName ".log", mode='w')
fileHandler.setFormatter(logFormat)
self.logger.addHandler(fileHandler)
dl = DummyLog()
dl.logger.info("hi")
import time
time.sleep(1)
dl1 = DummyLog()
dl1.logger.info("hi")
當我運行上面的代碼時,它只創建一個.log檔案,并且dl和dl1物件都被記錄在同一個.log檔案中。
控制臺輸出列印log3 次而不是 2 次:
01/03/2022 12:01:20 PM: INFO: hi
01/03/2022 12:01:21 PM: INFO: hi
01/03/2022 12:01:21 PM: INFO: hi
但我已經發起了class Dummylog兩次。我期待class DummyLog可以在多個實體中呼叫的代碼更改,并且每個實體將保存一個單獨的.log檔案。
我知道我在Handler.
任何幫助將不勝感激 !!
uj5u.com熱心網友回復:
您的默認日志名稱基于時間,但準確性是第二個,您必須在記錄器實體之間休眠或使用非默認名稱:
dl = DummyLog(log_name="name1")
dl.logger.info("hi")
import time
time.sleep(1)
dl1 = DummyLog(log_name="name2")
dl1.logger.info("hi")
結果將是
logs
├── name1.log
└── name2.log
我發現您的代碼主要有問題,您在默認引數中使用了函式呼叫:
log_name: str = datetime.now().strftime('%d_%m_%Y__%H_%M_%S'),
通過這個lang_name在類定義時用一個字串啟動并且永遠不會改變。你可以使用這樣的解決方案:
import logging
from datetime import datetime
import sys
import os
class DummyLog:
counter = 0
def __init__(self,
log_name: str = "",
logging_level: str = 'debug',
string_format: str = '%(asctime)s: %(levelname)s: %(message)s',
datetime_format: str = '%m/%d/%Y %I:%M:%S %p',
log_on_folder: bool = True,
log_folder_name: str = 'logs'
):
if log_name:
self.logName = log_name
else:
self.logName = f"{DummyLog.counter}_{datetime.now().strftime('%d_%m_%Y__%H_%M_%S')}"
DummyLog.counter = 1
self.logger = None
self.loggingLevel = logging_level
self.stringFormat = string_format
self.datetimeFormat = datetime_format
if log_on_folder:
if not os.path.exists(log_folder_name):
os.mkdir(log_folder_name)
self.logName = log_folder_name '/' self.logName
self.initiateLogger()
def initiateLogger(self):
""" This function will initiate the logger as a single threaded log"""
self.logger = logging.getLogger(self.logName)
if self.loggingLevel == 'debug':
self.loggingLevel = logging.DEBUG
self.logger.setLevel(self.loggingLevel)
logFormat = logging.Formatter(self.stringFormat, datefmt=self.datetimeFormat)
# Creating and adding the console handler
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logFormat)
self.logger.addHandler(consoleHandler)
# Creating and adding the file handler
fileHandler = logging.FileHandler(self.logName ".log", mode='w')
fileHandler.setFormatter(logFormat)
self.logger.addHandler(fileHandler)
dl = DummyLog()
dl.logger.info("hi dl")
dl1 = DummyLog()
dl1.logger.info("hi dl1")
dl2 = DummyLog()
dl2.logger.info("hi dl2")
uj5u.com熱心網友回復:
不要使用可變物件作為默認引數。相反,在運行時傳遞它們或使用 None 作為默認值并設定值。
在您的情況下 DateTime 在函式定義時進行評估。
前任:
def __init__(self,
log_name = None,
logging_level: str = 'debug',
string_format: str = '%(asctime)s: %(levelname)s: %(message)s',
datetime_format: str = '%m/%d/%Y %I:%M:%S %p',
log_on_folder: bool = True,
log_folder_name: str = 'logs'
):
if log_name is None:
self.logName = datetime.now().strftime('%d_%m_%Y__%H_%M_%S')
dl = DummyLog()
dl.logger.info("hi")
import time
time.sleep(1)
dl1 = DummyLog()
dl1.logger.info("hi")
或在運行時傳遞。
dl = DummyLog(log_name=datetime.now().strftime('%d_%m_%Y__%H_%M_%S'))
dl.logger.info("hi")
import time
time.sleep(1)
dl1 = DummyLog(log_name=datetime.now().strftime('%d_%m_%Y__%H_%M_%S'))
dl1.logger.info("hi")
uj5u.com熱心網友回復:
感謝@S4eed3sm 的回答。我正在更新創建多個.log檔案并用于datetime.now().strftime('%d_%m_%Y__%H_%M_%S')創建日志并帶有前綴的答案
import logging
from datetime import datetime
import sys
import os
class DummyLog:
def __init__(self,
log_name: str = datetime.now().strftime('%d_%m_%Y__%H_%M_%S'),
logging_level: str = 'debug',
string_format: str = '%(asctime)s: %(levelname)s: %(message)s',
datetime_format: str = '%m/%d/%Y %I:%M:%S %p',
log_on_folder: bool = True,
log_folder_name: str = 'logs',
log_prefix: str = None
):
if log_prefix:
self.logName = log_prefix log_name
else:
self.logName = log_name
self.logger = None
self.loggingLevel = logging_level
self.stringFormat = string_format
self.datetimeFormat = datetime_format
if log_on_folder:
if not os.path.exists(log_folder_name):
os.mkdir(log_folder_name)
self.logName = log_folder_name '/' self.logName
self.initiateLogger()
def initiateLogger(self):
""" This function will initiate the logger as a single threaded log"""
self.logger = logging.getLogger(self.logName)
if self.loggingLevel == 'debug':
self.loggingLevel = logging.DEBUG
self.logger.setLevel(self.loggingLevel)
logFormat = logging.Formatter(self.stringFormat, datefmt=self.datetimeFormat)
# Creating and adding the console handler
consoleHandler = logging.StreamHandler(sys.stdout)
consoleHandler.setFormatter(logFormat)
self.logger.addHandler(consoleHandler)
# Creating and adding the file handler
fileHandler = logging.FileHandler(self.logName ".log", mode='w')
fileHandler.setFormatter(logFormat)
self.logger.addHandler(fileHandler)
dl = DummyLog(log_prefix='one_')
dl.logger.info("hi")
dl1 = DummyLog(log_prefix='two_')
dl1.logger.info("hi")
這將創建多個.log帶有以下前綴的 s
logs
├── one_03_01_2022__12_42_02.log
└── two_03_01_2022__12_42_02.log
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/402218.html
上一篇:從父類繼承回傳屬性錯誤
