Log practice
1 输出某列大于某个数值的日志
cat access.log | awk -F '"' '$28>1000 {print $0}'
-F 指定分隔符
$28 代表第28列
$28>1000 表示第28列的值大于1000
print $0 表示输出整行
指定多个分割符号
awk -F ‘[-|]’
2 输出某列是否等于某个值
比如状态值是否等于 stat:ERR
// 比如执行 ssh 相关命令时,日志的参数部分可能含有 stat:ERR, 直接 grep 时无法获取有效的日志内容
cat dev_acc.log | awk -F'\t' '{if($9=="stat:ERR") print $0}'
3 合并多行日志并输出某个时间段日志到新文件
awk 'BEGIN {
RS = "";
FS = "\n";
ORS = "\n";
}
{
# 初始化输出变量
output = "";
# 遍历每行,查找时间戳并合并行
for (i = 1; i <= NF; i++) {
# 提取时间戳(假设时间戳在行首)
if ($i ~ /^(DEBUG|TRACE|NOTICE): [0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}:/) {
# 提取日期和时间部分
split($i, parts, ": ");
date_time = parts[2]; # 提取日期和时间部分,例如 "06-13 13:00:01"
# 检查日期和时间是否以目标日期小时开头
if (date_time ~ /^06-16 11:/) {
if (output != "") {
print output > "xagent.log_hour"; # 输出到新文件
}
output = $i;
} else {
# 如果日期或时间不在范围内,跳过该记录
output = "";
break;
}
} else {
# 仅当 output 不为空时,合并行
if (output != "") {
output = output " " $i;
}
}
}
# 输出最后一个符合条件的记录
if (output != "") {
print output > "xagent.log_hour"; # 输出到新文件
}
}' xagent.log
4 repr
python 中 repr 和 eval 可以用来在数据结构和字符串间互转 在这个功能上,repr 和 str 的作用一样,把一个数据结构转换成字符串,例如:
>>> repr([1,2,3,4])
'[1, 2, 3, 4]'
eval 是把字符串转换成数据结构,例如:
>>> eval('[1,2,3,4]')
[1, 2, 3, 4]
Redis 中很多 key name 是使用的中文,可以先通过 repr(key) 转为字符串,塞入队列,然后处理 worker 获取到时先 eval(key_str) 进行转换为原数据
repr()和str()的区别
5 查看系统日志
显示过去一小时内的日志:journalctl --since "1 hour ago"
显示过去一天内的日志:journalctl --since "yesterday"
Last updated