Linux에서의 데몬 로깅
Linux 시스템에서 실행 중인 데몬의 액티비티를 기록하고 싶습니다.로그입니다.문제는, 이것을 실현하기 위한 「최선의」방법은 무엇인가 하는 것입니다.
제 첫 번째 생각은 단순히 파일을 열고 쓰는 것입니다.
FILE* log = fopen("logfile.log", "w");
/* daemon works...needs to write to log */
fprintf(log, "foo%s\n", (char*)bar);
/* ...all done, close the file */
fclose(log);
이 방법으로 로깅하는 데 본질적으로 문제가 있습니까?Linux에 내장된 프레임워크와 같은 더 나은 방법이 있습니까?
Unix는 오랫동안 syslog라고 불리는 특별한 로깅 프레임워크를 사용해 왔습니다.셸 입력
man 3 syslog
C 인터페이스에 대한 도움을 받을 수 있습니다.
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
int main(void) {
openlog("slog", LOG_PID|LOG_CONS, LOG_USER);
syslog(LOG_INFO, "A different kind of Hello world ... ");
closelog();
return 0;
}
이것.
아마... 경마용이지만, 모든 Un*x 파생 모델이 아닌 대부분에 존재하는 syslog 기능이 권장되는 방법입니다.파일에 로깅하는 것은 문제가 없지만 다음과 같은 많은 작업을 수행해야 합니다.
- 로그 위치에 파일을 저장할 파일 시스템이 있습니까?
- 버퍼링(퍼포먼스)과 플러시(시스템 크래시 전에 로그를 기록하기 위해)는 어떻습니까?
- 데몬이 장시간 실행되는 경우 계속 증가하는 로그 파일을 어떻게 처리해야 합니까?
Syslog가 이 모든 것을 처리해 줍니다.API는 printf clan과 비슷하기 때문에 코드 적응에 문제가 없습니다.
대규모(또는 보다 보안을 중시하는) 설치에서 syslog의 또 다른 장점은 다음과 같습니다.syslog 데몬은 로그를 로컬파일 시스템이 아닌 다른 서버로 전송하여 기록하도록 설정할 수 있습니다.
서버 팜의 모든 로그를 한 곳에 보관하는 것이 각 머신에서 개별적으로 읽을 필요 없이 훨씬 편리합니다.특히 서버상의 이벤트와 다른 서버의 이벤트를 관련지으려고 할 때는 더욱 편리합니다.그리고 금이 가게 되면, 더 이상 그 기록을 믿을 수 없어...그러나 로그 서버의 보안이 유지되면 로그에서 아무것도 삭제되지 않으므로 침입 기록은 손상되지 않습니다.
유닛 테스트 시에는 daemon.info 및 daemon.daemon.daemon에 많은 데몬 메시지를 보냅니다.syslog.conf 행은 원하는 파일에 이러한 메시지를 고정할 수 있습니다.
http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/040/4036/4036s1.html에는 man 페이지 imo보다 C API에 대한 설명이 더 잘 되어 있습니다.
syslog는 좋은 옵션이지만 log4c를 검토하는 것이 좋습니다.log4 [ something ]프레임워크는 Java 및 Perl 구현에서 정상적으로 동작하며 설정 파일에서 syslog, 콘솔, 플랫 파일 또는 사용자 정의 로그 기록기를 선택할 수 있습니다.각 모듈에 대해 특정 로그콘텍스트를 정의하고 Configuration에 정의된 대로 각 컨텍스트로그를 다른 레벨로 기록할 수 있습니다.(debug, debug, info, warn, error, critical) 및 데몬이 신호를 트랩하여 해당 컨피규레이션파일을 즉시 다시 읽도록 합니다.이것에 의해, 실행중의 서버상에서 로그 레벨을 조작할 수 있습니다.
위에서 설명한 바와 같이 syslog를 조사해야 합니다.그러나 로그 코드를 직접 작성하려면 fopen의 "a"(write append) 모드를 사용하는 것이 좋습니다.
독자적인 로그 코드를 작성할 때의 몇 가지 결점은 로그 순환 처리, 잠금(여러 스레드가 있는 경우), 동기화(로그가 디스크에 기록될 때까지 기다리시겠습니까?)입니다.syslog의 결점 중 하나는 로그가 디스크에 기록되었는지(로그가 손실되었을 수 있음) 여부를 애플리케이션이 인식하지 못한다는 것입니다.
스레드를 사용하여 로깅을 디버깅도구로 사용하는 경우 스레드 세이프하지만 잠금 해제된 링버퍼를 사용하는 로깅라이브러리를 찾습니다스레드당 1개의 버퍼.완전 필요한 경우에만 글로벌 잠금이 설정됩니다.
이를 통해 소프트웨어의 심각한 속도 저하를 초래하는 로깅을 방지하고 디버깅을 추가할 때 변경되는 하이젠버그를 생성할 수 없습니다.
고속 압축 바이너리 로그 포맷으로 로깅 중 포맷 조작에 시간을 낭비하지 않고 로그 해석 및 표시 도구를 사용할 수 있다면 이는 덤입니다.
좋은 코드에 대한 레퍼런스를 제공하고 싶지만, 저도 그런 코드는 없습니다.난 하나만 원해.:)
당사의 임베디드 시스템에는 syslog가 없기 때문에 제가 쓰는 데몬은 앞서 설명한 것과 유사한 "a" 오픈 모드를 사용하여 파일에 대한 디버깅을 수행합니다.로그 파일을 열고 메시지를 내보낸 다음 파일을 닫는 기능이 있습니다(예기치 못한 일이 발생했을 때만 실행).단, 다른 코멘트가 언급했듯이 로그 순환을 처리하기 위해 코드를 작성해야 했습니다.이것은 'tail - c 65536 logfiletmp & mv logfiletmp logfiletmp'로 구성되어 있습니다.상당히 거칠고 "log frontal truncations(로그 프런트 잘라내기)"라고 불러야 할 수도 있지만, 이 기능을 통해 당사의 작은 RAM 디스크 기반 파일 시스템이 로그 파일로 가득 차는 것을 막을 수 있습니다.
예를 들어 디스크가 꽉 찼을 때 데몬에 장애가 발생하기를 원합니까?또한 매번 파일을 덮어쓰게 됩니다.컴퓨터에 파일을 위한 공간을 할당하기 위해 순환 파일이 사용되는 경우가 많지만, 너무 많은 공간을 차지하지 않고도 충분한 이력을 유지할 수 있습니다.log4c와 같은 툴을 사용할 수 있습니다.코드가 c++인 경우 Apache 프로젝트에서 log4cxx(apt-get install liblog4cx9-dev on ubuntu/debian)를 고려할 수 있지만 C를 사용하고 있는 것처럼 보입니다.
지금까지 로그 메시지를 파일이나 syslog 싱크 또는 Windows 이벤트 로그로 리다이렉트할 수 있는 편리하고 쉬운 방법을 가진 부스트 로그 라이브러리는 아무도 언급하지 않았습니다.
언급URL : https://stackoverflow.com/questions/158457/daemon-logging-in-linux
'source' 카테고리의 다른 글
C에서 랜덤 int를 생성하는 방법 (0) | 2022.08.27 |
---|---|
Vuex의 세 마침표 구문? (0) | 2022.08.27 |
VueJ: 컴포넌트에 생성하기 전에 계산된 속성이 계산됩니까? (0) | 2022.08.27 |
정수 제수를 일정하게 사용하여 효율적인 부동 소수점 나눗셈 (0) | 2022.08.27 |
bootstrap-vue: b-form-datepicker가 정지될 때까지 v-모델로 업데이트되지 않음 (0) | 2022.08.27 |