紫风乱写

除了他眼前的屏幕,这个人什么也没看见。
被周围的电脑簇拥着,他只知道他所创造的现实,但又意识到那是虚幻。
他已经超越了技术。也超越了机器。
posts - 62, comments - 93, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

1. 说明

作为一个程序员我们经常要做一件事情:获取某个Log文件,从其中找出自己想要的信息。本文总结了我在工作中使用了哪些工具来分析Log文件获取我想要的信息,我最近几年的工作环境都是服务器在Linux上,工作机是Windows, 所以我用的工具主要是Linux上的一些命令行工具,当然他们在Windows上也可以用,具体看下面的工具篇。
先声明,我只是非常普通的Linux用户,所以如果有些Linux命令或者工具用的不高效,请大家教育我。

题外话:我的观点是作为一个Java程序员,只需要在自己工作所需要的范围内了解所使用的操作系统就可以了,成为专家固然好,但是不是必要的,譬如:我天天用Windows,但是始终不知道如何通过编辑组策略或者是注册表的方式调网络连接数的最大值,反正几乎所有的优化工具都有这个功能。

2. 工具

  • 连接远程Linux服务器的工具:mRemoteNG官方网站好像被墙了,可以在华军天极之类的下载
  • Windows上执行Linux命令行的工具:Cygwin或者是Git Bash
  • 如果你俩个都没有装的话,我的建议是装一个Git Bash,基本够用了,而且安装简单方便。
  • 文本编辑器: vi, 偶尔在Windows下用Notepad++
  • 因为一般情况下的Log文件都会有个几十甚至几百M,用vi直接查看比较直接,而且打开比较快。
  • 文本分析: Excel, 不过这次在家里写东西,所以我后面会尝试一下使用金山WPS 中的 WPS表格

3. 分析Log

3.1 搜索文本

分析Log首先就是找到你所需要的Log,一般情况下我们所需要的Log是这么定位的

  1. 根据异常信息或者请求信息找到对应的那一行
  2. 根据该行的时间、线程名称、关键字等信息找到上下文中相关的Log

下面我们分别说一下上面这两步应该如何做

3.1.1 找到对应的那一行,那一些文件

一般情况下我们在开始分析Log的时候会有这些信息辅助我们进行搜索

  • 出错时候的参数
  • 出错时候的异常信息
  • 时间
  • 如果什么信息都没有,就只知道出错了,那么我们可以尝试一下搜索"Error"、"Warn"、"Exception"之类的

3.1.1.1 如果知道Log是在某一个具体的文件的话

我一般是使用vi 只读模式打开该文件(假设该文件名为access.log)
vi -R access.log
进去后让它显示一下行号:
:set nu

跳到第一行:
gg
或者是
1G

跳到最后一行:
0G
或者是
G

跳到第11行:
11G

从文件头往后面搜索字符串Hello World:
:/Hello World

从文件尾往前搜索字符串Hello World:
:?Hello World

跳到下一个符合搜索条件的地方:
n

跳到上一个符合搜索条件的地方:
N

vi里面用Go的缩写字母g跳来跳去, 字母n是Next的缩写退出vi的命令是:
:q!

3.1.1.2 如果不知道是哪个文件的话

我一般是使用grep命令例子如下:把搜索结果打印到屏幕上,用空格键翻页
grep -nR "Hello World" ./*.log | more
把搜索结果打印到文件helloWorld.log中
grep -nR "Hello World" ./*.log > helloWorld.log

3.1.2 找上下文

按照上面的步骤,找到线索了,如果干扰信息不多的话,你上下浏览可以了。那么如果干扰信息较多,我一般通过综合使用以下几种方式来获取自己所需要的不带干扰信息的日志。

  • 根据该请求的线程名称、关键字来过滤出自己所需要的Log
  • 我一般使用使用上面的grep命令来做
  • 根据一个分析出来的起始和结束时间(如一个web请求的进入和结果信息的写回时间)来得到该时间段内所有的日志。
  • 我一般先使用vi打开,然后找到所需要的内容的第一行的行号和最后一行的行号,然后使用sed命令获取其中的几行。下面的这个命令的结果是把source.log中的第200行到266行的内容保存到result.log文件中。
    sed -n 200,266p source.log > result.log

3.2 日志分析

除了在Log中发现线索之外,有的时候还需要对日志进行批量的分析,我碰到过的比如分析某种错误出现的时间、出现该错误的相关的id等等。需要用到一些统计之类的东西。

3.2.1 简单情况

简单的我一般把每个场景萃取一行到一个文件中,然后使用wc(别笑,它是word count的缩写)命令来计算行数,如下所示
wc -l result.log
复杂的我一般是使用Excel或者是金山WPS来进行文件分析。

3.2.2 使用Excel或者金山WPS进行文件分析

  1. 首先是先新建一个工作表
  2. 然后把要分析的文本拷贝进去
  3. 然后反复的使用 *分列* (菜单:数据->分列)功能把日志文件拆分成一个表格
  4. 然后再使用过滤排序数据透视图等功能来进行分析

3.3 其他一些有用的命令

  • 打开一个日志文件,看着它随着系统的运行而不断的更新
tail -f abc.log
  • 同时监视多个文件的变化
tail -f ./*.log
  • 看一个文件开头的20行
head -20 abc.log
  • 看一个文件结尾的50行
tail -50 abc.log

评论

# re: Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log  回复  更多评论   

2014-09-19 11:12 by willie
我一般把日志文件拷贝到本机,然后用notepad++开始找,哇哈哈哈哈。

# re: Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log  回复  更多评论   

2014-09-20 18:35 by Justfly Shi
@willie
如果文件比较大的时候, 拷贝到本地会很慢,用notepad++打开也会很慢,甚至打不开。

# re: Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log  回复  更多评论   

2014-09-25 11:32 by 李金龙
这是在干啥、、、、

# re: Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log  回复  更多评论   

2014-09-25 11:33 by 李金龙
<a></a>

# re: Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log  回复  更多评论   

2014-10-27 11:40 by 网购商城
不错,感谢博主的分享

# re: Java程序员修炼之道 之 Logging(3/3) - 怎么分析Log[未登录]  回复  更多评论   

2015-05-12 13:08 by robin
难得的好文。实用,干练。

只有注册用户登录后才能发表评论。


网站导航: