로그 파일을 만들다


22

리눅스에서 c 언어로 된 라이브러리 함수 또는 시스템 호출의 도움으로 / var / log /에 일부 데이터를 유지하기 위해 로그 파일을 만드는 방법이 있습니까? 또한 로그를 작성하고 처리하기 위해 따라야하는 표준을 알고 싶습니다. 감사


프로그래밍 질문은 일반적으로 주제와 관련이 없습니다. 스택 오버플로 에 요청해야합니다 . API에 대한 설명은 여기에서 괜찮지 만 C 또는 다른 프로그래밍 언어에서 API를 사용하는 방법에 대한 설명은 일반적으로 스택 오버플로에 속합니다.
Gilles 'SO- 악의를 멈춰라'

답변:


31

C 프로그램에서 로그하는 표준 방법은 syslog입니다.

헤더 파일을 포함시켜 시작하십시오.

#include <syslog.h>

그런 다음 프로그램 초기에 다음을 호출하여 syslog를 구성해야합니다 openlog.

openlog("programname", 0, LOG_USER);

첫 번째 인수는 식별 또는 태그이며, 각 메시지 시작시 자동으로 추가됩니다. 여기에 프로그램 이름을 입력하십시오.

두 번째 인수는 사용하려는 옵션 또는 0정상적인 동작입니다. 전체 옵션 목록은에 있습니다 man 3 syslog. 유용하다고 생각되는 것은 LOG_PIDsyslog가 프로세스 ID를 로그 메시지에 기록하도록하는 것입니다.

그런 다음 로그 메시지를 작성할 때마다 다음을 호출합니다 syslog.

syslog(LOG_INFO, "%s", "Message");

첫 번째 주장은 우선 순위입니다. 행 범위 우선 순위 DEBUG(가장 중요한) 행 EMERG과 (비상시에만)를 DEBUG, INFO그리고 ERR가장 일반적으로 사용된다. man 3 syslog옵션을 참조하십시오 .

두 번째와 세 번째 인수는 printf와 마찬가지로 형식과 메시지입니다.

표시되는 로그 파일은 syslog 설정에 따라 다릅니다.

기본 설정을 사용하면 아마도로 들어갑니다 /var/log/messages.


당신은 범위에있는 시설 중 하나를 사용하여 사용자 정의 로그 파일을 설정할 수 있습니다 LOG_LOCAL0로를 LOG_LOCAL7.

다음을 변경하여 사용하십시오.

openlog("programname", 0, LOG_USER);

openlog("programname", 0, LOG_LOCAL0);

또는

openlog("programname", 0, LOG_LOCAL1);

기타

및 대응하는 항목을 추가하는 /etc/syslog.conf

local1.info /var/log/programname.log

syslog 서버 재시작

pkill -HUP syslogd

.info의 일부로 local1.info모든 메시지 것을 위의 수단을 INFO포함 시키거나 더 중요한이 기록됩니다, INFO, NOTICE, ERR, (오류) CRIT등 (중요),하지만 DEBUG.


또는 당신이있는 경우에 rsyslog, 당신이 시도 할 수있는 특성 기반의 필터를 , 예를 들어,

:syslogtag, isequal, "programname:"    /var/log/programname.log

syslogtag는 ":"을 포함해야합니다.

또는 소프트웨어를 다른 사람에게 배포하려는 경우 LOG_LOCAL또는 rsyslog필터 를 사용하는 것은 좋지 않습니다 .

이 경우 LOG_USER(정상적인 프로그램 인 경우) 또는 LOG_DAEMON(서버 인 경우) 서버를 사용하여 시작 메시지와 오류 메시지를 syslog쓰되 모든 로그 메시지를 외부의 파일에 쓰십시오 syslog. 예를 들어, Apache HTTPd는 /var/log/apache2/*또는에 로그인하며 /var/log/httpd/*일반 open/ fopenwrite/ printf호출을 사용한다고 가정 합니다.


이것은 매우 유용한 정보입니다. 그러나 log_local0-7 옵션에 대해 자세히 설명 해주십시오. 예를 들어. self.log 파일에 내 데이터 (로그 라인에 <self> 단어가 있음)를 쓰고 싶습니다. 일부 파일은 다른 파일에 기록됩니다.
Sushant Jain

@Sushant Jain : 어떤 Linux 배포 및 버전을 대상으로합니까? 오래된 syslog (ksyslogd) 또는 rsyslog가 있습니까? rpm -qa | grep syslog또는 dpkg -l '*syslog*'아마 당신에게 말할 것입니다.
Mikel

log_local *은 솔직히 sysklogdsyslog 소프트웨어의 유일한 게임 이었을 때의 유물입니다 . 요즘 같은 소프트웨어 syslog-ng, rsyslog그리고 dsyslog존재 단지 서비스 / 수준보다 훨씬 더 정교한 필터링 기능을 가지고있다.
Shadur

고마워 내 문제가 해결되었습니다. 로그 파일에 저장된 데이터 구문 분석에 대한 쿼리가 하나 더 있습니다. 이것을 할 수있는 좋은 방법이 있습니까? 실제로 시스템 통계 도구를 만들려고합니다. 그래서 나는 그것을 필요로한다.
Sushant Jain

@ 셔튼 제인. 기쁘다. 사람들이 질문을보고 적절한 답변을 제공 할 수 있도록 로그 구문 분석 질문을 별도의 질문으로 게시하십시오.
Mikel

2

당신은하고 싶은 것 #include <syslog.h>, 다음 사용 syslog()활성화 어떤 시스템 로깅 프로그램으로 데이터를 전송하는 기능을.

참고 항목 여기 man 페이지를 .


syslog () 함수는 데이터를 / var / log / syslog에 기록합니다. 반면 내 파일에 로그를 작성하고 싶습니다.
Sushant Jain

Mikel이 아래에 설명 하듯 이 syslog가 어떤 프로그램인지 이해하는 방식으로 로그 메시지에 태그를 지정한 다음 프로그램 로그 메시지를 다른 파일에 쓰도록 syslog를 구성 할 수 있습니다.
Caleb

1

많은 가능성이 있습니다. 당신의 계획은 무엇입니까? 명령 행에서 로그하기위한 옵션이 필요합니까? logger( bsdutils에 포함되어 있음 )을 살펴보십시오 . 그냥 입력하십시오 :

usr@srv % logger test

그리고 당신에게 다음과 같은 것을 기록 할 것입니다 /var/log/syslog:

Apr 25 07:55:15 localhost usr: test

도 참조하십시오 man logger. 로깅 데몬에 따라 이러한 메시지를 특정 파일로 정렬하거나 우선 순위별로 필터링 할 수 있습니다.

다른 프로그래밍 언어에 대한 솔루션도 있으므로 수행하려는 작업을 알려주십시오. ;-)


실제로 나는 c 언어를 사용하여 그것을하고 싶다. 그리고 mikel post에 정보가 있습니다.
Sushant Jain

1

프로그램 이름으로 필터링은 rsyslog아래에 표시된 것처럼 최신 버전 (내 컴퓨터의 버전은 5.8.6입니다)에 대해 위에서 언급 한 것과 다르게 작성 됩니다.

if $programname == 'popa3d' then /var/log/popa3d.log

자세한 내용은 여기 를 참조 하십시오

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