env-manage-plugin
Version:
A dev env plugin that integrates an Express server with request proxying capabilities.
94 lines (93 loc) • 3.69 kB
JavaScript
// src/utils/logger.ts
import pino from "pino";
import { execSync } from "child_process";
import os from "os";
/**
* 自动将终端编码切换为 UTF-8(跨平台)
*/
function setTerminalEncodingToUtf8() {
const platform = os.platform();
try {
if (platform === "win32") {
// Windows 系统:切换代码页为 UTF-8(65001)
// execSync 执行 cmd 命令,stdio: 'ignore' 避免命令输出干扰日志
execSync("chcp 65001", { stdio: "ignore" });
console.log("Windows 终端已切换为 UTF-8 编码(代码页 65001)");
}
else if (platform === "linux" || platform === "darwin") {
// Linux/macOS 系统:设置 LC_ALL 为 UTF-8(临时生效)
// 注意:类 Unix 系统编码通常由 locale 控制,这里仅临时覆盖
process.env.LC_ALL = "en_US.UTF-8";
console.log("类 Unix 终端已设置为 UTF-8 编码");
}
}
catch (error) {
console.warn("切换终端编码失败,可能导致中文乱码:", error);
}
}
// 在日志初始化前调用,确保编码已切换
setTerminalEncodingToUtf8();
let rootLogger = null;
/**
* 创建根日志实例(Node.js 环境专用)
* 优先级:customOptions > 默认配置
*/
export const createRootLogger = (logLevel) => {
if (rootLogger)
return rootLogger;
const level = logLevel || "info";
// 默认配置:区分开发/生产环境
const defaultConfig = {
level, // 从配置读取日志级别
base: {
service: "envm-service", // 服务名(多服务日志区分)
// env: options.config.env || "development", // 环境标识(dev/prod/test)
pid: process.pid, // Node.js 进程 ID
},
// 开发环境:格式化输出(pino-pretty);生产环境:JSON 格式(便于日志收集工具解析)
transport: {
target: "pino-pretty",
options: {
colorize: true,
encoding: "utf8",
translateTime: "yyyy-mm-dd HH:MM:ss",
hideObject: level === "info",
},
},
// transport: options.config.env === "development"
// ? { target: "pino-pretty", options: { colorize: true, translateTime: "yyyy-MM-dd HH:mm:ss" } }
// : undefined,
timestamp: pino.stdTimeFunctions.isoTime, // ISO 时间格式
redact: ["req.headers.authorization", "res.data.token"], // 敏感字段脱敏(生产环境必备)
};
// 合并默认配置与自定义配置
rootLogger = pino({ ...defaultConfig });
return rootLogger;
};
/**
* 初始化模块级日志(单例,全局复用)
* 按业务模块分类,避免日志混乱
*/
export let logger; // 环境管理模块日志
export let envLogger; // 环境管理模块日志
export let devServerLogger; // 开发服务器模块日志
export let proxyLogger; // 代理模块日志
/**
* Node.js 日志初始化入口(需在 config 加载后调用)
*/
export const initLoggers = (logLevel) => {
const rootLog = createRootLogger(logLevel);
// 为每个模块创建子日志(附加 module 标识,便于筛选)
logger = rootLog.child({ module: "envm" });
envLogger = rootLog.child({ module: "env" });
devServerLogger = rootLog.child({ module: "devServer" });
proxyLogger = rootLog.child({ module: "proxy" });
};
/**
* 获取根日志实例(确保已初始化)
*/
export const getRootLogger = () => {
if (!rootLogger)
throw new Error("日志未初始化,请先调用 initNodeLoggers()");
return rootLogger;
};