日志最后有报错,怎样拿到最后一条日志的时间

问题遇到的现象和发生背景

一个目录下有一些错误日志文件,文件内容是下面这样的:

2023-01-18 01:02:25.142 <INFO><WebAccessStatistic.java><execution><98>处理
...
...
2023-01-18 05:05:01.645 <INFO><WebAccessStatistic.java><execution><98>处理
2023-01-18 05:10:03.478 <ERROR><WebAccessStatistic.java><execution><444>[异常结束。
                 at com.ssh2.Connection.java:525)
                 at com.ssh2.diss.Handling.java:221)
                 at com.ssh2.middle.WebVisit.java:54)
]
2023-01-18 05:20:06.240 <ERROR><WebAccessStatistic.java><execution><672>[异常结束。
2023-01-18 05:30:07.520 <ERROR><WebAccessStatistic.java><execution><444>[异常结束。
                 at com.ssh2.Connection.java:525)
                 at com.ssh2.diss.Handling.java:221)
                 at com.ssh2.middle.WebVisit.java:54)
]
我的解答思路和尝试过的方法

find logs/** -name "." -exec bash -c "echo -n '文件名:{},'&&head -1 {}|cut -c-19|tr '\n' ','&&tail -1 {}|cut -c-19" ; >> /dataAnalysis.csv
用这个命令能够生成:文件名及对应的开始时间和结束时间,但这条命令对于没有错误日志是可以的,但像上面有报错日志时就不行了。

我想要达到的结果

目标:
第1个:对这些日志文件,生成“文件名(包括路径)及对应这个日志文件中的开始时间和最后一条能截取到的时间,对上面文件指的就是:2023-01-18 05:30:07。
第2个:对这些日志文件,生成“文件名(包括路径)及对应这个日志文件中的开始时间和最后一条非ERROR日志的时间,对上面文件指的就是:2023-01-18 05:05:01。

非常感谢!

您可以使用 awk 来实现您的目标。可以使用 awk 的多行匹配功能,将 ERROR 日志分开处理。

第1个目标:

awk '{print $1,$2}' logs/** | awk '{print FILENAME,$1,$2}' >> /dataAnalysis.csv


第2个目标:

awk '!/ERROR/{print $1,$2}' logs/** | awk '{print FILENAME,$1,$2}' >> /dataAnalysis.csv


这些命令将文件名和对应的开始时间和结束时间写入 /dataAnalysis.csv 文件中。

此外,您还可以使用 sed 或 grep 等命令来进一步过滤日志文件中的信息。

/logs/c2.log文件的内容如下:

2023-01-18 01:02:25.142 <INFO><WebAccessStatistic.java><execution><98>处理
2023-01-18 02:02:25.142 <INFO><WebAccessStatistic.java><execution><98>处理
2023-01-18 03:02:25.142 <INFO><WebAccessStatistic.java><execution><98>处理
2023-01-18 04:05:01.645 <INFO><WebAccessStatistic.java><execution><98>处理
2023-01-18 05:05:01.645 <INFO><WebAccessStatistic.java><execution><98>处理
2023-01-18 05:10:03.478 <ERROR><WebAccessStatistic.java><execution><444>[异常结束。
                 at com.ssh2.Connection.java:525)
                 at com.ssh2.diss.Handling.java:221)
                 at com.ssh2.middle.WebVisit.java:54)
]
2023-01-18 05:20:06.240 <ERROR><WebAccessStatistic.java><execution><672>[异常结束。
2023-01-18 05:30:07.520 <ERROR><WebAccessStatistic.java><execution><444>[异常结束。
                 at com.ssh2.Connection.java:525)
                 at com.ssh2.diss.Handling.java:221)
                 at com.ssh2.middle.WebVisit.java:54)
]

对于第1个目标,我执行:awk '{print $1,$2}' /logs/c2.log | awk '{print FILENAME,$1,$2}' > /dataAnalysis.csv
再看dataAnalysis.csv的内容如下:

- 2023-01-18 01:02:25.142
- 2023-01-18 02:02:25.142
- 2023-01-18 03:02:25.142
- 2023-01-18 04:05:01.645
- 2023-01-18 05:05:01.645
- 2023-01-18 05:10:03.478
- at com.ssh2.Connection.java:525)
- at com.ssh2.diss.Handling.java:221)
- at com.ssh2.middle.WebVisit.java:54)
- ] 
- 2023-01-18 05:20:06.240
- 2023-01-18 05:30:07.520
- at com.ssh2.Connection.java:525)
- at com.ssh2.diss.Handling.java:221)
- at com.ssh2.middle.WebVisit.java:54)
- ] 
-  

对于第2个目标,我执行:awk '!/ERROR/{print $1,$2}' /logs/c2.log | awk '{print FILENAME,$1,$2}' > /dataAnalysis.csv
再看dataAnalysis.csv的内容如下:

- 2023-01-18 01:02:25.142
- 2023-01-18 02:02:25.142
- 2023-01-18 03:02:25.142
- 2023-01-18 04:05:01.645
- 2023-01-18 05:05:01.645
- at com.ssh2.Connection.java:525)
- at com.ssh2.diss.Handling.java:221)
- at com.ssh2.middle.WebVisit.java:54)
- ] 
- at com.ssh2.Connection.java:525)
- at com.ssh2.diss.Handling.java:221)
- at com.ssh2.middle.WebVisit.java:54)
- ] 
-  

我发现对于第2个目标,执行结果中包含ERROR的行,确实被去掉了,但同时我还想去掉行首是非20xx-xx-xx开头的,命令应当怎样写呢?另外,文件名没有,开始时间我的意思是指第一行日志出现的那个时间,结束时间我的意思指的是此文件中最后出现时间的那行的那个时间(对于第一个目标,指的就是:2023-01-18 05:30:07,对于第2个目标指的就是“2023-01-18 05:05:01.645 ”的时间:2023-01-18 05:05:01。),非常感谢!

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632