一、日志系统的核心问题
在设计日志系统之前,应首先回答以下几个关键问题,以明确日志的作用与目标:
- Why(为什么):为什么需要记录日志?是为了调试、审计还是监控?
- Who(谁):哪些模块或服务将负责生成日志?
- When(何时):在何种情况下应输出日志?如系统异常、用户操作、接口调用等。
- Where(哪里):日志将保存到哪里?本地磁盘、日志服务器,还是发送到云端如 Slack、BigQuery 等。
- What(什么):日志内容应包含哪些关键信息?
- How(如何):日志以什么样的格式和方式进行记录与输出?
只有清晰回答这些问题,才能为系统搭建出高效且可维护的日志体系。
二、日志级别的划分与应用
为了便于管理与分析,日志需要根据重要程度分为不同级别,常见的划分如下:
| 日志级别 | 概念 | 处理方式 | 示例 |
|---|---|---|---|
| FATAL | 系统无法继续运行的致命错误 | 需立刻修复 | 无法连接数据库 |
| ERROR | 非预期错误 | 尽快修复 | 邮件发送失败 |
| WARN | 可接受但存在异常的情况 | 定期优化 | 数据清理接口异常 |
| INFO | 普通操作日志 | 无需修复 | 请求开始与结束通知 |
| DEBUG | 调试信息 | 不在生产环境输出 | 函数内部状态信息 |
| TRACE | 更详细的调试信息 | 仅限开发或测试环境 | SQL 执行明细 |
正确地设置和使用日志级别,能够大大提升故障排查效率,避免信息过载。
如果您使用香港云服务器,配合合理的日志级别划分,不仅可以提升监控精准度,还能节省存储成本,进一步优化整体运维效率。
三、不同类型的日志记录案例
根据不同的业务需求,日志通常分为以下几类,每种日志在记录时需明确六个基本要素(Why、Who、When、Where、What、How):
1. 系统日志(System Log)
- Why:用于调试系统内部错误。
- Who:系统自身输出。
- When:错误发生时。
- Where:FATAL/ERROR通过推送到开发通知,WARN/INFO记录至日志系统。
- What:包含堆栈跟踪、错误描述。
- How:结合日志系统与消息推送平台,如Slack、短信等。
2. 访问日志(Access Log)
- Why:跟踪HTTP请求与响应。
- Who:应用程序或中间件自动生成。
- When:请求或响应时记录。
- Where:INFO级别,保存至日志系统。
- What:请求路径、请求参数、响应状态码。
- How:统一格式输出,便于检索与统计。
3. 操作日志(Action Log)
- Why:分析用户行为,优化系统体验。
- Who:业务模块或前端系统。
- When:用户操作发生时。
- Where:发送至日志分析平台(如BigQuery)。
- What:操作对象、操作内容、操作时间。
- How:统一结构化数据格式输出。
4. 认证日志(Auth Log)
- Why:记录用户登录与身份验证信息。
- Who:认证模块。
- When:用户进行身份验证时。
- Where:INFO级别记录。
- What:用户ID、登录时间、认证方式。
- How:安全存储,防止敏感信息泄露。
通过合理分类记录,可以帮助您在香港独立服务器环境中轻松应对海量日志数据,实现精准快速的检索与分析。
四、实战案例:使用 Log4js 搭建日志系统
1. 选择日志库
在Node.js项目中,Log4js 是一款功能强大且易于扩展的日志库,支持多级别日志记录,非常适合构建结构化日志体系。
2. 定义 Logger 类
示例代码如下(遵循WordPress代码规范,未添加外链):
import * as log4js from 'log4js';
class Logger {
public system = log4js.getLogger('system');
public api = log4js.getLogger('api');
public access_req = log4js.getLogger('access_req');
public access_res = log4js.getLogger('access_res');
public sql = log4js.getLogger('sql');
public auth = log4js.getLogger('auth');
public fatal = log4js.getLogger('fatal');
public error = log4js.getLogger('error');
public warn = log4js.getLogger('warn');
public info = log4js.getLogger('info');
public debug = log4js.getLogger('debug');
public trace = log4js.getLogger('trace');
constructor() {
log4js.configure(loggerConfig);
this.setLogLevels();
}
private setLogLevels() {
this.fatal.level = log4js.levels.FATAL;
this.error.level = log4js.levels.ERROR;
this.warn.level = log4js.levels.WARN;
this.info.level = log4js.levels.INFO;
this.debug.level = log4js.levels.DEBUG;
this.trace.level = log4js.levels.TRACE;
}
}
该类封装了系统常见的日志类型与级别,便于统一管理和调用。
3. 应用 Logger 到项目中
结合框架(如 NestJS)的拦截器(Interceptor)功能,能够无侵入地捕获请求和响应日志:
export class LoggerInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const request = context.switchToHttp().getRequest();
requestLogger(request);
const response = context.switchToHttp().getResponse();
return next.handle().pipe(
map((data) => {
responseLogger({ requestId: request._id, response, data });
return data;
}),
tap({
error: (exception: any) => {
responseErrorLogger({ requestId: request._id, exception });
}
})
);
}
}
配合requestLogger、responseLogger和responseErrorLogger方法,可以实现全链路日志追踪,极大提升故障定位效率。
五、结语
一个科学、完善的日志系统,是每一个现代应用不可或缺的一部分。无论是调试开发中的小问题,还是应对大规模业务系统的高并发挑战,日志都是开发者和运维人员最有力的工具。
当然,优秀的服务器基础设施也是系统稳定运行的保障。如果您正在寻找高可靠性、极速连接、低延迟的服务器,欢迎选择我们。我们提供专业的香港VPS、香港云服务器、香港独立服务器方案,助力您的业务全球加速!