日志写入策略优化
- 异步写入:
- 使用
Winston
时,将日志写入操作改为异步。Winston
本身支持通过 transport
进行异步写入。例如,使用 winston.transport.Console
和 winston.transport.File
时,可以设置 options.writeStream
为一个异步写入流。
- 示例代码:
const winston = require('winston');
const { createWriteStream } = require('fs');
const { join } = require('path');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transport.Console(),
new winston.transport.File({
filename: join(__dirname, 'logs', 'app.log'),
writeStream: createWriteStream(join(__dirname, 'logs', 'app.log'), { flags: 'a' }),
// 设置 highWaterMark 来控制缓冲区大小,减少内存占用
highWaterMark: 16384
})
]
});
- 日志分级与过滤:
- 根据日志的重要性分级,如
error
、warn
、info
、debug
等。在高并发场景下,可以动态调整日志级别,例如在生产环境中只记录 error
和 warn
级别的日志,减少日志量。
- 示例代码:
// 根据环境变量调整日志级别
if (process.env.NODE_ENV === 'production') {
logger.level = 'warn';
} else {
logger.level = 'debug';
}
- 批量写入:
- 可以使用队列机制,将日志事件批量处理后再写入。例如,使用
async - queue
库。
- 示例代码:
const Queue = require('async - queue');
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transport.Console()
]
});
const logQueue = new Queue((tasks, callback) => {
// 处理批量日志
tasks.forEach(task => {
logger.log(task.level, task.message);
});
callback();
}, 10); // 每次处理10条日志
// 将日志事件加入队列
function logEvent(level, message) {
logQueue.push({ level, message });
}
性能监控数据采集频率优化
- 动态调整采集频率:
- 在
New Relic
中,可以根据应用的负载情况动态调整性能监控数据的采集频率。例如,当应用负载较低时,可以增加采集频率以获取更详细的数据;当负载较高时,降低采集频率以减少性能开销。
- 配置说明:在
newrelic.js
配置文件中,可以通过 transaction_tracer.explain_threshold
和 transaction_tracer.transaction_threshold
等参数来间接控制采集频率。例如:
{
"transaction_tracer": {
"explain_threshold": 0.1,
"transaction_threshold": 0.5
}
}
explain_threshold
表示当事务执行时间超过这个阈值(单位:秒)时,会记录详细的解释信息。transaction_threshold
表示当事务执行时间超过这个阈值时,会被采样进行详细分析。适当调整这些值可以在不同负载情况下平衡性能和数据准确性。
- 采样策略优化:
New Relic
支持多种采样策略,如固定速率采样、自适应采样等。在高并发场景下,自适应采样可以根据应用的性能状况自动调整采样率。
- 配置说明:在
newrelic.js
配置文件中,可以设置 sampler
相关参数。例如:
{
"sampler": {
"adaptive_sampling": true
}
}
- 开启自适应采样后,
New Relic
会根据应用的实时性能状况动态调整采样率,保证在高并发时既能获取有代表性的数据,又不会过度影响性能。
工具配置调优
- Winston 配置调优:
- 日志格式优化:使用更简洁的日志格式,避免不必要的字段记录。例如,在生产环境中可以只记录时间、日志级别和主要信息。
- 示例代码:
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
transports: [
new winston.transport.Console()
]
});
- 减少日志元数据:在不需要过多元数据的情况下,减少如
process
、hostname
等默认添加的元数据,降低日志大小。
- New Relic 配置调优:
- 禁用不必要的功能:如果应用不需要某些
New Relic
的功能,如 Browser Monitoring
,可以在配置文件中禁用,减少资源占用。
- 配置说明:在
newrelic.js
配置文件中:
{
"browser_monitoring": {
"enabled": false
}
}
- 优化数据上报频率:可以调整
New Relic
数据上报到服务器的频率。例如,通过 config_file
中的 agent.run_interval
参数(单位:秒)来设置。默认值为 60 秒,可以根据实际情况适当增大这个值,减少网络开销。
{
"agent": {
"run_interval": 120
}
}