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에 내장 된 프레임 워크와 같은 더 나은 방법이 있습니까?
유닉스는 오랫동안 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 클랜과 유사하므로 코드를 수정하는 데 문제가 없습니다.
대규모 (또는 보안에 민감한) 설치에서 syslog의 또 다른 이점 : syslog 데몬은 로컬 파일 시스템 대신 (또는 추가로) 기록하기 위해 다른 서버로 로그를 보내도록 구성 할 수 있습니다.
특히 한 서버의 이벤트를 다른 서버의 이벤트와 연관 시키려고 할 때 각 시스템에서 개별적으로 읽는 것보다 서버 팜의 모든 로그를 한 곳에 두는 것이 훨씬 더 편리합니다. 그리고 하나가 크래킹되면 더 이상 로그를 신뢰할 수 없지만 로그 서버가 안전하게 유지되면 로그에서 아무것도 삭제되지 않을 것이므로 침입 기록은 그대로 유지됩니다.
단위 테스트를 할 때 daemon.info 및 daemon.debug에 많은 데몬 메시지를 뱉습니다. 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, 콘솔, 플랫 파일 또는 사용자 정의 로그 작성기에 로깅하도록 선택할 수 있습니다. 각 모듈에 대해 특정 로그 컨텍스트를 정의 할 수 있으며 구성에 정의 된대로 각 컨텍스트 로그를 다른 수준에 둘 수 있습니다. (추적, 디버그, 정보, 경고, 오류, 위험) 신호를 트래핑하여 데몬이 즉시 해당 구성 파일을 다시 읽도록하여 실행중인 서버에서 로그 수준을 조작 할 수 있습니다.
위에서 언급했듯이 syslog를 살펴 봐야합니다. 그러나 자신의 로깅 코드를 작성하려면 fopen의 "a"(쓰기 추가) 모드를 사용하는 것이 좋습니다.
고유 한 로깅 코드 작성의 몇 가지 단점은 로그 회전 처리, 잠금 (여러 스레드가있는 경우), 동기화 (디스크에 기록되는 로그를 기다리시겠습니까?)입니다. syslog의 단점 중 하나는 애플리케이션이 로그가 디스크에 기록되었는지 (손실되었을 수 있음) 알지 못한다는 것입니다.
스레딩을 사용하고 로깅을 디버깅 도구로 사용하는 경우 일종의 스레드 안전하지만 잠금 해제 된 링 버퍼를 사용하는 로깅 라이브러리를 찾고 싶을 것입니다. 스레드 당 하나의 버퍼, 엄격하게 필요한 경우에만 글로벌 잠금이 있습니다.
This avoids logging causing serious slowdowns in your software and it avoids creating heisenbugs which change when you add debug logging.
If it has a high-speed compressed binary log format that doesn't waste time with format operations during logging and some nice log parsing and display tools, that is a bonus.
I'd provide a reference to some good code for this but I don't have one myself. I just want one. :)
Our embedded system doesn't have syslog so the daemons I write do debugging to a file using the "a" open mode similar to how you've described it. I have a function that opens a log file, spits out the message and then closes the file (I only do this when something unexpected happens). However, I also had to write code to handle log rotation as other commenters have mentioned which consists of 'tail -c 65536 logfile > logfiletmp && mv logfiletmp logfile'. It's pretty rough and maybe should be called "log frontal truncations" but it stops our small RAM disk based filesystem from filling up with log file.
So far nobody mentioned boost log library which has nice and easy way to redirect your log messages to files or syslog sink or even Windows event log.
There are a lot of potential issues: for example, if the disk is full, do you want your daemon to fail? Also, you will be overwriting your file every time. Often a circular file is used so that you have space allocated on the machine for your file, but you can keep enough history to be useful without taking up too much space. There are tools like log4c that you can help you. If your code is c++, then you might consider log4cxx in the Apache project (apt-get install liblog4cxx9-dev on ubuntu/debian), but it looks like you are using C.
참고URL : https://stackoverflow.com/questions/158457/daemon-logging-in-linux
'Programing' 카테고리의 다른 글
Intellij 확대 / 축소 방법 (0) | 2020.11.14 |
---|---|
AngularJS 지시문은 범위 변수 변경시 업데이트되지 않습니다. (0) | 2020.11.14 |
자바 스크립트 이벤트 e. 어느? (0) | 2020.11.14 |
UILabel 텍스트 색상을 변경할 수 없습니다. (0) | 2020.11.13 |
클래스 라이브러리 용 app.config (0) | 2020.11.13 |