Node.js日志在Ubuntu中的审计方法
要实现有效的日志审计,首先需要确保Node.js应用程序输出的日志具备结构化格式(便于后续解析)和合理的分级(区分日志重要性)。推荐使用以下日志库:
error、warn、info),并支持日志轮转和JSON格式输出,适合大多数应用场景。TRACE、DEBUG),可将日志输出到控制台、文件、数据库等,适合复杂分布式系统。配置示例(Winston):
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(), // 结构化输出
transports: [
new winston.transports.File({ filename: '/var/log/nodejs/error.log', level: 'error' }), // 错误日志单独存储
new winston.transports.File({ filename: '/var/log/nodejs/combined.log' }), // 所有日志合并
new winston.transports.Console() // 控制台输出(调试用)
]
});
logger.info('Application started'); // 记录info级别日志
将Node.js日志集中存储便于统一审计,Ubuntu下常用以下工具:
journalctl命令查看与Node.js服务相关的日志(需将应用作为systemd服务运行)。例如:# 启动Node.js服务(命名为my-node-app)
sudo systemctl start my-node-app
# 查看该服务的所有日志
journalctl -u my-node-app -f # -f表示实时跟踪
/etc/logrotate.d/nodejs:/var/log/nodejs/*.log {
daily # 每天轮转
rotate 7 # 保留7天日志
compress # 压缩旧日志
missingok # 文件不存在不报错
notifempty # 空文件不轮转
create 640 nodejs adm # 创建新日志文件并设置权限(nodejs用户、adm组)
}
sudo apt install auditd
# 添加规则:监控/var/log/nodejs目录的写入操作
sudo auditctl -w /var/log/nodejs/ -p wa -k nodejs_logs
# 查看审计日志
ausearch -k nodejs_logs # 搜索与nodejs_logs相关的事件
grep 'ERROR' /var/log/nodejs/error.log # 筛选错误日志
awk '/2025-11-06/ {count++} END {print count}' /var/log/nodejs/combined.log # 统计今日日志条数
ERROR日志、非法IP访问),并设置警报(如通过邮件通知管理员)。adm组)能访问日志文件。设置日志目录权限:sudo chown -R nodejs:adm /var/log/nodejs # 将日志目录所有者设为nodejs用户,所属组为adm
sudo chmod -R 640 /var/log/nodejs/*.log # 日志文件权限设为640(所有者可读写,组可读)
gpg加密示例:gpg -c /var/log/nodejs/sensitive.log # 生成加密文件sensitive.log.gpg
rm /var/log/nodejs/sensitive.log # 删除原文件
ERROR日志数量超过阈值),生成报告并发送警报。示例脚本:#!/bin/bash
ERROR_COUNT=$(grep -c 'ERROR' /var/log/nodejs/error.log)
if [ $ERROR_COUNT -gt 10 ]; then
echo "ERROR: Found $ERROR_COUNT errors in Node.js logs" | mail -s "Node.js Audit Alert" admin@example.com
fi
将脚本添加到cron(每天凌晨1点运行):crontab -e
# 添加以下行
0 1 * * * /path/to/audit_script.sh