今天在微博看到这个命令tail -F some.log | perl -ne 'print time(), "\n";' | uniq -c
意思应该是想通过每秒打印的时间是相同的从而能够看到各个时间戳的请求数。
但是实际并不好用。除非是cat
才好使,但是那样效率太低了吧。
有什么好的办法呢?
今天在微博看到这个命令tail -F some.log | perl -ne 'print time(), "\n";' | uniq -c
意思应该是想通过每秒打印的时间是相同的从而能够看到各个时间戳的请求数。
但是实际并不好用。除非是cat
才好使,但是那样效率太低了吧。
有什么好的办法呢?
用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
如果只想统计一下新增行数,可以尝试一下watch命令,watch 'tail -f some.log|wc -l'