2013-01-31 3 views
6

여러 원본 (원본 당 하나의 파일)에서 일반 텍스트 형식의 로그를 기록하는 서비스를 구축 중입니다. 나는이 로그를 영원히 돌아야하므로 회전 시키려고하지 않습니다.파이썬에서 gzip으로 압축 된 로그 파일을 추가로 작성하기

파일을 영원히 작게 만들려면 작게 파일을 gzip으로 만들 수 있기를 바랍니다. 로그 데이터이므로 파일은 매우 잘 압축됩니다.

파이썬에서 추가 전용 gzipped 텍스트 파일을 작성하는 좋은 방법은 무엇입니까? 서비스가 켜지고 꺼질 때 쓰기가 다시 시작될 수 있도록하려면 어떻게해야합니까? 몇 줄을 잃어 버릴 까봐 걱정하지 않지만 gzip 컨테이너 자체가 고장 나면 파일을 읽을 수 없게됩니다.

또한 별다른 문제가없는 경우 gzip을 사용하지 않고 일반 텍스트로 작성할 수 있습니다.

+1

로그를 회전시키지 않으려는 경우에도 출력을 중단하고 잠시 동안 새 파일을 시작하지 마십시오. 그런 다음 파일이 끝나면 gzip을 실행할 수 있습니다. –

+1

@ DavidZaslavsky의 대답은 전통적인 해결책입니다. 그것은 오래된 로그를 교체하는 부분입니다. 단, 이전 파일을 지우는 부분은 제외해야합니다. – abarnert

답변

8

참고 :

당신은 설정할 수 있습니다

  • logrotate (회전, 압축 및 메일 시스템 로그) : 유닉스 시스템에서는 심각하게 정확한 작업을 위해 작성된 외부 프로그램을 사용하는 것이 좋습니다 회전 수가이므로 첫 번째 파일이 in 100 years 정도 삭제됩니다.

    파이썬 2에서

    , logging.FileHandlerbz2 또는 zlib로 설정 할 수있는 키워드 인수 encoding 걸립니다.

    그 이유 logginguses 차례로 bz2을 대하는 codecs 모듈 (또는 zlib) 인코딩 등 :

    >>> import codecs 
    >>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2") as fh: 
    ...  fh.write("Hello World\n") 
    
    $ bzcat on-the-fly-compressed.txt.bz2 
    Hello World 
    

    파이썬 3 버전 (비록 워드 프로세서 별칭으로 mentionbz2, 당신 실제로는 bz2_codec - 적어도 w/3.2.3을 사용해야 함) :

    >>> import codecs 
    >>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2_codec") as fh: 
    ...  fh.write(b"Hello World\n") 
    
    $ bzcat on-the-fly-compressed.txt.bz2 
    Hello World 
    
+2

이 목적을 위해'logrotate '를 사용하는 방법을 설명하는 링크에 +1. (글쎄, 이미 파이썬에서 그것을하는 법을 설명하기 위해 +1을 주었다는 것을 제외하고). – abarnert

+1

옳은 일이라고 생각하기 때문에 logrotate를 옮겼다. – miku

관련 문제