chenyc
2026-03-22 7885cede659f3255be56f77c1eef2ada7387d6f1
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
93
94
95
96
97
98
99
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;