|
30 | 30 | import ql_fs |
31 | 31 | import _thread |
32 | 32 |
|
| 33 | +__all__ = [ |
| 34 | + "CRITICAL", "FATAL", "ERROR", "WARNING", "WARN", "INFO", "DEBUG", "NOTSET", |
| 35 | + "Logger", "getLogger", "setLogFile", "setSaveLog", "getSaveLog", "setLogLevel", |
| 36 | + "getLogLevel", "setLogDebug", "getLogDebug", |
| 37 | +] |
| 38 | + |
33 | 39 | _LOG_LOCK = _thread.allocate_lock() |
34 | | -_LOG_LEVEL_CODE = { |
35 | | - "debug": 0, |
36 | | - "info": 1, |
37 | | - "warn": 2, |
38 | | - "error": 3, |
39 | | - "critical": 4, |
| 40 | + |
| 41 | +CRITICAL = 50 |
| 42 | +FATAL = CRITICAL |
| 43 | +ERROR = 40 |
| 44 | +WARNING = 30 |
| 45 | +WARN = WARNING |
| 46 | +INFO = 20 |
| 47 | +DEBUG = 10 |
| 48 | +NOTSET = 0 |
| 49 | + |
| 50 | +_levelToName = { |
| 51 | + CRITICAL: 'CRITICAL', |
| 52 | + ERROR: 'ERROR', |
| 53 | + WARNING: 'WARNING', |
| 54 | + INFO: 'INFO', |
| 55 | + DEBUG: 'DEBUG', |
| 56 | + NOTSET: 'NOTSET', |
| 57 | +} |
| 58 | + |
| 59 | +_nameToLevel = { |
| 60 | + 'CRITICAL': CRITICAL, |
| 61 | + 'FATAL': FATAL, |
| 62 | + 'ERROR': ERROR, |
| 63 | + 'WARNING': WARNING, |
| 64 | + 'WARN': WARN, |
| 65 | + 'INFO': INFO, |
| 66 | + 'DEBUG': DEBUG, |
| 67 | + 'NOTSET': NOTSET, |
40 | 68 | } |
41 | 69 |
|
42 | | -_log_dict = {} |
43 | | -_log_path = "/usr/log/" |
44 | | -_log_name = "pigeon_tracker.log" |
45 | | -_log_file = _log_path + _log_name |
46 | | -_log_save = False |
47 | | -_log_size = 0x8000 |
48 | | -_log_back = 8 |
49 | | -_log_level = "debug" |
50 | | -_log_debug = True |
| 70 | +_LOG_DICT = {} |
| 71 | +_LOG_PATH = "/usr/" |
| 72 | +_LOG_NAME = "project.log" |
| 73 | +_LOG_FILE = _LOG_PATH + _LOG_NAME |
| 74 | +_LOG_SAVE = False |
| 75 | +_LOG_SIZE = 0x8000 |
| 76 | +_LOG_BACK = 8 |
| 77 | +_LOG_LEVEL = DEBUG |
| 78 | +_LOG_DEBUG = True |
51 | 79 |
|
52 | 80 |
|
53 | 81 | class Logger: |
54 | 82 | def __init__(self, name): |
55 | 83 | self.__name = name |
| 84 | + self.__file = None |
| 85 | + |
| 86 | + def __open_log(self): |
| 87 | + global _LOG_FILE |
| 88 | + if not self.__file: |
| 89 | + self.__file = open(_LOG_FILE, "wb") |
| 90 | + |
| 91 | + def __close_log(self): |
| 92 | + if self.__file: |
| 93 | + self.__file.close() |
| 94 | + self.__file = None |
| 95 | + |
| 96 | + def __write_log(self, msg): |
| 97 | + if self.__file: |
| 98 | + self.__file.write(msg) |
| 99 | + self.__file.flush() |
56 | 100 |
|
57 | 101 | def __save_log(self, msg): |
58 | | - global _log_path |
59 | | - global _log_file |
60 | 102 | try: |
| 103 | + msg += "\n" if not msg.endswith("\n") else "" |
61 | 104 | log_size = 0 |
62 | | - if not ql_fs.path_exists(_log_path): |
63 | | - uos.mkdir(_log_path[:-1]) |
64 | | - if ql_fs.path_exists(_log_file): |
65 | | - log_size = ql_fs.path_getsize(_log_file) |
66 | | - if log_size + len(msg) >= _log_size: |
67 | | - for i in range(_log_back, 0, -1): |
68 | | - bak_file = _log_file + "." + str(i) |
| 105 | + if not ql_fs.path_exists(_LOG_PATH): |
| 106 | + uos.mkdir(_LOG_PATH[:-1]) |
| 107 | + if ql_fs.path_exists(_LOG_FILE): |
| 108 | + log_size = ql_fs.path_getsize(_LOG_FILE) |
| 109 | + if log_size + len(msg) >= _LOG_SIZE: |
| 110 | + self.__close_log() |
| 111 | + for i in range(_LOG_BACK, 0, -1): |
| 112 | + bak_file = _LOG_FILE + "." + str(i) |
69 | 113 | if ql_fs.path_exists(bak_file): |
70 | | - if i == _log_back: |
| 114 | + if i == _LOG_BACK: |
71 | 115 | uos.remove(bak_file) |
72 | 116 | else: |
73 | | - uos.rename(bak_file, _log_file + "." + str(i + 1)) |
74 | | - uos.rename(_log_file, _log_file + ".1") |
75 | | - with open(_log_file, "a") as lf: |
76 | | - lf.write(msg) |
| 117 | + uos.rename(bak_file, _LOG_FILE + "." + str(i + 1)) |
| 118 | + uos.rename(_LOG_FILE, _LOG_FILE + ".1") |
| 119 | + self.__open_log() |
| 120 | + self.__write_log(msg) |
77 | 121 | except Exception as e: |
78 | 122 | sys.print_exception(e) |
79 | 123 |
|
80 | 124 | def __log(self, level, *message): |
81 | | - global _log_save |
82 | 125 | with _LOG_LOCK: |
83 | | - if _log_debug is False: |
84 | | - if _log_level == "debug" and level == "debug": |
85 | | - return |
86 | | - if _LOG_LEVEL_CODE.get(level) < _LOG_LEVEL_CODE.get(_log_level): |
87 | | - return |
| 126 | + if _LOG_DEBUG is False and ((_LOG_LEVEL == level == DEBUG) or level < _LOG_LEVEL): |
| 127 | + return |
88 | 128 | _time = "{}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(*utime.localtime()) |
89 | | - msg = "[{}][{}][{}]".format(_time, self.__name, level) |
| 129 | + msg = "[{}][{}][{}]".format(_time, self.__name, _levelToName[level]) |
90 | 130 | print(msg, *message) |
91 | | - if _log_save: |
| 131 | + if _LOG_SAVE: |
92 | 132 | msg = msg + " " + " ".join(message) if message else msg |
93 | 133 | self.__save_log(msg) |
94 | 134 |
|
95 | 135 | def critical(self, *message): |
96 | | - self.__log("critical", *message) |
| 136 | + self.__log(CRITICAL, *message) |
| 137 | + |
| 138 | + def fatal(self, *message): |
| 139 | + self.critical(*message) |
97 | 140 |
|
98 | 141 | def error(self, *message): |
99 | | - self.__log("error", *message) |
| 142 | + self.__log(ERROR, *message) |
| 143 | + |
| 144 | + def warning(self, *message): |
| 145 | + self.__log(WARNING, *message) |
100 | 146 |
|
101 | 147 | def warn(self, *message): |
102 | | - self.__log("warn", *message) |
| 148 | + self.warning(*message) |
103 | 149 |
|
104 | 150 | def info(self, *message): |
105 | | - self.__log("info", *message) |
| 151 | + self.__log(INFO, *message) |
106 | 152 |
|
107 | 153 | def debug(self, *message): |
108 | | - self.__log("debug", *message) |
| 154 | + self.__log(DEBUG, *message) |
109 | 155 |
|
110 | 156 |
|
111 | 157 | def getLogger(name): |
112 | | - global _log_dict |
113 | | - if not _log_dict.get(name): |
114 | | - _log_dict[name] = Logger(name) |
115 | | - return _log_dict[name] |
| 158 | + global _LOG_DICT |
| 159 | + if not _LOG_DICT.get(name): |
| 160 | + _LOG_DICT[name] = Logger(name) |
| 161 | + return _LOG_DICT[name] |
116 | 162 |
|
117 | 163 |
|
118 | 164 | def setLogFile(path, name): |
119 | | - global _log_path, _log_name, _log_file |
| 165 | + global _LOG_PATH, _LOG_NAME, _LOG_FILE |
120 | 166 | if not path.endswith("/"): |
121 | 167 | path += "/" |
122 | | - _log_path = path |
123 | | - _log_name = name |
124 | | - _log_file = _log_path + _log_name |
| 168 | + _LOG_PATH = path |
| 169 | + _LOG_NAME = name |
| 170 | + _LOG_FILE = _LOG_PATH + _LOG_NAME |
125 | 171 | return 0 |
126 | 172 |
|
127 | 173 |
|
128 | 174 | def setSaveLog(save, size=None, backups=None): |
129 | | - global _log_save, _log_size, _log_back |
| 175 | + global _LOG_SAVE, _LOG_SIZE, _LOG_BACK |
130 | 176 | if not isinstance(save, bool): |
131 | 177 | return (1, "save is not bool.") |
132 | | - _log_save = save |
133 | | - if _log_save: |
| 178 | + _LOG_SAVE = save |
| 179 | + if _LOG_SAVE: |
134 | 180 | if not isinstance(size, int): |
135 | 181 | return (2, "size is not int.") |
136 | | - _log_size = size |
| 182 | + _LOG_SIZE = size |
137 | 183 | if not isinstance(backups, int): |
138 | 184 | return (3, "backups is not int.") |
139 | | - _log_back = backups |
| 185 | + _LOG_BACK = backups |
140 | 186 | return (0, "success.") |
141 | 187 |
|
142 | 188 |
|
143 | 189 | def getSaveLog(): |
144 | | - return _log_save |
| 190 | + return _LOG_SAVE |
145 | 191 |
|
146 | 192 |
|
147 | 193 | def setLogLevel(level): |
148 | | - global _log_level |
149 | | - level = level.lower() |
150 | | - if level not in _LOG_LEVEL_CODE.keys(): |
151 | | - return False |
152 | | - _log_level = level |
153 | | - return True |
| 194 | + global _LOG_LEVEL |
| 195 | + level = level.upper() |
| 196 | + if _nameToLevel.get(level) is not None: |
| 197 | + _LOG_LEVEL = _nameToLevel.get(level) |
| 198 | + return True |
| 199 | + if _levelToName.get(level) is not None: |
| 200 | + _LOG_LEVEL = level |
| 201 | + return True |
| 202 | + return False |
154 | 203 |
|
155 | 204 |
|
156 | 205 | def getLogLevel(): |
157 | | - return _log_level |
| 206 | + return _levelToName.get(_LOG_LEVEL) |
158 | 207 |
|
159 | 208 |
|
160 | 209 | def setLogDebug(debug): |
161 | | - global _log_debug |
| 210 | + global _LOG_DEBUG |
162 | 211 | if isinstance(debug, bool): |
163 | | - _log_debug = debug |
| 212 | + _LOG_DEBUG = debug |
164 | 213 | return True |
165 | 214 | return False |
166 | 215 |
|
167 | 216 |
|
168 | 217 | def getLogDebug(): |
169 | | - return _log_debug |
| 218 | + return _LOG_DEBUG |
0 commit comments