This is my Logger
class:
import logging
import os
import datetime
class Logger:
_logger = None
def __new__(cls, user: str, *args, **kwargs):
if cls._logger is None:
cls._logger = super().__new__(cls, *args, **kwargs)
cls._logger = logging.getLogger("crumbs")
cls._logger.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s] [%(levelname)s] [%(filename)s] [%(funcName)s] [%(lineno)d]: %(message)s')
now = datetime.datetime.now()
directory_name = f'./log/{now.strftime("%Y-%m-%d")}'
base_log_name = f'/{user}'
log_file_extension = '.log'
if not os.path.isdir(directory_name):
os.mkdir(directory_name)
file_handler = logging.FileHandler(f'{directory_name}{base_log_name}{now.strftime("%d-%m-%Y")}{log_file_extension}', 'w', 'utf-8')
stream_handler = logging.StreamHandler()
file_handler.setFormatter(formatter)
stream_handler.setFormatter(formatter)
cls._logger.addHandler(file_handler)
cls._logger.addHandler(stream_handler)
return cls._logger
And this is my class
that accept user argument
and I want my log
file to be created with my user name in the file name
:
@dataclass(kw_only=True)
class RunningJobManager:
user: str = field(init=True)
password: str = field(init=True)
logging: Logger = field(init=False, default_factory=Logger(user=user))
So currently my user field
inside Logger
class is with type of dataclasses.Field
instead of string
.
I also try to use default
instread of default_factory
And I got this error:
Curerenly my code crash with OSError, [Errno 22] Invalid argument: 'G:\my_project\log\2023-01-20\Field(name=None,type=None,default=<dataclasses._MISSING_TYPE object at 0x0000017B1E78DB10>,default_factory=<dataclasses._MISSING_TYPE object at 0x0000017B1E78DB10>,init=True,repr=True,hash=None,compare=True,metadata=mappingproxy({}),kw_only=<dataclasses._MISSING_TYPE object at 0x0000017B1E78DB10>,_field_type=None)20-01-2023.log'
At this line:
file_handler = logging.FileHandler(f'{directory_name}{base_log_name}{now.strftime("%d-%m-%Y")}{log_file_extension}', 'w', 'utf-8')
EDIT
"stdout_handler": {
"formatter": "std_out",
"class": "logging.StreamHandler",
"level": "DEBUG"
}