启用SSR的SvelteKit项目SSR与客户端统一日志方案选型咨询
启用SSR的SvelteKit项目适配日志方案推荐
首选方案:Pino 搭配同构封装
Pino 是当前 Node.js 生态性能最优的结构化日志库之一,天然适配 SvelteKit 的同构运行模式,无需复杂配置即可覆盖你提出的所有要求:
- 可配置日志级别:默认支持 trace/debug/info/warn/error/fatal 共6个级别,支持全局、分运行环境单独配置,生产环境可直接调高级别过滤调试日志
- 服务端(Node.js adapter)输出兼容:SSR 运行时默认输出到标准输出(stdout),也可通过
pino/file传输器直接写入本地日志文件,完全适配 Docker、PM2 等常规部署场景的日志采集规则 - 客户端日志自动适配:通过简单的运行环境判断,客户端侧自动降级为原生控制台输出,不会把服务端相关的文件写入逻辑打包进客户端产物
- 诊断功能齐全:自带时间戳、结构化字段记录,搭配
pino-pretty工具可实现终端着色、格式化输出,生产环境也可直接输出 JSON 格式方便后续日志平台解析
Winston 适配方案(熟悉 Winston 可直接使用)
你已知晓的 Winston 完全可以适配 SvelteKit 的运行模式,仅需做简单的同构兼容处理即可:
- 服务端运行时正常初始化 Winston 实例,配置 stdout、文件输出传输器,按需设置日志级别、时间戳、着色规则
- 通过
import.meta.env.SSR变量判断运行环境,客户端侧直接降级为原生 console 输出,复用同一套日志调用 API - 注意在 Vite 配置中将 Winston 的服务端相关依赖标记为仅服务端导入,避免打包进客户端产物导致体积冗余
最简同构日志封装示例
// src/lib/logger.js import { pino } from 'pino' const isSSR = import.meta.env.SSR const logLevel = import.meta.env.VITE_LOG_LEVEL ?? 'info' const clientLogLevel = import.meta.env.VITE_CLIENT_LOG_LEVEL ?? 'warn' const levelList = ['trace', 'debug', 'info', 'warn', 'error', 'fatal'] let logger if (isSSR) { // 服务端初始化 logger = pino({ level: logLevel, transport: { target: 'pino-pretty', options: { colorize: true, timestamp: 'HH:MM:ss.l' } } }) } else { // 客户端初始化 logger = {} levelList.forEach(level => { logger[level] = (...args) => { if (levelList.indexOf(level) >= levelList.indexOf(clientLogLevel)) { const printFn = console[level] ?? console.log printFn(`[${new Date().toISOString()}] [${level.toUpperCase()}]`, ...args) } } }) } export default logger
使用时直接在任意服务端 load 函数、页面组件、客户端交互逻辑中导入 $lib/logger 调用即可,两端会自动匹配对应的输出规则。
内容的提问来源于stack exchange,提问作者Mikko Ohtamaa
相关产品推荐
相关产品推荐

