如何实时查看日志文件新增的行数

今天在微博看到这个命令
tail -F some.log | perl -ne 'print time(), "\n";' | uniq -c
意思应该是想通过每秒打印的时间是相同的从而能够看到各个时间戳的请求数。
但是实际并不好用。除非是cat才好使,但是那样效率太低了吧。

有什么好的办法呢?

阅读 10.3k
5 个回答

如果只想统计一下新增行数,可以尝试一下watch命令,watch 'tail -f some.log|wc -l'

用python观察文件:

#-------- track_file.py --------#
import os

def track_file(path, callback):
    """ takes file `path` string and `callback` function.
        `callback` called for every line written to file:
        callback(path, line)
    """
    temp_path = "." + path
    os.rename(path, temp_path)
    try:
        os.mkfifo(path)
        pipe = open(path)
        origin = open(temp_path, "a")
        while 1:
            line = pipe.readline()
            if not len(line): break
            callback(path, line)
            origin.write(line)
    finally:
        try:
            os.remove(path)
        except OSError: pass
        os.rename(temp_path, path)

def do_something(path, line):
    # 比如说,打印到标准错误
    import sys
    print >>sys.stderr, "callback:", line

if __name__ == '__main__':
    track_file("my_data.log", do_something)
ng)

可以很容易地扩展这个观察器的使用范围。例如,启动os.system(任何命令),或者统计写日记速率:lines_dict[current_seconds] = lines_dict.get(current_seconds, 0) + 1

cat /var/log/nginx/all/access.log | grep '2015-05-14' | wc -l

tail -f /tmp/out.log | awk 'BEGIN{i=0}{i++;print i}'

汗,现在的Linux程序员都这么懒么...

日志一定要入库啊,再不济搞个mysql也行啊,最后select count where time....

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏