리눅스 : 로그 파일의 새 줄을 원격 syslog에 보내는 방법?


8

자체 일반 텍스트 로그 파일을 생성하는 여러 응용 프로그램이 있으며 중앙 로깅을 위해 원격 syslog 서버로 전달하고 싶습니다. root이 컴퓨터에서 액세스 할 수 없으며 syslog원격 컴퓨터로 출력을 리디렉션하도록 재구성 할 수도 없습니다 .

온라인에서 몇 가지 솔루션을 찾았지만 주로 사람들이 만든 수제 bash 스크립트이며 잠재적으로 대량 생산 환경에서 구현하기에 더 견고한 것을 찾고 있습니다.

가급적 작은 풋 프린트, 계속 실행되는 백그라운드 데몬, 많은 라인을 유지할 수있는 백그라운드 데몬을 염두에두고 설계된 것이 좋습니다.-현재 어떤 솔루션을 사용할 수 있습니까?


3
rsyslog 의 텍스트 파일 입력 모듈 을 보셨습니까?
yoonix

@yoonix : 아니요, 안하겠습니다 :)
Michael Martinez

3
음, syslog는 원격 syslog 서버로 보낼 수 있습니다. 로컬 syslog를 구성하여 원격 서버로 보내십시오. 그런 다음 표준 syslog 호출 또는 로거 등을 사용하여 로컬 syslog에 액세스하십시오.
Zoredache

4
왜 명명 된 파이프에 로그 파일을 작성하고 자신의 방식에 보냅니다 데몬 청취가없는 serverfault.com/questions/189477/...
user9517

3
앱을 작성하는 로그 파일과 이름이 같은 명명 된 파이프를 배치하기 만하면 앱을 수정할 필요가 없습니다.
user9517

답변:


13

이미 "다른 사람들의 bash 스크립트"를 거부했지만 이것은 매우 일반적인 해결책 입니다. logger명령을 창의적으로 사용 하면 파일을 따라 다른 곳으로 내용을 보낼 수 있습니다.
나는 개인적으로 프로덕션 환경에서 이것을하지 않을 것입니다.


적은 스크립트 해커를 필요로하는 더 나은 옵션을 사용 rsyslogd하여 텍스트 파일 입력 모듈 과 같은 yoonix 언급 - 파일 회전시 손실 라인에 대한 몇 가지 가능성이 있지만 이것은 꽤 괜찮은 솔루션입니다, 당신은있는 리눅스 시스템에 있다면 rsyslogsyslog 데몬으로 많은 추가 작업이 필요하지 않습니다.

syslog-ng의 기능과 유사한 기능을 가진 파일 입력 소스 도 지원 합니다rsyslog .


이 로그를 생성하는 응용 프로그램을 수정해야하지만 최상의 솔루션 인 IMHO는 syslog에 직접 로그인하는 것입니다. 당신은 등의 중간 단계, 파일을 겪고 싶지 않아 - syslog시스템 로거이며, 유닉스 플랫폼에서 쓰기 로그 것들 한다 그들을 syslog로 전송 될 수있다.
불행히도이 구현은 독자 (및 응용 프로그램 개발자)의 연습으로 남겨두고 개발자가 없거나 게 으르거나 무능한 경우에는 불가능할 수 있습니다.


7
@MichaelMartinez rsyslog현재 시스템에서 실행중인 구성 을 수정합니다 . 당신은해야 하지 두 시스템 로그 데몬을 실행한다. 무례하지는 않지만 잘못 시도하지 말아야합니다. * :이 시나리오에 대한 모든 적절한 솔루션에는 서버에 대한 관리 (루트) 작업 또는 앱 수정이 필요합니다. 당신은 그렇지 않으면이 질문은, 조직 내에서 어떤 그룹과 현실과 거래는 해당 시스템의 루트를 가지고 얼굴을 할거야 입니다 .... (조직의 정책을 우회하려는) 주제 오프
voretaq7을

5
@Michael 이것은 우리에게 누군가가 잘못된 팀이 수정을 구현하도록 강요하고 있다는 것을 말해줍니다.
Andrew B

4
@MichaelMartinez imho, 그것은 기술적 부채의 수준을 무너 뜨리는 꽤 빠른 경로처럼 들립니다.
Sirex

2
@Sirex. 그것이 무엇인지, 그것은 일의 방식입니다. 저는 수만 명의 직원을 고용하는 조직에서 일하고 있으며 대부분은 기술 (엔지니어, 개발자, 작전 등)입니다.
Michael Martinez

5
나는 추측한다. 일반적으로 나는 자립 전투에서 승리하는 데 메달이 없다는 것을 오랫동안 발견했습니다. 기술적 빚이 그것이 비즈니스에 영향을 줄 때, 아이러니하게도 방에있는 코끼리를 피하기 위해 열심히 노력한 사람들은 내 경험에 따라 캔을 들고 다니는 경향이 있습니다. 그래서 나는 당신의 엉덩이를 덮고 누군가가 이것의 단점을 서면으로 동의하도록 말하고 싶습니다.
Sirex

6

파일 입력 및 syslog 출력 과 함께 logstash 를 사용할 수 있습니다 .

예를 들어, 모니터링하려는 파일 또는 syslog 서버 정보로 구성을 작성하십시오.

file-to-syslog.conf :

input { file { path => "/var/log/kern.log" } }
output {
    syslog {
        facility => "kernel"
        host => "syslog.example.com"
        port => 514
        severity => "informational"
    }
}

로 시작하는 logstash

java -jar logstash-1.2.2-flatjar.jar agent -f file-to-syslog.conf

+1. rsyslog의 파일 입력을 사용하는 것이 옵션이 아닌 경우 logstash가 다음으로 가장 좋습니다. 여러면에서 장기적으로 더 좋습니다.
Sirex

나는 이것에 익숙하지 않다. 내가 필요한 일을하면 coreutils와 util-linux를 해킹하는 문제를 덜 수 있었을 것입니다.
Michael Martinez

예, 설정은 다음과 같습니다 : pastebin.com/xeC9hxD3
Sirex

매우 멋진 도구처럼 보이지만 여기에 필요한 것에 대해서는 지나치게 과잉입니다. logstash는 웹 인터페이스가있는 자체 서비스이며 java 등이 필요합니다. 가볍고 작은 설치 공간이며 성능에 최적화 된 파일 로거를 계속 사용합니다. ...하지만 앞으로 다른 상황에서 필요로 할 수 있기 때문에 logstash를 제안 해 주셔서 감사합니다!
Michael Martinez

그래, 항아리에 포장 된 jruby 도구. gui는 실제로 kibana로 쉽게 패키지화되어 있지만 실제로는 별도의 프로젝트이므로 메시지를 구문 분석하는 데 필요하지 않습니다. 기본적으로 스위스 군용 칼입니다. 입력과 출력을 정의하고 중간에 선택적으로 로그를 가져 와서 컨텍스트를 제공 할 수 있습니다. -로그 데이터에 elasticsearch를 사용하지 않는 한 IT 부서에 무리가있을 수 있습니다.
Sirex

4

나는 함께 해킹 tail.clogger.c빠르고 안정적 경량 하나의 작은 풋 프린트 컴파일 된 프로그램 (바이너리)로. 로그 파일에 대한 읽기 액세스 권한이 있으면 루트 권한이 없어도 작동합니다.

또한 원시 로거를 몇 가지 개선하고 로그 서버로 보내기 전에 각 로그 줄의 시작 부분에 텍스트 문자열을 삽입하는 새로운 (선택 사항) 기능을 추가했습니다. 결과적으로 쉘 파이프를 사용할 필요없이 자체적으로 실행할 수있는 프로그램이 만들어집니다 (예 : 필요 없음 tail logfile | logger). 명시 적으로 종료되거나 네트워크 소켓에 쓰는 동안 오류가 발생할 때까지 영구적으로 실행됩니다. 로그 파일이 회전하거나 사라져도 계속 실행됩니다 (파일이 다시 나타나는지 계속 확인합니다).

사용하기 쉽습니다. 모니터링 할 하나 이상의 로그 파일을 제공하면 파일에 새 줄을 쓸 때마다 해당 줄의 사본을 지정한 로컬 또는 원격 syslog 서버로 보냅니다. 해당 옵션을 사용하는 경우 추가 텍스트 문자열이 추가됩니다.

나는 실제로 프로그램을 12 월에 다시 마치지만 야후가 저작권을 가지고 그것을 이용할 수있게되기를 기다리고 있었다. (저는 Yahoo에서 제 업무의 일부로 썼습니다).

파일 로거 프로그램 정보 및 다운로드 링크 :


@slm : 요청하신대로 다시 작성
Michael Martinez

매우 감사합니다. Michael. 데비안 apt-get 설치를 위해 패키지 할 수 있습니까?
joelparkerhenderson

@JoyparkerHenderson. 안녕 조엘. 불행히도, 아마도 데비안으로 작업하지 않기 때문에 아마도 아닙니다. 바이너리를 시스템에 복사하고 실행되는지 확인 했습니까?
Michael Martinez

1

이를 해결하는 방법에는 여러 가지가 있습니다. 그러나 가장 먼저해야 할 일은 syslog 자체를 사용하여 로그를 전달하는 입니다.

Syslog (및 많은 syslog 대체품)에는 다른 주소의 다른 syslog 서버에 로깅을 전달하는 기능이 내장되어 있습니다. 구성 파일을 변경하고 기능을 전달할 주소를 추가하여 쉽게 수행 할 수 있습니다. 예를 들어,이 행을 다음에 추가하십시오.

*.*    @192.168.1.1

... 모든 시설을 192.168.1.1로 기계에 전달 하면 서비스가 실행됩니다. 여기에 제공하는 예는 데비안의 syslog 서버 인 rsyslog에 대한 것이지만 다른 많은 경우에는 작동합니다. syslog 구현에 대한 문서를 man syslog참조하고 "전달"에 대한 내용을 참조하십시오.

원격 syslog 서버는 원하는 것이 될 수 있습니다. Splunk 와 같은 제품도 웹 대시 보드, 검색, 이벤트 중심 알림 등을 사용하여 이러한 로그를 단일보기로 집계합니다. http://www.splunk.com/ If 필요에 맞지 않으면 다른 것을 사용할 수 있습니다. SQL 데이터베이스에 덤프 할 syslog 서버도 있습니다!

물론,이를 위해 스크립트 / 프로그램 / 서비스를 직접 작성할 수는 있지만 휠이 이미 완료되어 이미 제공되었을 때 바퀴를 다시 발명해야하는 이유는 무엇입니까?


편집 : 그래서 돌아가서 질문을 다시 읽고 몇 가지 의견을 보았습니다. 처럼 들린다:

  1. 응용 프로그램 로그를 집계하려는 경우
  2. 당신은 루트에 액세스 할 수 없습니다
  3. 응용 프로그램이 어딘가에 텍스트를 덤프합니다.
  4. 응용 프로그램이 로컬 syslog에 쓰는 방법을 모른다
  5. 응용 프로그램 소스 코드를 제어 할 수 없습니다

따라서 순서대로 각 주소를 살펴 보겠습니다.

  1. syslog는 로그를 함께 집계하기위한 것입니다. 원하는 것을 사용할 수 있지만 오랫동안 주변에 있었던 이유가 있습니다. 그것은 잘 테스트되고, 논쟁이 잘되고, 잘 문서화되고, 잘 알려져 있으며, 대부분의 * nix 플랫폼에 대해 거의 모든 풍미에서 거의 보편적으로 지원됩니다.
  2. root로깅을 설정하기 위해 액세스 할 필요는 없습니다 . syslog API에만 액세스하면됩니다. rootsyslog에 쓸 필요는 없습니다. 이 경우 권한을 삭제하는 모든 서비스가 진단을 로그 파일에 쓸 수 없습니다.
  3. 다시 : 텍스트 덤프, 이것은 정상입니다. 그러나 서브 쉘을 사용하여 STDERR 및 STDOUT의 출력을 syslog API를 호출하는 프로그램으로 파이프 할 수 있어야합니다. 이것은 로켓 과학이 아니며 취하기 쉽지 않으며 문서화가 잘되어 있습니다. 실제로 출력 리디렉션이 존재하는 이유 중 하나입니다. 단일 셸 스크립트로 던질 수있는 간단한 명령은 다음과 같습니다.

    (내 응용 프로그램 2> & 1 | my-syslog-shunt) &

  4. 응용 프로그램의 소스 코드를 변경할 수있는 경우, 션트를 작성하여 일반 텍스트 파일 대신 syslog에 텍스트 출력을 덤프해야합니다. 너무 어렵지 않아야합니다. 당신이 할 일은 당신이 출력 할 라인을 가져 와서 전화로 감싸는 것입니다. 하나....

  5. 소스 코드에 전혀 액세스하지 못할 수 있으므로이 작업을 수행 할 수 없습니다. 위의 # 3과 같은 것이 잘 작동한다는 것을 의미합니다.


두 가지 이유 : (1) 단순히 이미 언급했듯이 문제의 상자에 루트 또는 sudo가 없었기 때문입니다. (2) "로거"자체는 원격 서버로 전달할 수 있지만 로그 라인 당 400 자로 제한되며 Apache 로그에는 적합하지 않습니다. 어쨌든, 나는 이미 내가 원하는 것을 정확하게 수행하고 "로거"를 향상시키는 맞춤형 솔루션을 이미 모았습니다. "filelogger"에 대한 내 답변을 보려면 여기를 클릭하십시오
Michael Martinez

4. Syslog는 텍스트를 열고 쓸 수있는 파일 스트림이 아닙니다. 내가 작성한 션트는 syslog가 청취하는 UDP 포트에 소켓을 열어야합니까?
Noumenon

1
@ Noumenon, 나는 당신의 의도에 대해 완전히 명확하지는 않지만, 프로그램 출력을 시스템 로그에 파이프하고 싶다고 가정합니다.이 명령은 logger 명령으로 수행 할 수 있습니다. linux.die.net/man/1/logger
Avery Payne

@AveryPayne 좋아요 Runtime.exec("logger ...") 감사합니다.
Noumenon

0

나는 내 자신의 질문에 대답하고 있습니다.

견본이 작동했지만 호스트에서 작동하는 perl의 Sys :: Syslog 모듈을 얻을 수 없었으며 호스트에 설치된 / usr / bin / logger가 원격 서버에 대한 로깅을 지원하지 않습니다 (util-linux-ng- 2.17.2).

그래서 내가 한 첫 번째 일은 로거 프로그램이 원격 로깅을 지원하는 util-linux-2.20.1의 소스 코드를 다운로드하는 것이 었습니다. 테스트 결과 로그 라인에 허용되는 문자 수에 제한이 있음이 분명해졌습니다. 소스 코드를 파고 들어 하드 코딩 된 400 자 제한을 찾았습니다. (나를 믿지 않는다면, 리눅스 시스템에서 "strings / usr / bin / logger | grep 400"을 실행하십시오).

이 제한은 아파치 유형의 로깅 (nodejs 포함)에는 허용되지 않으므로 코드를 수정하고 제한을 4096으로 늘 렸습니다. 또한이 명령을 사용하는 동안 옵션을 삽입 할 수있는 새로운 명령 줄 옵션을 추가했습니다. 각 로그 줄의 시작 부분에 텍스트 문자열. nodejs 로그에는 아파치에서 볼 수 있듯이 호스트 이름이 포함되어 있지 않기 때문에이 작업을 수행했습니다.

이 시점에서 "tail -F -n 0 [logfile] | ./modified_logger ...."로 쉘 스크립트를 실행할 수있었습니다. 그러나 파이프의 한쪽 또는 다른 쪽이 종료되면 전체 파이프가 종료 될 위험이 있기 때문에 감독 (daemontools) 또는 백그라운드에서이를 실행하는 것에 대해 약간의 우려가있었습니다. 또한 성능에 대해 걱정하지 않았습니다.

그래서 테일 기능과 로거 기능을 단일 실행 바이너리로 결합하여 Unix 파이프 또는 외부 프로그램을 사용할 필요가 없도록 결정했습니다. 나는 gnu coreutils에서 tail.c를 해킹하고 수정 된 로거 프로그램에 필요한 것을 통합 하여이 작업을 수행했습니다.

결과는 "파일 로거"라고하는 새로운 바이너리 (117k 크기)이며 하나 이상의 파일을 지속적으로 모니터링하고 UDP 또는 TCP를 통해 로컬 또는 원격 syslog에 각각의 새 줄을 기록합니다. 그것은 매력처럼 작동합니다. 약간의 벤치마킹을 수행 할 수 있었으며 VLAN과 몇 개의 물리적 스위치가있는 서브넷에서 syslog-ng를 실행하는 원격 서버에 약 3 초 동안 약 17,000 개의 회선 (1.8MB)을 기록합니다.

프로그램을 실행하려면 다음과 같은 작업을 수행하십시오 (포 그라운드, 백그라운드 또는 daemontools로 감독).

./filelogger -t '액세스'-d -p local1.info -n [원격 로그 호스트] -u / tmp / ignored -a $ (호스트 이름) / tmp / myfile1 / tmp / myfile2 ...

/ tmp / myfile1 및 / tmp / myfile2는 모니터중인 파일입니다.

"-a"는 내가 추가 한 새로운 옵션입니다. 이 경우 각 로그 줄의 시작 부분에 로컬 호스트 이름을 삽입합니다.

이 솔루션은 내가 질문을 할 때 찾고 있던 솔루션의 유형이었습니다. :)


나는 아마도 어떤 시점에서 sourceforge에서 이것을 사용할 수있게 할 것입니다. 장점은 매우 작은 설치 공간, 가볍고 사용하기 쉬우 며 성능에 최적화되어 있다는 것입니다. 메시지 텍스트가 읽 히면 모든 처리가 메모리 버퍼에서 수행 된 다음 소켓으로 직접 전송됩니다.
Michael Martinez


4
나는 가혹하지 않으려 고 노력하고있어,하지만 난 하고 무딘 될 것 :이 솔루션은 존재하지 않았다가 끔찍하기 때문이다. 조직의 다른 그룹과 인터페이스하고 제정신 표준 솔루션을 구현하는 대신 이제는 테스트 / 디버그 / 유지 보수해야 완전히 지원되지 않는 코드로 해킹을당했습니다 . 나는 이것이 당신의 얼굴에 날려하지 않는 위해 희망,하지만 당신은 절대적으로 의심되는 - 당신은 "그렇게하지 마십시오"말하는 쉽게 결합하여 50 년 이상의 기술 혁신 경험 무시 잘못된 작업 수행 ... 여기
voretaq7을

1
네. 맞아 .. 이것이 오픈 소스가 앞으로 나아가는 방법이다. 모두가 당신의 길을 갔다면 진전이 없을 것입니다. GNU, Linux 및 그에 기반한 모든 것이 어떻게 생겼다고 생각하십니까? 내가 여기서 한 일을 정확히하는 사람들. 그것이 기분이 나아진다면, 조직의 모든 사람들이 자유롭게 사용하고 배포하고 개선 할 수있는 패키지 관리 시스템으로 코드를 작성하려고합니다.
Michael Martinez

그리고 참고로, 그것은 끔찍한 해결책이 아닙니다. 반대로 그것은 매우 유용한 도구입니다. 지난주에 온라인으로 솔루션을 검색 할 때이 정확한 기능을 찾을 수있는 곳을 묻는 다른 사람들을 만나게되었습니다.
Michael Martinez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.