要从Node.js日志中提取关键数据,可以采用以下几种方法:
const winston = require('winston');
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(info => {
return `${info.timestamp} [${info.level}]: ${info.message} - ${JSON.stringify(info.metadata)}`;
})
),
transports: [new winston.transports.Console()]
});
// 使用示例
logger.info('User login', { userId: 123, ip: '192.168.1.1' });
const bunyan = require('bunyan');
const log = bunyan.createLogger({
name: 'myapp',
streams: [{ path: '/var/log/myapp.log' }]
});
// 结构化日志
log.info({ userId: 123, action: 'login' }, 'User logged in');
# 提取包含"ERROR"的日志行
grep "ERROR" app.log
# 提取特定时间段的日志
sed -n '/2023-01-01 10:00/,/2023-01-01 11:00/p' app.log
# 提取JSON格式的特定字段
grep "userLogin" app.log | jq '.userId, .ipAddress'
# 提取所有错误日志的用户ID
cat app.log | jq 'select(.level == "error") | .userId'
const fs = require('fs');
const readline = require('readline');
async function extractErrors(logFile) {
const fileStream = fs.createReadStream(logFile);
const rl = readline.createInterface({ input: fileStream });
for await (const line of rl) {
try {
const logEntry = JSON.parse(line);
if (logEntry.level === 'error') {
console.log(`Error at ${logEntry.timestamp}: ${logEntry.message}`);
}
} catch (e) {
// 非JSON格式日志处理
if (line.includes('ERROR')) {
console.log(`Raw error line: ${line}`);
}
}
}
}
extractErrors('app.log');
logrotate
管理日志文件大小通过以上方法,您可以有效地从Node.js日志中提取关键数据进行分析和监控。