로그 파일을 일종의 순환 버퍼로 바꾸기


22

여러분, 로그 파일을 순환 버퍼로 작동시키는 * nix 솔루션이 있습니까? 예를 들어, 최대 1Gb의 데이터를 저장하고 한도에 도달하면 이전 항목을 삭제하기 위해 로그 파일을 원합니다.

전혀 가능합니까? 로그 파일을 일종의 특수 장치로 바꿔야한다고 생각합니다 ...

추신 : 나는 기타 회전 도구를 알고 있지만 이것이 필요한 것은 아닙니다. 로그 회전에는 많은 IO가 필요합니다. 일반적으로 "런타임"솔루션이 필요한 동안 하루에 한 번 발생합니다.


3
왜 로그 회전에 많은 IO가 필요한지 잘 모르겠습니다. 10 개의 로그 파일을 회전시키는 것은 10 개의 이름 바꾸기 작업과 서비스의 HUP입니다. 정확히 살인이 아닙니다 ... 그리고 그것은 당신의 문제에 대한 표준 해결책입니다 :)
pehrs

2
HUP와 잘 작동하지 않는 스크립트 / 실행 파일을 실행 중일 수 있습니다.
Scott

1
이것은 귀하의 질문에 대한 또 다른 유스 케이스를 제공하기위한 것입니다. 악마 음악 플레이어가 있습니다. 나는 단지 몇 줄의 길이의 로그를 원하므로 무엇을 재생하고 있는지, 그 전에 무엇을했는지 알 수 있습니다. A tail -f somefile는 그렇게 할 것입니다. 방금 회전 된 로그로 시도했지만 그와 tail -f작동하지 않습니다.
Vorac 2018 년

답변:


14

리눅스는 커널 링 버퍼를 가지고있다. 당신은 사용 dmesg하기 를 표시 .

또는 여기 원하는대로하는 Linux 커널 모듈이 있습니다.

emlog 란 무엇입니까?

emlog는 프로세스에서 가장 최근 (그리고 가장 최근의) 출력에 쉽게 액세스 할 수있는 Linux 커널 모듈입니다. 필요한 스토리지가 커지지 않는 것을 제외하고는 로그 파일에서 "tail -f"와 동일하게 작동합니다. 이는 완전한 로그 파일을 보관하기에 충분한 메모리 나 디스크 공간이없는 내장 시스템에서 유용 할 수 있지만 가장 최근의 디버깅 메시지가 필요한 경우가 있습니다 (예 : 오류가 관찰 된 후).

emlog 커널 모듈은 간단한 문자 장치 드라이버를 구현합니다. 드라이버는 유한 원형 버퍼가있는 명명 된 파이프처럼 작동합니다. 버퍼의 크기는 쉽게 구성 할 수 있습니다. 더 많은 데이터가 버퍼에 기록되면 가장 오래된 데이터는 삭제됩니다. emlog 장치에서 읽는 프로세스는 먼저 기존 버퍼를 읽은 다음 "tail -f"를 사용하여 로그 파일을 모니터링하는 것과 비슷하게 새 텍스트를 씁니다. (프로세스가 새 데이터를 기다리지 않도록 차단하지 않고 로그의 현재 내용을 가져와야하는 경우 비 차단 읽기도 지원됩니다.)


1
링크 주셔서 감사합니다! BTW, emlog 홈 페이지에는 ulogbufd에 대한 링크가 있습니다.
pachanga

emlog 커널 모듈은 이제 GitHub의에서 유지 관리됩니다 : github.com/nicupavel/emlog
dbernard

4

내가 생각할 수있는 가장 가까운 것은 RRDTools이지만 아마도 당신이 찾고있는 것이 아닐 것입니다. 또 다른 해결책은 로그 파일을 모니터링하는 것입니다 (예를 들어 매 초마다 또는 inotify로 Linux에서). 예를 들어 다음과 같은 스크립트를 작성하십시오.

while :; do
  if [[ $(stat -c %s $FILE) -gt 10000 ]]; then
    # rotate the log
  fi
  sleep 1
done

inotify와 함께 :

while :; do
  if inotifywait [some options] $FILE; then
    # check size and rotate the file
  fi
done

링 데이터 구조 로깅의 실제 예인 RRDtool을 언급하면 ​​+1입니다.
Cory J

inotifywait 쉘 명령 사용법을 보여주는 예를 들어 주셔서 감사합니다.
pachanga

4

당신은 사용할 수 있습니다 MultiLog를 DJB의 데몬 툴즈에서. 로그 출력 파이프로 파이프합니다 . 예, 로그 회전이지만 회전은 간단합니다.

ln current $tai64nlocaltimestamp

현대 리눅스 파일 시스템은 매우 빠른 작업입니다. 원하는 로그 파일 수, 원하는 크기를 지정할 수 있습니다. 10 x 1024mb 파일을 만들면 1GB 링 버퍼가 생깁니다.

자동 회전으로 인해 멀티 로그 인스턴스 당 하나의 소스입니다. 그러나 netcat 또는 손으로 간단한 래퍼를 작성하여 문제를 해결할 수 있습니다.


팁 고마워! 나는 분명히 멀티 로그도 가질 것입니다.
pachanga

1

FIFO 파이프를 만든 다음 데이터베이스에 삽입하는 스크립트를 사용하여 FIFO 파이프를 읽을 수 있습니다. 카운터가 1,000에 도달하면 데이터베이스에 삽입되는 ID 번호를 다시 시작하십시오. 물론 규모에 따라 작동하지는 않지만 예제로 사용 했으므로 이것이 이론적 인 질문이라고 가정합니다.


1

흥미로운 질문; 당신은 보통 그것을 디자인으로 보지 않습니다. 희미하게 유사한 기술을 사용하여 기록을 기록하는 프로그램이 있지만 이진 형식을 사용합니다. '로그 파일'에는 네 가지 부분이 있으며 모두 기계 중립 형식으로 배치됩니다.

  1. 사용 된 목록 및 비어있는 목록의 매직 번호 및 (최대) 항목 수, 다음 히스토리 항목의 순서 번호, 사용 된 목록의 실제 항목 수, 사용 가능한 목록의 실제 항목 수를 포함하는 헤더 , 파일 길이 (각각 4 바이트)입니다.
  2. 사용 된 목록, 각 항목은 오프셋과 길이 (각 항목의 각 부분에 대해 4 바이트)를 제공합니다.
  3. 사용 가능한 목록, 각 항목은 사용 된 목록 항목과 유사합니다.
  4. 메인 데이터, 각 히스토리 레코드는 널 종결 자 바이트로 종료 된 연속적인 바이트 세트로 구성됩니다.

새 레코드가 할당 될 때 사용 가능 목록에 공간이 있으면 해당 항목을 덮어 씁니다 (모두 사용하지 않아도 됨-이 경우 조각이 사용 가능 목록에 남아 있음). 사용 가능 목록에 공간이 없으면 끝에 새 공간이 할당됩니다. 오래된 레코드가 회전하면 해당 공간이 사용 가능한 목록으로 이동하고 인접한 사용 가능한 레코드와 통합됩니다. 레코드를 여러 행으로 분산시킬 수 있도록 SQL 문을 처리하도록 설계되었습니다. 이 코드는 지정된 수의 레코드에서 작동합니다. 파일 자체의 크기를 제한하지는 않습니다 (그러나 그렇게하기는 어렵지 않습니다).

주요 코드 히스토리 코드는 history.c와 history.h라는 두 개의 파일에 있으며, SQLCMD 프로그램 (Microsoft가 아닌 내 버전, Microsoft보다 10 년 이상 전에 존재 했음)의 소스에서 다운로드 할 수 있습니다. International Informix 사용자 그룹의 소프트웨어 아카이브 . 히스토리 파일 덤프 프로그램 (histdump.c)과 히스토리 테스터 (histtest.ec-ESQL / C라고 주장하지만 실제로는 C 코드 임)가 호출하는 지원 함수 중 하나는 일부 Informix ESQL / C를 사용합니다. 라이브러리 기능). Informix ESQL / C를 사용하지 않고 실험하고 싶다면 저에게 연락하십시오-내 프로파일을 참조하십시오. 디자인 환경 밖에서 histtest를 컴파일하기 위해 몇 가지 사소한 변경 사항이 있으며 makefile이 필요합니다.


0

귀하의 질문에 대한 pehrs의 의견에 동의합니다. 로그 회전은 그렇게 어렵지 않습니다. 원하는 경우 매 분마다 로그 파일을 정기적으로 확인하도록 logrotate 또는 다른 스크립트를 설정할 수 있습니다. 파일 크기가 1GB에 도달하면 단순히 이름 바꾸기를 수행하므로 I / O가 필요하지 않습니다. 이름을 바꾸는 동안 프로세스는 계속 로그 파일을 작성합니다. 그런 다음 로그 로테이터는 HUP를 syslog 데몬에 보낼 수 있습니다 (데몬 syslog를 통해 로깅하고 있습니까? . 이 시점에서 원래 경로의 새 파일에 쓰기 시작하고 회전 된 버전을 삭제할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.