要将Node.js应用的日志与系统日志关联起来,可以采用以下几种方法:
const winston = require('winston');
const { Syslog } = require('winston-syslog');
const logger = winston.createLogger({
transports: [
new Syslog({
host: 'localhost',
port: 514,
protocol: 'udp4',
facility: 'local0',
app_name: 'your-node-app'
})
]
});
const { Journald } = require('winston-journald');
const logger = winston.createLogger({
transports: [new Journald()]
});
配置/etc/logrotate.d/your-node-app
:
/var/log/your-node-app/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 root adm
sharedscripts
postrotate
systemctl restart your-node-app
endscript
}
配置/etc/rsyslog.d/your-node-app.conf
:
$ModLoad imfile
$InputFileName /var/log/your-node-app/app.log
$InputFileTag node-app:
$InputFileStateFile stat-node-app
$InputFileSeverity info
$InputFileFacility local7
$InputRunFileMonitor
local7.* /var/log/syslog
// 使用winston-elasticsearch
const { ElasticsearchTransport } = require('winston-elasticsearch');
const esTransport = new ElasticsearchTransport({
level: 'info',
clientOpts: { node: 'http://localhost:9200' }
});
const logger = winston.createLogger({
transports: [esTransport]
});
配置Fluentd收集Node.js日志:
<source>
@type tail
path /var/log/your-node-app/app.log
pos_file /var/log/td-agent/your-node-app.log.pos
tag node.app
format json
</source>
<match node.app>
@type elasticsearch
host localhost
port 9200
logstash_format true
</match>
const uuid = require('uuid');
const cls = require('cls-hooked');
// 创建命名空间
const ns = cls.createNamespace('app');
// 中间件设置请求ID
app.use((req, res, next) => {
ns.run(() => {
const requestId = req.headers['x-request-id'] || uuid.v4();
ns.set('requestId', requestId);
next();
});
});
// 日志记录时包含请求ID
function createLogger() {
return winston.createLogger({
format: winston.format.combine(
winston.format((info) => {
info.requestId = ns.get('requestId');
return info;
})(),
winston.format.json()
),
transports: [new winston.transports.Console()]
});
}
require('newrelic');
const tracer = require('dd-trace').init();
这些APM工具会自动关联日志、指标和追踪信息。
选择哪种方案取决于你的具体需求、系统架构和团队熟悉的技术栈。