debian

如何通过Debian JS日志监控应用

小樊
50
2025-09-27 07:29:32
栏目: 编程语言

1. 在JavaScript应用中添加结构化日志记录
在JavaScript代码中集成日志库(如WinstonBunyan),替代简单的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为例:

6. 设置日志异常告警
通过监控工具(如Prometheus+Grafanafail2ban)设置告警规则,当检测到错误日志(如“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,减少异常请求对应用的影响。

0
看了该问题的人还看了