Node.js应用需通过日志库实现结构化、灵活的日志记录。常用库包括:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(), // 结构化日志
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独存储
new winston.transports.File({ filename: 'combined.log' }), // 所有日志合并
new winston.transports.Console() // 开发环境输出到控制台
]
});
通过结构化日志(如JSON),后续可通过工具快速提取关键字段(如用户ID、操作类型)进行分析。
合理设置日志级别可区分事件的严重性,便于快速定位问题:
关键事件记录要求:需记录能反映安全状态的操作,例如:
app.post('/login', (req, res) => {
const { username, password } = req.body;
// 验证逻辑...
if (loginSuccess) {
logger.info(`User ${username} logged in successfully`, {
ip: req.ip,
userAgent: req.get('User-Agent'),
timestamp: new Date().toISOString()
});
} else {
logger.warn(`Failed login attempt for user ${username}`, {
ip: req.ip,
timestamp: new Date().toISOString()
});
}
});
通过明确的关键事件记录,可快速追踪安全异常(如频繁的登录失败)。
为避免日志文件过大占用磁盘空间,需使用logrotate工具进行自动轮转。配置步骤:
sudo apt-get install logrotate;/etc/logrotate.d/nodejs):/var/log/nodejs/*.log {
daily # 每天轮转
missingok # 忽略缺失文件
rotate 7 # 保留7天日志
compress # 压缩旧日志(节省空间)
notifempty # 空日志不轮转
create 0640 root adm # 新日志文件权限
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl restart your-nodejs-service # 重启服务以重新打开日志文件
endscript
}
通过logrotate,可实现日志的自动管理,确保日志文件不会无限增长。
将Node.js日志发送到集中式系统(如ELK Stack、Graylog),便于统一存储、搜索和分析。以ELK为例:
/etc/logstash/conf.d/nodejs.conf):input {
file {
path => "/var/log/nodejs/*.log" # Node.js日志路径
start_position => "beginning" # 从头开始读取
sincedb_path => "/dev/null" # 忽略sincedb文件(测试用)
}
}
filter {
json { source => "message" } # 解析JSON格式日志
}
output {
elasticsearch {
hosts => ["localhost:9200"] # Elasticsearch地址
index => "nodejs-%{+YYYY.MM.dd}" # 按日期创建索引
}
stdout { codec => rubydebug } # 控制台输出(调试用)
}
集中式管理可实现日志的长期保存、跨应用分析,提升安全审计效率。
sudo使用、文件权限变更、网络连接尝试);0640),仅允许root或专用用户访问;使用防火墙限制对日志文件的访问(如仅允许可信IP访问/var/log目录);debug模块控制调试日志输出(仅在开发环境开启),避免无关信息干扰审计;# 查看Node.js服务的所有日志
journalctl -u your-nodejs-service
# 查看最近的10条错误日志
journalctl -u your-nodejs-service -p err -n 10
sudo apt-get install auditd
# 添加审计规则(记录对/var/log/nodejs目录的访问)
sudo auditctl -w /var/log/nodejs/ -p rwxa -k nodejs_logs
# 查看审计日志
ausearch -k nodejs_logs
系统工具可与Node.js日志结合,形成更全面的审计体系。