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()的区别

函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式

repr 会将隐藏字符转义输出

如将一个含有回车符和 \x00 的字符串 str() 输出 {"status": 1},repr() 输出 {"status": 1}\n\x00'

5 查看系统日志

  • 显示过去一小时内的日志:journalctl --since "1 hour ago"

  • 显示过去一天内的日志:journalctl --since "yesterday"

Last updated