Debian JS日志如何自动化处理
导读:Debian JS日志自动化处理方案 一 架构与总体思路 在应用侧使用结构化日志库(如 Winston、Bunyan、Log4js)输出 JSON 或带时间戳的日志,便于后续解析与检索。 在主机侧用 logrotate 做按日/按大小切分...
Debian JS日志自动化处理方案
一 架构与总体思路
- 在应用侧使用结构化日志库(如 Winston、Bunyan、Log4js)输出 JSON 或带时间戳的日志,便于后续解析与检索。
- 在主机侧用 logrotate 做按日/按大小切分、压缩与保留,避免日志无限增长。
- 用 rsyslog/syslog-ng 或 Fluentd/Logstash 做采集与转发,集中到 Elasticsearch + Kibana 或 Graylog 做检索、可视化与告警。
- 用 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
