-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog.py
More file actions
92 lines (74 loc) · 2.79 KB
/
log.py
File metadata and controls
92 lines (74 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import logging
import sys
import os
try:
import colorama
colorama.init()
except ImportError:
pass
class ColoredFormatter(logging.Formatter):
"""
Custom formatter that adds red coloring to ERROR and CRITICAL log messages
for the console output.
"""
RED = "\033[91m"
RESET = "\033[0m"
def format(self, record):
message = super(ColoredFormatter, self).format(record)
if record.levelno >= logging.ERROR:
message = f"{self.RED}{message}{self.RESET}"
return message
class FlushStreamHandler(logging.StreamHandler):
"""
Custom stream handler that flushes the terminal output after emitting each record.
"""
def emit(self, record):
super(FlushStreamHandler, self).emit(record)
self.flush()
class Log:
_instance = None
_initialized = False
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Log, cls).__new__(cls)
return cls._instance
def __init__(self, stdout=True, fileout=True, debug=True, filename="logger.log"):
if self._initialized:
return
if fileout and os.path.exists(filename):
open(filename, "w").close()
logger_level = logging.DEBUG if debug else logging.INFO
self.logger = logging.getLogger("DGLOSS")
self.logger.setLevel(logger_level)
self.logger.handlers.clear()
file_formatter = logging.Formatter(
fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
console_formatter = ColoredFormatter(
fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
if fileout:
file_handler = logging.FileHandler(filename)
file_handler.setFormatter(file_formatter)
file_handler.setLevel(logger_level)
self.logger.addHandler(file_handler)
if stdout:
console_handler = FlushStreamHandler(sys.stdout)
console_handler.setFormatter(console_formatter)
console_handler.setLevel(logger_level)
self.logger.addHandler(console_handler)
self._initialized = True
def debug(self, state: bool):
level = logging.DEBUG if state else logging.INFO
self.logger.setLevel(level)
for handler in self.logger.handlers:
handler.setLevel(level)
if __name__ == "__main__":
log = Log().logger
log.debug("This DEBUG message will not be shown (INFO level set).")
log.info("This is an INFO message.")
log.warning("This is a WARNING message.")
log.error("This is an ERROR message.")
log.critical("This is a CRITICAL message.")