如何使用AWK读取PostgreSQL错误日志?

xiozqbni  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(129)

我正在编写一个Bash脚本来解析Postgres错误日志,并提取特定日期/时间之间的日志条目。复杂的因素是条目可以是多行的,只有第一行包含时间戳。日志条目看起来像这样:
第一个月
其中<message>可以是1行或多行。<msgtype>ERRORSTATEMENTDETAIL等。几乎任何<msgtype>都可以有任何数量的行。
Awk将在命令行上处理多个文件,虽然文件中的行是按时间戳顺序排列的,但文件不一定是这样。(awk '{if ($1 >= "$first") { print } }')* 其中$first被设置为开始时间戳。为$last添加检查是微不足道的,问题是获取那些不以时间戳开始的行,而只有那些跟在一个匹配的后面的人。
有人能给我指出正确的方向吗?

  • 它只是根据我,这将只比较日期,而不是时间,所以有人可以帮助这一部分,以及?我可以做awk '{if ( ($1" "$2) >= "$first") { print } }'

预计到达时间:样本日志条目:

2023-11-07 07:01:25 UTC::@:[605]:ERROR: could not connect to the publisher: connection to server at "<ip addr>", port 5432 failed: FATAL: pg_hba.conf rejects replication connection for host "<ip addr>", user "<userid>", SSL on
 connection to server at "<ip addr>", port 5432 failed: FATAL: pg_hba.conf rejects replication connection for host "<ip addr>", user "<userid>", SSL off

字符串

bvjxkvbb

bvjxkvbb1#

这可能是你正在尝试做的事情,但是没有有用的示例输入/输出来演示你的所有需求,这是基于多个假设的猜测:

$ awk -v beg='2023-11-07 05:00:00' -v end='2024-12-01 07:00:00' '
    match($0,/^[0-9]{4}([-: ][0-9]{2}){5}/) { cur = substr($0,RSTART,RLENGTH) }
    (beg <= cur) && (cur <= end)
' file
2023-11-07 07:01:25 UTC::@:[605]:ERROR: could not connect to the publisher: connection to server at "<ip addr>", port 5432 failed: FATAL: pg_hba.conf rejects replication connection for host "<ip addr>", user "<userid>", SSL on
 connection to server at "<ip addr>", port 5432 failed: FATAL: pg_hba.conf rejects replication connection for host "<ip addr>", user "<userid>", SSL off

字符串
您可能希望也可能不希望收紧我正在使用的日期+时间正则表达式,这取决于日志文件中行开头可能存在的其他内容。

bmp9r5qi

bmp9r5qi2#

问题是获取那些不以时间戳开头的行,并且只获取那些跟在匹配时间戳之后的行。
您可以在GNU AWK中使用RS(行分隔符),考虑以下简单示例,让file.txt

2023-01-01 01:01:01
UNO
2023-03-03 03:03:03
TRES
TRES
TRES
2023-02-02 02:02:02
DOS
DOS

字符串
你的任务是提取2023年第二个月的条目,然后

awk 'BEGIN{RS="2023-[0-1][0-9]-[0-3][0-9]"}dt>="2023-02-01"&&dt<="2023-02-31"{printf("%s%s",dt,$0)}{dt=RT}' file.txt


给出输出

2023-02-02 02:02:02
DOS
DOS


说明:我使用RS,它应该匹配条目日期,并且只匹配文件中的条目日期,它假设日志仅与2023年有关,并且在随后的位置中允许的数字有限,尽管它仍然可能匹配一些无意义的日期,例如2023-01-37。然后我过滤dt在所需范围内的日期和printf给定日期的内容($0),独立于我在变量dt中存储RT(行终止符),因为我需要在过滤过程中考虑 previous 行的行终止符。

  • (在GNU Awk 5.1.0中测试)*

相关问题