1. 在JavaScript应用中添加结构化日志记录
在JavaScript代码中集成日志库(如Winston、Bunyan),替代简单的console.log(),实现日志分级(info/warn/error)、格式化(JSON/文本)及多传输(文件/控制台/远程)。例如,使用Winston配置文件和控制台输出:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info', // 设置最低日志级别
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json() // 结构化日志便于后续分析
),
transports: [
new winston.transports.Console(), // 输出到控制台
new winston.transports.File({ filename: 'error.log', level: 'error' }), // 错误日志单独文件
new winston.transports.File({ filename: 'combined.log' }) // 所有日志合并文件
]
});
logger.info('Application started'); // 记录启动信息
logger.error('Database connection failed'); // 记录错误信息
这种方式能生成清晰、可过滤的日志,便于后续监控和分析。
2. 使用进程管理器管理应用日志
通过PM2(Node.js常用进程管理器)启动应用,自动捕获标准输出(stdout)和错误输出(stderr),并提供日志实时查看、轮转及远程传输功能。安装PM2并启动应用:
sudo npm install -g pm2 # 全局安装PM2
pm2 start app.js --name my-js-app # 启动应用并命名
pm2 save # 保存当前进程列表
pm2 startup # 设置PM2开机自启动
查看应用日志(实时滚动):
pm2 logs my-js-app # 实时查看指定应用的日志
pm2 logs --lines 100 # 查看最近100条日志
PM2还支持日志轮转(通过pm2 set my-js-app:log-size 10M设置单个日志文件大小),避免日志文件过大。
3. 配置系统日志收集(systemd/journalctl)
若JavaScript应用通过systemd服务运行(如Node.js应用),可将日志输出到syslog,再通过journalctl命令查看。创建systemd服务文件(如/etc/systemd/system/my-js-app.service):
[Unit]
Description=My JavaScript Application
After=network.target
[Service]
ExecStart=/usr/bin/node /path/to/your/app.js
Restart=always # 应用崩溃时自动重启
User=myuser # 以指定用户运行
Environment=NODE_ENV=production
StandardOutput=syslog # 标准输出重定向到syslog
StandardError=syslog # 标准错误重定向到syslog
SyslogIdentifier=my-js-app # syslog标识符
[Install]
WantedBy=multi-user.target
重新加载systemd配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl start my-js-app
sudo systemctl enable my-js-app # 开机自启动
查看应用日志(实时):
journalctl -u my-js-app -f # 实时查看指定服务的日志
journalctl -u my-js-app --since "1 hour ago" # 查看过去1小时的日志
journalctl -u my-js-app | grep "ERROR" # 过滤错误日志
journalctl支持按时间、服务名、关键字过滤,适合快速定位问题。
4. 使用日志轮转工具管理日志文件
为防止日志文件无限增长占用磁盘空间,使用logrotate(Debian预装)配置日志轮转。创建/etc/logrotate.d/my-js-app文件:
/var/log/my-js-app/*.log {
daily # 每天轮转
rotate 7 # 保留7个旧日志文件
compress # 压缩旧日志(节省空间)
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0640 myuser adm # 创建新日志文件的权限和所有者
sharedscripts # 所有日志轮转完成后执行脚本
postrotate
systemctl reload my-js-app >/dev/null 2>&1 || true # 重启应用以重新打开日志文件
endscript
}
logrotate会每天自动执行(可通过logrotate -vf /etc/logrotate.d/my-js-app手动测试),确保日志文件大小可控。
5. 部署集中式日志管理工具(ELK Stack/Graylog)
对于大规模或多应用场景,使用ELK Stack(Elasticsearch+Logstash+Kibana)或Graylog集中收集、存储、分析日志。以ELK为例:
sudo apt install elasticsearch logstash kibana # Debian仓库安装
sudo systemctl enable --now elasticsearch # 启动Elasticsearch
sudo systemctl enable --now kibana # 启动Kibana(端口5601)
/etc/logstash/conf.d/nodejs.conf:input {
file {
path => "/var/log/my-js-app/*.log" # 日志文件路径
start_position => "beginning" # 从文件开头读取
sincedb_path => "/dev/null" # 忽略sincedb文件(测试用)
}
}
filter {
# 可添加过滤器解析日志(如grok解析JSON)
}
output {
elasticsearch {
hosts => ["localhost:9200"] # Elasticsearch地址
index => "nodejs-logs-%{+YYYY.MM.dd}" # 按日期创建索引
}
}
重启Logstash:sudo systemctl restart logstash
http://your-server-ip:5601,进入“Stack Management→Index Patterns”,创建nodejs-logs-*索引模式,然后进入“Discover”查看实时日志。ELK支持可视化(Dashboard)、告警(Alerting)等功能,适合团队协作监控。6. 设置日志异常告警
通过监控工具(如Prometheus+Grafana、fail2ban)设置告警规则,当检测到错误日志(如“ERROR”“Exception”)或异常模式(如频繁崩溃)时,发送通知(邮件/短信/Slack)。例如,使用fail2ban监控Nginx错误日志并封禁恶意IP:
sudo apt install fail2ban # 安装fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 复制配置文件
编辑/etc/fail2ban/jail.local,启用Nginx监控:
[nginx-http-auth]
enabled = true
filter = nginx-http-auth
action = iptables[name=HTTP, port=http, protocol=tcp]
logpath = /var/log/nginx/error.log # Nginx错误日志路径
maxretry = 3 # 3次失败后封禁
bantime = 600 # 封禁10分钟
重启fail2ban:
sudo systemctl restart fail2ban
fail2ban会自动监控日志并封禁恶意IP,减少异常请求对应用的影响。