linux日志信息查询技巧(日常记录)

1、grep语句的简单应用

  当我们筛选日志文件中含有某个关键字的的时候,可以使用以下的格式对日志文件内容进行筛选:

grep ‘关键字’ 日志文件路径 如:grep ‘key’ /data/logs/info.log

 如果想再进一步筛选另一个关键字,即包含关键字1且包含关键字2时,就可以采用管道的方式,在关键字1的筛选结果上继续筛选关键字2

grep ‘key1’ info.log | grep ‘key2’

 如果知道一个关键字,想获取这个关键字的上下文信息的时候,就可以使用 -C、-A、-B 等命令来进行筛选

grep ‘key’ error.log -C 1
多显示筛选到行前面1行和后面一行

grep ‘key’ error.log -A 1
多显示后面1行

grep ‘key’ error.log -B 1
多显示后面1行

 如果只想显示筛选结果中的某个关键字,则可以使用**-o**进行筛选,如:

grep -o ‘key1’ info.log
只显示key1这个关键字

grep ‘key1’ | grep -o ‘key2’
在key1筛选结果中筛选key2并只显示key2

 关键字是支持正则表达式的,如果想进行模糊匹配。可以使用 .* 实现,如:

grep ‘.*key1.*’ info.log

  日志的筛选结果是可以输出为文件的,比如:

grep ‘key’ info.log > 1.txt
把所有包含关键字key的行输出到1.txt这个文件中

2、异常堆栈信息折叠,如何查询

1、背景

 今天项目由于数据异常,出现了大量NullPointerException。查询日志发现只有异常类型信息,没有任何的堆栈信息,这是因为JVM对一部分异常做了优化,如果同一异常短时间内大量抛出,那么就会省略掉后续异常的堆栈信息,只保留异常类型,以此来优化性能。离当前较近的异常没有堆栈信息,只能查询最开始的日志来确定发生错误的代码位置,这比较麻烦,这次总结了一个思路如下,可根据实际情况灵活扩展。

2、查询异常第一次发生时的堆栈信息

(1)先说结论:

grep '关键词1' error.log -A 60 | grep '关键词2' -A 60 | head -n 60

(2)原理
 本次异常时由前端请求接口触发,而项目会使用过滤器对所有接口进行异常捕捉(try…catch),出现异常时,先打印接口urli再打印异常信息。格式为 reqUrl error—{ip}{uri} {异常信息},示例如下:

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String uri = req.getRequestURI();
        String ip = servletRequest.getRemoteAddr();
        try {
            filterChain.doFilter(servletRequest, servletResponse);
        }catch (Exception e) {
            log.error("reqUrl error------{}{}", ip, uri, e);
        }

    }

 根据上面的日志格式,可以提取到的关键字有 reqUrl error 和 uri,套用上面的查询语句,我们首先可以确认关键词1是uri,用于排除掉其他接口的报错,再使用-A n 获取报错的后续信息,而如果堆栈信息没被折叠,那么堆栈信息就会被该语句查询出来:(uri用大括号圈起来表示是一个变量,根据实际接口uri输入)

grep '{uri}' -A 60 error.log

 接着确定关键词2,关键词2的作用是帮助我们排除掉日志文件中其余包含uri,但是又非接口访问的日志信息,因此可以将其定为接口发生异常时的特有信息reqUrl error,第二次筛选同样也使用了 -A n 避免堆栈信息被筛选掉

grep '{uri}' -A 60 error.log | grep 'reqUrl error' -A 60

 最后是重点,需要获取最开始的异常,head -n x 帮助我们做到这一点。它的作用是将查询结果中前x行输出,所以完整的查询语句如下:

grep '{uri}' -A 60 | grep 'reqUrl error' -A 60 | head -n 60

 当然,也可以使用正则表达式来优化这个查询过程:

grep 'reqUrl error.*{uri}' -A 60 error.log | head -n 60

(3)题外话:如何关闭jvm异常堆栈折叠
 可设置JVM参数:-XX:-OmitStackTraceInFastThrow 来关闭折叠。通常我们的服务会运行在linux系统中以start.sh脚本文件启动,将其写入脚本即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值