2016-06-05 5 views
3

로그 파일 (내 경우 nginx access.log)을 역순으로 처리하려면 어떻게합니까?라인을 역순으로 처리하십시오.

나는 로그 파일 분석기 스크립트를 개발하고 내가 그래서 시간을 정렬 할 수 있습니다 끝에서 큰 로그 파일을 처리하는 방법에 대한 주위에 내 머리를 얻을 단지 수 없습니다입니다 배경 최신 날짜로 시작 프레임 나는 필요하다.

+0

당신이 "큰"정의 할 수 있습니다

코드에서 참조? 몇 메가 바이트는 사소한 것입니다. 몇 기가 바이트는 없습니다. (아마도 그것들을 나누는 것이 좋을지도 모르지만) – spectras

+0

다음 아이디어는'f.tell()'을 사용하여 마지막으로 알려진 위치를 저장합니다. 마지막으로 알려 지거나 보이는 위치 인 – MaxU

+0

으로 이동하려면'seek()'을 사용하십시오. http://code.activestate.com/recipes/276149/, http : // code. activestate.com/recipes/120686/ – MaxU

답변

0

한 가지 방법은 seek을 사용하여 파일의 끝 부분에 액세스 한 다음 거기에서 반대로 파일을 검색하는 것입니다. 예 : 이것은 당신에게 당신의 access.log의 파일의 마지막 100 줄을 줄 것

Tail('/etc/httpd/logs/access.log', 100) 

def Tail(filepath, nol=10, read_size=1024): 
    """ 
    This function returns the last line of a file. 
    Args: 
    filepath: path to file 
    nol: number of lines to print 
    read_size: data is read in chunks of this size (optional, default=1024) 
    Raises: 
    IOError if file cannot be processed. 
    """ 
    f = open(filepath, 'rU') # U is to open it with Universal newline support 
    offset = read_size 
    f.seek(0, 2) 
    file_size = f.tell() 
    while 1: 
    if file_size < offset: 
     offset = file_size 
    f.seek(-1*offset, 2) 
    read_str = f.read(offset) 
    # Remove newline at the end 
    if read_str[offset - 1] == '\n': 
     read_str = read_str[:-1] 
    lines = read_str.split('\n') 
    if len(lines) >= nol: # Got nol lines 
     return "\n".join(lines[-nol:]) 
    if offset == file_size: # Reached the beginning 
     return read_str 
    offset += read_size 
    f.close() 

그런 다음 사용합니다. http://www.manugarg.com/2007/04/real-tailing-in-python.html