Linux 日志文件处理

目标

通过分析 error.log 日志,统计出有哪些异常及其数量

分析

首先要看下异常日志的格式

2017-07-19 01:03:41,399 ERROR [qtp738355611-33898] [com.meizu.apkfilemanage.web.AppInfoController] - appUpdate:
java.lang.NumberFormatException: !hex 215
        at org.eclipse.jetty.util.TypeUtil.convertHexDigit(TypeUtil.java:375)
        at org.eclipse.jetty.util.UrlEncoded.decodeUtf8To(UrlEncoded.java:545)
        at org.eclipse.jetty.util.UrlEncoded.decodeTo(UrlEncoded.java:601)
        at org.eclipse.jetty.server.Request.extractParameters(Request.java:298)
        at org.eclipse.jetty.server.Request.getParameter(Request.java:708)
        at com.meizu.apkfilemanage.common.util.BuildBeanUtil.buildAppUpdate(BuildBeanUtil.java:905)
        at com.meizu.apkfilemanage.web.AppInfoController.appUpdate(AppInfoController.java:204)
        at sun.reflect.GeneratedMethodAccessor132.invoke(Unknown Source)

经过分析,发现每次打印异常的格式如下

  • 第一行

    • 时间,日志级别,线程信息,类,异常消息(业务)

  • 第二行及后续

    • 异常堆栈信息,其中第二行是异常的类名及异常消息

那么我们的思路是

  • 找到有第三个域为 ERROR 的那一行

  • 该行的下一行就是我们需要统计分析的那一行

命令

命令执行结果如下

zcat

和 cat 命令类似,不过作用的对象是压缩文件

|

这是 linux 管道符,他的作用是把管道符左边命令的输出当作管道符右边命令的输入,示例

awk

这个命令很复杂,这里解释一下前面统计异常数量的命令

我们知道,awk 命令会对输入的文本逐行进行处理,类似以下的处理过程

那么上面的命令就可以这样理解

这段代码的作用就是找到含有 ERROR 的行,并将其下一行打印输出

sort

以行为单位对文本进行排序

uniq

删除重复的行,参数

  • -c 在输出行前面加上每行在输入文件中出现的次数。

  • -d 仅显示重复行。

  • -u 仅显示不重复的行

一些常用的 awk 命令

分析 nginx 的日志文件

统计各个接口的 pv

统计慢接口

响应时间超过 1 秒的接口数

如果想要输出具体是哪些接口,可以结合上面命令

如果要分时段统计

统计响应码

Last updated