diff --git a/core/services.yaml b/core/services.yaml index 763021c..2e4bc41 100644 --- a/core/services.yaml +++ b/core/services.yaml @@ -57,7 +57,7 @@ services: # --- 邮件服务 --- - name: smtp cmd: bash /opt/micro_servers/smtp/_run.sh - args: [] + args: ["--instance", "smtp", "--log-level", "info"] depends_on: [] sleep_before: 2 diff --git a/smtp/log_client.py b/smtp/log_client.py index 0dd516f..99fd6fc 100644 --- a/smtp/log_client.py +++ b/smtp/log_client.py @@ -38,6 +38,29 @@ _FLUSH_INTERVAL = 2.0 # 超时 2 秒强制 flush _TIMEOUT = 5 # socket 超时(秒) _QUEUE_MAXSIZE = 10000 # 队列上限,防止后台线程异常时内存无限增长;满则丢弃最旧条目 +# ── 日志级别过滤 ── +_LOG_LEVELS = { + "debug": 0, "info": 1, "warn": 2, "warning": 2, + "error": 3, "critical": 4, +} +_LOG_LEVEL_THRESHOLD = _LOG_LEVELS["info"] # 默认 info + + +def _normalize_level(level): + """归一化级别名:大写转小写,warning→warn。""" + lv = (level or "info").lower() + if lv == "warning": + lv = "warn" + return lv + + +def set_log_level(level): + """设置日志过滤阈值(低于该级别的日志将被丢弃)。""" + global _LOG_LEVEL_THRESHOLD + lv = _normalize_level(level) + if lv in _LOG_LEVELS: + _LOG_LEVEL_THRESHOLD = _LOG_LEVELS[lv] + def _safe_json(obj): """安全序列化 extra 字段,不可序列化对象转为 repr 字符串,保证不抛异常。""" @@ -77,6 +100,9 @@ class LogClient: 队列满时静默丢弃最旧条目再放入新条目,保证不阻塞业务线程、不导致 OOM。 """ + # 级别过滤:低于当前阈值的日志直接丢弃(不进队列) + if _LOG_LEVELS.get(_normalize_level(level), 0) < _LOG_LEVEL_THRESHOLD: + return entry = { 'ts': _now_iso(), # 入队时即生成时间戳,反映真实事件时间 'service': service, diff --git a/smtp/smtp_v2.py b/smtp/smtp_v2.py index a9b2f54..9d03e91 100644 --- a/smtp/smtp_v2.py +++ b/smtp/smtp_v2.py @@ -303,12 +303,23 @@ if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="smtp — pymsg 邮箱验证码服务") - parser.add_argument("--addr", default="127.0.0.1", help="监听地址") + parser.add_argument("--addr", "--host", dest="addr", default="127.0.0.1", + help="监听地址(--host 与 --addr 等价)") parser.add_argument("--port", type=int, default=8008, help="监听端口") parser.add_argument("--workers", type=int, default=4, help="回调并发线程数(0=同步串行模式)") + parser.add_argument("--log-level", default="info", + choices=["debug", "info", "warn", "error"], + help="日志级别(默认 info)") + parser.add_argument("--instance", default="smtp", + help="实例名(注册中心用,默认 smtp)") args = parser.parse_args() + # 应用日志级别过滤(低于阈值的日志不进队列) + logs.set_log_level(args.log_level) + + print(f"[smtp] instance={args.instance} log-level={args.log_level}") + print(f"[smtp] 配置来源: .env / ENV > 默认值(SMTP 账号不通过 CLI 传递)") server = SmtpServer(args.addr, args.port, workers=args.workers) try: server.start()