在Linux环境下解析Node.js日志中的JSON数据有多种方法,下面我将介绍几种常用的方法。
jq是一个轻量级且灵活的命令行JSON处理器,非常适合在Linux终端处理JSON数据。
# 假设日志文件中有JSON数据行
cat app.log | grep "{" | jq .
cat app.log | jq '.timestamp, .level, .message'
cat app.log | jq 'select(.level == "error")'
如果你需要更复杂的处理,可以编写Node.js脚本:
const fs = require('fs');
const readline = require('readline');
const rl = readline.createInterface({
input: fs.createReadStream('app.log'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
try {
const logEntry = JSON.parse(line);
// 处理日志数据
if (logEntry.level === 'error') {
console.log(`[${logEntry.timestamp}] ${logEntry.message}`);
}
} catch (e) {
// 不是JSON格式的行
}
});
对于非标准格式的日志(JSON混合其他文本):
# 提取JSON部分
cat app.log | grep -o '{.*}' | jq .
对于大型日志系统,可以使用Logstash处理:
input {
file {
path => "/var/log/nodejs/app.log"
start_position => "beginning"
}
}
filter {
if [message] =~ /^{.*}$/ {
json {
source => "message"
}
}
}
output {
stdout { codec => rubydebug }
}
JSON不完整或格式错误:
# 使用jq的-R和--raw-input选项处理不完整JSON
cat app.log | jq -R 'fromjson? // empty'
日志文件过大:
# 使用less或tail查看部分日志
tail -n 100 app.log | jq .
需要实时监控日志:
tail -f app.log | grep --line-buffered '{' | jq .
选择哪种方法取决于你的具体需求:对于简单查看,jq是最方便的;对于复杂处理,Node.js脚本更灵活;对于生产环境,Logstash等专业工具更合适。