From 7885cede659f3255be56f77c1eef2ada7387d6f1 Mon Sep 17 00:00:00 2001
From: chenyc <501753378@qq.com>
Date: 星期日, 22 三月 2026 16:23:21 +0800
Subject: [PATCH] 初始化项目

---
 src/logger.js |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 100 insertions(+), 0 deletions(-)

diff --git a/src/logger.js b/src/logger.js
new file mode 100644
index 0000000..a1fd1fc
--- /dev/null
+++ b/src/logger.js
@@ -0,0 +1,100 @@
+const fs = require("fs");
+const path = require("path");
+const winston = require("winston");
+const DailyRotateFile = require("winston-daily-rotate-file");
+const config = require("./config");
+
+function resolveLogDir() {
+  const dirFromConfig = (config.log && config.log.dir) || "logs";
+  const appRoot = process.pkg
+    ? path.dirname(process.execPath)
+    : path.resolve(__dirname, "..");
+  return path.isAbsolute(dirFromConfig)
+    ? dirFromConfig
+    : path.resolve(appRoot, dirFromConfig);
+}
+
+const logDir = resolveLogDir();
+try {
+  if (!fs.existsSync(logDir)) {
+    fs.mkdirSync(logDir, { recursive: true });
+  }
+} catch (_) {}
+
+const logLevel = (config.log && config.log.level) || "info";
+const enableFileLog = !config.log || config.log.toFile !== false;
+
+const logFormat = winston.format.combine(
+  winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss.SSS" }),
+  winston.format.errors({ stack: true }),
+  winston.format.printf((info) => {
+    const base = `[${info.timestamp}] [${info.level.toUpperCase()}] ${info.message}`;
+    const extra = { ...info };
+    delete extra.level;
+    delete extra.message;
+    delete extra.timestamp;
+
+    const hasExtra = Object.keys(extra).length > 0;
+    if (!hasExtra) return base;
+    try {
+      return `${base} ${JSON.stringify(extra)}`;
+    } catch (_) {
+      return base;
+    }
+  })
+);
+
+const transports = [
+  new winston.transports.Console({ level: logLevel })
+];
+
+if (enableFileLog) {
+  transports.push(
+    new DailyRotateFile({
+      level: logLevel,
+      dirname: logDir,
+      filename: "gateway-%DATE%.log",
+      datePattern: "YYYY-MM-DD",
+      maxSize: "50m",
+      maxFiles: "30d"
+    })
+  );
+  transports.push(
+    new DailyRotateFile({
+      level: "error",
+      dirname: logDir,
+      filename: "gateway-error-%DATE%.log",
+      datePattern: "YYYY-MM-DD",
+      maxSize: "50m",
+      maxFiles: "30d"
+    })
+  );
+}
+
+const baseLogger = winston.createLogger({
+  level: logLevel,
+  format: logFormat,
+  transports,
+  exitOnError: false
+});
+
+const logger = {
+  debug(message, extra) {
+    if (extra === undefined) baseLogger.debug(message);
+    else baseLogger.debug(message, extra);
+  },
+  info(message, extra) {
+    if (extra === undefined) baseLogger.info(message);
+    else baseLogger.info(message, extra);
+  },
+  warn(message, extra) {
+    if (extra === undefined) baseLogger.warn(message);
+    else baseLogger.warn(message, extra);
+  },
+  error(message, extra) {
+    if (extra === undefined) baseLogger.error(message);
+    else baseLogger.error(message, extra);
+  }
+};
+
+module.exports = logger;

--
Gitblit v1.8.0