首页主机资讯Debian JS日志如何自动化处理

Debian JS日志如何自动化处理

时间2025-12-08 22:19:03发布访客分类主机资讯浏览581
导读:Debian JS日志自动化处理方案 一 架构与总体思路 在应用侧使用结构化日志库(如 Winston、Bunyan、Log4js)输出 JSON 或带时间戳的日志,便于后续解析与检索。 在主机侧用 logrotate 做按日/按大小切分...

Debian JS日志自动化处理方案

一 架构与总体思路

  • 在应用侧使用结构化日志库(如 Winston、Bunyan、Log4js)输出 JSON 或带时间戳的日志,便于后续解析与检索。
  • 在主机侧用 logrotate 做按日/按大小切分、压缩与保留,避免日志无限增长。
  • rsyslog/syslog-ngFluentd/Logstash 做采集与转发,集中到 Elasticsearch + KibanaGraylog 做检索、可视化与告警。
  • cron 定时运行分析/清理脚本,形成闭环(如错误摘要、指标统计、旧文件清理)。

二 应用侧结构化与本地轮转

  • 结构化日志示例(Node.js + Winston):
// logger.js
const {
 createLogger, format, transports }
     = require('winston');

const {
 combine, timestamp, errors, json }
     = format;


const logger = createLogger({

  level: 'info',
  format: combine(timestamp(), errors({
 stack: true }
), json()),
  transports: [
    new transports.File({
 filename: 'logs/app.log', maxsize: 10*1024*1024, maxFiles: 7 }
), // 10MB/文件,保留7个
    new transports.File({
 filename: 'logs/error.log', level: 'error', maxsize: 10*1024*1024, maxFiles: 30 }
)
  ],
  exceptionHandlers: [new transports.File({
 filename: 'logs/exceptions.log' }
)],
  rejectionHandlers: [new transports.File({
 filename: 'logs/rejections.log' }
)]
}
    );
    

module.exports = logger;

  • 使用 PM2 管理进程与日志文件分离:
sudo npm i -g pm2
pm2 start app.js -o out.log -e err.log --name myapp
pm2 logs myapp
  • 直接在 Node 中用日志库做按大小轮转(如 winston 的 maxsize/maxFiles),与系统级 logrotate 可叠加使用。

三 系统级轮转与清理

  • 使用 logrotate 管理 Node 应用日志(/etc/logrotate.d/nodejs):
/path/to/nodejs/logs/*.log {
    
  daily
  rotate 14
  compress
  delaycompress
  missingok
  notifempty
  create 0644 node node
  sharedscripts
  postrotate
    systemctl reload myapp >
    /dev/null 2>
    &
1 || true
  endscript
}
    
  • 调试与强制执行:
sudo logrotate -d /etc/logrotate.d/nodejs   # 语法检查
sudo logrotate -f /etc/logrotate.d/nodejs   # 强制执行一次
  • 如需清理系统 journal 日志(与业务日志分开管理):
sudo journalctl --vacuum-time=7d
sudo journalctl --vacuum-size=500M
  • 不建议直接 rm 正在写入的日志文件;优先用 logrotate 的 copytruncate 或 postrotate 通知应用重开文件句柄。

四 集中式采集与分析

  • 方案A(轻量):rsyslog 采集并转发到文件或远程
    • 配置 /etc/rsyslog.d/50-nodejs.conf:
:programname, isequal, "nodejs" /var/log/nodejs/app.log
&
     stop
  • 重启服务:sudo systemctl restart rsyslog
  • 方案B(通用):Fluentd tail 解析 JSON 并输出到 stdout/ES
<
    source>
    
  @type tail
  path /path/to/nodejs/logs/app.log
  pos_file /var/log/fluentd-nodejs.log.pos
  tag nodejs
  <
    parse>
    
    @type json
  <
    /parse>
    
<
    /source>
    
<
    match nodejs>
    
  @type stdout
<
    /match>

  • 方案C(功能全):ELK(Logstash 输入 file → Elasticsearch → Kibana 可视化)
    • Logstash 示例:
input {
 file {
     path =>
     "/path/to/nodejs/logs/app.log" start_position =>
 "beginning" }
 }

filter {
 }

output {
 elasticsearch {
     hosts =>
     ["localhost:9200"] index =>
 "js-logs-%{
+YYYY.MM.dd}
" }
 }
    
  • 可视化与告警:在 Kibana 建立索引模式与仪表板;或在 Graylog 配置流与告警规则。

五 定时分析与告警脚本

  • 简单错误摘要脚本(Node.js):
// analyze.js
const fs = require('fs');
    
const path = require('path');
    
const file = path.join(__dirname, 'logs', 'app.log');

const out = path.join(__dirname, 'reports', `err-summary-${
Date.now()}
    .txt`);
    

fs.readFile(file, 'utf8', (err, data) =>
 {
    
  if (err) return console.error('Read error:', err);
    
  const errs = data.split('\n').filter(l =>
     l &
    &
     l.includes('"level":"error"'));

  const summary = [`[${
new Date().toISOString()}
] 错误数: ${
errs.length}
    `];
    
  if (errs.length) summary.push(...errs.slice(0, 50));

  fs.mkdirSync(path.dirname(out), {
 recursive: true }
    );
    
  fs.writeFileSync(out, summary.join('\n'));

  // 可扩展:集成邮件/企业微信/钉钉 Webhook 推送
}
    );
    
  • 定时任务(cron)示例:
# 每天 02:00 分析,00:00 清理7天前报告
0 2 * * * /usr/bin/node /opt/scripts/analyze.js >
    >
     /var/log/log-analyze.log 2>
    &
    1
0 0 * * * find /opt/scripts/reports -type f -mtime +7 -delete
  • 如需邮件日报,可使用 logwatch 生成并邮件发送分析报告(适合系统/服务日志的日终汇总)。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Debian JS日志如何自动化处理
本文地址: https://pptw.com/jishu/766409.html
Ubuntu文件系统怎样扩容 Debian JS日志如何合规

游客 回复需填写必要信息