|
@@ -12,15 +12,11 @@ import os
|
|
|
import sys
|
|
|
from logging.handlers import BaseRotatingHandler
|
|
|
|
|
|
-import logstash
|
|
|
import loguru
|
|
|
from better_exceptions import format_exception
|
|
|
|
|
|
import feapder.setting as setting
|
|
|
|
|
|
-LOG_FORMAT = "%(threadName)s|%(asctime)s|%(filename)s|%(funcName)s|line:%(lineno)d|%(levelname)s| %(message)s"
|
|
|
-PRINT_EXCEPTION_DETAILS = True
|
|
|
-
|
|
|
|
|
|
class InterceptHandler(logging.Handler):
|
|
|
def emit(self, record):
|
|
@@ -34,13 +30,7 @@ class InterceptHandler(logging.Handler):
|
|
|
# 现在 xxx.log xxx1.log xxx2.log 如果backup_count 是2位数时 则 01 02 03 三位数 001 002 .. 文件由近及远
|
|
|
class RotatingFileHandler(BaseRotatingHandler):
|
|
|
def __init__(
|
|
|
- self,
|
|
|
- filename,
|
|
|
- mode="a",
|
|
|
- max_bytes=0,
|
|
|
- backup_count=0,
|
|
|
- encoding=None,
|
|
|
- delay=0
|
|
|
+ self, filename, mode="a", max_bytes=0, backup_count=0, encoding=None, delay=0
|
|
|
):
|
|
|
BaseRotatingHandler.__init__(self, filename, mode, encoding, delay)
|
|
|
self.max_bytes = max_bytes
|
|
@@ -54,8 +44,6 @@ class RotatingFileHandler(BaseRotatingHandler):
|
|
|
|
|
|
if self.backup_count > 0:
|
|
|
for i in range(self.backup_count - 1, 0, -1):
|
|
|
- # sfn = "%d_%s" % (i, self.baseFilename)
|
|
|
- # dfn = "%d_%s" % (i + 1, self.baseFilename)
|
|
|
sfn = ("%0" + self.placeholder + "d.") % i # '%2d.'%i -> 02
|
|
|
sfn = sfn.join(self.baseFilename.split("."))
|
|
|
dfn = ("%0" + self.placeholder + "d.") % (i + 1)
|
|
@@ -82,7 +70,6 @@ class RotatingFileHandler(BaseRotatingHandler):
|
|
|
self.stream = self._open()
|
|
|
|
|
|
if self.max_bytes > 0: # are we rolling over?
|
|
|
- # print('record >>>> ', record)
|
|
|
msg = "%s\n" % self.format(record)
|
|
|
self.stream.seek(0, 2) # due to non-posix-compliant Windows feature
|
|
|
if self.stream.tell() + len(msg) >= self.max_bytes:
|
|
@@ -97,7 +84,6 @@ def get_logger(
|
|
|
log_level=None,
|
|
|
is_write_to_console=None,
|
|
|
is_write_to_file=None,
|
|
|
- is_send_to_logstash = None,
|
|
|
color=None,
|
|
|
mode=None,
|
|
|
max_bytes=None,
|
|
@@ -134,13 +120,6 @@ def get_logger(
|
|
|
if is_write_to_file is not None
|
|
|
else setting.LOG_IS_WRITE_TO_FILE
|
|
|
)
|
|
|
-
|
|
|
- is_send_to_logstash = (
|
|
|
- is_send_to_logstash
|
|
|
- if is_send_to_logstash is not None
|
|
|
- else setting.LOG_IS_SEND_TO_LOGSTASH
|
|
|
- )
|
|
|
-
|
|
|
color = color if color is not None else setting.LOG_COLOR
|
|
|
mode = mode or setting.LOG_MODE
|
|
|
max_bytes = max_bytes or setting.LOG_MAX_BYTES
|
|
@@ -153,8 +132,8 @@ def get_logger(
|
|
|
logger = logging.getLogger(name)
|
|
|
logger.setLevel(log_level)
|
|
|
|
|
|
- formatter = logging.Formatter(LOG_FORMAT)
|
|
|
- if PRINT_EXCEPTION_DETAILS:
|
|
|
+ formatter = logging.Formatter(setting.LOG_FORMAT)
|
|
|
+ if setting.PRINT_EXCEPTION_DETAILS:
|
|
|
formatter.formatException = lambda exc_info: format_exception(*exc_info)
|
|
|
|
|
|
# 定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
|
|
@@ -171,18 +150,11 @@ def get_logger(
|
|
|
)
|
|
|
rf_handler.setFormatter(formatter)
|
|
|
logger.addHandler(rf_handler)
|
|
|
-
|
|
|
- if is_send_to_logstash:
|
|
|
- stash_handler = logstash.TCPLogstashHandler(
|
|
|
- setting.LOG_STASH_IP, setting.LOG_STASH_PORT, version=1)
|
|
|
- logger.addHandler(stash_handler)
|
|
|
-
|
|
|
if color and is_write_to_console:
|
|
|
loguru_handler = InterceptHandler()
|
|
|
loguru_handler.setFormatter(formatter)
|
|
|
# logging.basicConfig(handlers=[loguru_handler], level=0)
|
|
|
logger.addHandler(loguru_handler)
|
|
|
-
|
|
|
elif is_write_to_console:
|
|
|
stream_handler = logging.StreamHandler()
|
|
|
stream_handler.stream = sys.stdout
|
|
@@ -241,9 +213,9 @@ STOP_LOGS = [
|
|
|
]
|
|
|
|
|
|
# 关闭日志打印
|
|
|
+OTHERS_LOG_LEVAL = eval("logging." + setting.OTHERS_LOG_LEVAL)
|
|
|
for STOP_LOG in STOP_LOGS:
|
|
|
- log_level = eval("logging." + setting.OTHERS_LOG_LEVAL)
|
|
|
- logging.getLogger(STOP_LOG).setLevel(log_level)
|
|
|
+ logging.getLogger(STOP_LOG).setLevel(OTHERS_LOG_LEVAL)
|
|
|
|
|
|
# print(logging.Logger.manager.loggerDict) # 取使用debug模块的name
|
|
|
|
|
@@ -253,6 +225,13 @@ for STOP_LOG in STOP_LOGS:
|
|
|
class Log:
|
|
|
log = None
|
|
|
|
|
|
+ def func(self, log_level):
|
|
|
+ def wrapper(msg, *args, **kwargs):
|
|
|
+ if self.isEnabledFor(log_level):
|
|
|
+ self._log(log_level, msg, args, **kwargs)
|
|
|
+
|
|
|
+ return wrapper
|
|
|
+
|
|
|
def __getattr__(self, name):
|
|
|
# 调用log时再初始化,为了加载最新的setting
|
|
|
if self.__class__.log is None:
|
|
@@ -267,6 +246,12 @@ class Log:
|
|
|
def info(self):
|
|
|
return self.__class__.log.info
|
|
|
|
|
|
+ @property
|
|
|
+ def success(self):
|
|
|
+ log_level = logging.INFO + 1
|
|
|
+ logging.addLevelName(log_level, "success".upper())
|
|
|
+ return self.func(log_level)
|
|
|
+
|
|
|
@property
|
|
|
def warning(self):
|
|
|
return self.__class__.log.warning
|