logger.js
3.3 KB
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
101
102
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createLogger = void 0;
const debug_1 = require("debug");
const fs_1 = require("fs");
const os_1 = require("os");
const util_1 = require("util");
// 配置解析
const parseEnvBool = (envVar) => {
const value = process.env[envVar] || '';
return /^(yes|on|true|enable|enabled|1)$/i.test(value);
};
const getEnvValue = (envVar, defaultValue) => {
return process.env[envVar] !== undefined ? process.env[envVar] : defaultValue;
};
// 默认配置
const DEFAULT_LOG_LEVELS = 'info:*,warn:*,error:*,debug:*,trace:*';
const WRITE_STREAM_OPTIONS = {
flags: 'a',
encoding: 'utf8',
autoClose: true,
emitClose: true
};
// 空日志函数
const noop = (..._args) => { };
const noopLogger = {
error: noop,
info: noop,
warn: noop,
debug: noop,
trace: noop,
close: noop
};
// 创建基础日志函数
const createBaseLoggers = (namespace) => {
return {
error: (0, debug_1.default)('error').extend(namespace),
info: (0, debug_1.default)('info').extend(namespace),
warn: (0, debug_1.default)('warn').extend(namespace),
debug: (0, debug_1.default)('debug').extend(namespace),
trace: (0, debug_1.default)('trace').extend(namespace)
};
};
// 配置日志级别
const configureLogLevels = (logger, enabledLevels) => {
Object.entries(logger).forEach(([level]) => {
logger[level].enabled = enabledLevels.includes(level);
});
};
// 创建文件日志写入器
const createFileLogger = (logFilePath, logger, enabledLevels) => {
const writeStream = fs_1.default.createWriteStream(logFilePath, WRITE_STREAM_OPTIONS);
const logToFile = (...args) => {
writeStream.write(`${util_1.default.format(...args)}${os_1.default.EOL}`);
};
const logToConsoleAndFile = (...args) => {
const message = util_1.default.format(...args);
console.error(message);
writeStream.write(`${message}${os_1.default.EOL}`);
};
// 配置日志输出方式
Object.entries(logger).forEach(([level, logFn]) => {
logFn.log = enabledLevels.includes(level) ? logToConsoleAndFile : logToFile;
});
// 返回完整logger对象
return {
...logger,
close: () => {
writeStream.end();
// 切换回仅控制台日志
Object.values(logger).forEach((logFn) => {
logFn.log = console.error;
});
}
};
};
// 主导出函数
const createLogger = (options) => {
// 处理参数重载
const normalizedOptions = typeof options === 'string'
? { namespace: options }
: options;
const { namespace, logFilePath, enabledLevels = getEnvValue('DEBUG', DEFAULT_LOG_LEVELS), debugEnabled = parseEnvBool('XXL_JOB_DEBUG_LOG') } = normalizedOptions;
if (!debugEnabled && !logFilePath) {
return noopLogger;
}
const logger = createBaseLoggers(namespace);
// 配置日志级别
configureLogLevels(logger, enabledLevels);
if (!logFilePath) {
return {
...logger,
close: noop
};
}
// 文件日志配置
return createFileLogger(logFilePath, logger, enabledLevels);
};
exports.createLogger = createLogger;
// 默认导出
exports.default = exports.createLogger;
//# sourceMappingURL=logger.js.map