在日志文件中查找模式

时间:2017-04-24 22:52:44

标签: shell grep

如何在今天的日期从日志文件中选择所有ERROR,WARN和FATAL行?提前谢谢。

我的日志文件如下所示。

[2017-04-24 17:26:48,385] WARN ******* GOODBYE /10.170.208.1:35084 ******** (org.apache.zookeeper.server.quorum.LearnerHandler)
[2017-04-24 17:26:48,385] WARN Ignoring unexpected exception (org.apache.zookeeper.server.quorum.LearnerHandler)
java.lang.InterruptedException
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220)
        at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
        at java.util.concurrent.LinkedBlockingQueue.put(LinkedBlockingQueue.java:339)
        at org.apache.zookeeper.server.quorum.LearnerHandler.shutdown(LearnerHandler.java:654)
        at org.apache.zookeeper.server.quorum.LearnerHandler.run(LearnerHandler.java:647)
[2017-04-24 17:26:48,385] INFO Reading snapshot /bnsf/kafka/zookeeper/version-2/snapshot.900000000 (org.apache.zookeeper.server.persistence.FileSnap)
[2017-04-24 17:26:48,476] INFO Notification: 1 (message format version), 1 (n.leader), 0x243970000003b (n.zxid), 0x243aa (n.round), LOOKING (n.state), 1 (n.sid), 0x243a5 (n.peerEpoch) LOOKING (my state) (org.apache.zookeeper.server.quorum.FastLeaderElection)
[2017-04-24 17:26:48,496] INFO Notification: 1 (message format version), 2 (n.leader), 0x243970000003b (n.zxid), 0x243aa (n.round), LOOKING (n.state), 2 (n.sid), 0x243a5 (n.peerEpoch) LOOKING (my state) (org.apache.zookeeper.server.quorum.FastLeaderElection)
[

3 个答案:

答案 0 :(得分:1)

使用grep

grep -E "^\[$(date +%Y-%m-%d).*(FATAL|ERROR|WARN)" logfile

对于您的示例,我们得到此输出:

[2017-04-24 17:26:48,385] WARN ******* GOODBYE /10.170.208.1:35084 ******** (org.apache.zookeeper.server.quorum.LearnerHandler)
[2017-04-24 17:26:48,385] WARN Ignoring unexpected exception (org.apache.zookeeper.server.quorum.LearnerHandler)

如果您需要在匹配后包含几行以覆盖多行日志,请使用-A n选项。

答案 1 :(得分:0)

最好的选择可能是使用grep。您可以使用date +%F获取当前日期,将其用作正则表达式的一部分。例如:

grep "$(date +%F).*\(WARN\|ERROR\|FATAL\)" log_file.log

这应该抓住log_file.log中当前日期的所有行,其中包含' WARN',' ERROR'或' FATAL'。

答案 2 :(得分:0)

首先,你想拥有"今天的日期"以您的文件格式。

$ date +%Y-%m-%d
2017-04-24

您可以将其分配给变量:

$ today=$(date +%Y-%m-%d)

然后我会使用awk,因为ERROR,WARN和FATAL出现在第3个字段中:

$ awk -v today="[$today" '$1 == today && $3 ~ /ERROR|WARN|FATAL/ {print}'