在Linux系统中,JavaScript应用程序的日志存储策略对于监控、调试和性能优化至关重要。以下是一些常见的日志存储策略和实践:
为了避免日志文件过大,可以使用日志轮转工具,如logrotate。logrotate可以定期压缩、备份和删除旧日志文件。
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
}
根据日志类型或模块将日志分割到不同的文件中,便于管理和分析。
const fs = require('fs');
const path = require('path');
const logDir = path.join(__dirname, 'logs');
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir);
}
const debugLog = fs.createWriteStream(path.join(logDir, 'debug.log'), { flags: 'a' });
const infoLog = fs.createWriteStream(path.join(logDir, 'info.log'), { flags: 'a' });
const errorLog = fs.createWriteStream(path.join(logDir, 'error.log'), { flags: 'a' });
function log(level, message) {
const timestamp = new Date().toISOString();
const logEntry = `${timestamp} [${level}] ${message}\n`;
switch (level) {
case 'debug':
debugLog.write(logEntry);
break;
case 'info':
infoLog.write(logEntry);
break;
case 'error':
errorLog.write(logEntry);
break;
default:
console.error(`Unknown log level: ${level}`);
}
}
使用集中式日志管理系统,如ELK Stack(Elasticsearch, Logstash, Kibana)或Graylog,可以更方便地收集、搜索和分析日志。
const winston = require('winston');
const { ElasticsearchTransport } = require('winston-elasticsearch');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new ElasticsearchTransport({
clientOpts: { node: 'http://localhost:9200' },
index: 'myapp-logs-%DATE%',
}),
],
});
logger.info('Hello, world!');
确保日志文件的安全性,避免敏感信息泄露。可以使用日志脱敏工具或手动处理敏感数据。
function sanitizeLog(message) {
return message.replace(/password=\S+/g, 'password=***');
}
function log(level, message) {
const sanitizedMessage = sanitizeLog(message);
// 继续记录日志...
}
设置监控和告警系统,如Prometheus和Grafana,实时监控日志中的关键指标,并在异常时发送告警。
const prometheus = require('prom-client');
const register = prometheus.register;
const httpRequestDurationMicroseconds = new prometheus.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code'],
});
app.use((req, res, next) => {
const start = Date.now();
res.on('finish', () => {
const duration = Date.now() - start;
httpRequestDurationMicroseconds
.labels(req.method, req.route.path, res.statusCode)
.observe(duration);
});
next();
});
app.get('/metrics', async (req, res) => {
res.set('Content-Type', register.contentType);
res.end(await register.metrics());
});
通过以上策略和实践,可以有效地管理和存储Linux系统中JavaScript应用程序的日志,确保系统的稳定性和可维护性。