/var/log/에 일부 데이터를 유지하기 위해 일부 라이브러리 함수나 C 언어 시스템 호출을 사용하여 Linux에서 로그 파일을 생성할 수 있는 방법이 있습니까? 그리고 로그를 작성하고 처리할 때 어떤 기준을 따라야 하는지 알고 싶습니다. 감사해요
답변1
C 프로그램에서 로그하는 표준 방법은 다음과 같습니다.syslog
.
먼저 헤더 파일을 포함합니다.
#include <syslog.h>
그런 다음 프로그램 초기에 다음을 호출하여 syslog를 구성해야 합니다 openlog
.
openlog("programname", 0, LOG_USER);
첫 번째 매개변수는 ID 또는 라벨로, 각 메시지 시작 부분에 자동으로 추가됩니다. 여기에 프로그램 이름을 입력하세요.
두 번째 인수는 사용하려는 옵션 또는 0
정상적인 동작에 대한 옵션입니다. 전체 옵션 목록은 에 있습니다 man 3 syslog
. 유용한 정보 중 하나는 LOG_PID
syslog가 로그 메시지에 프로세스 ID를 기록하게 한다는 것입니다.
그런 다음 로그 메시지를 쓰고 싶을 때마다 다음을 호출합니다 syslog
.
syslog(LOG_INFO, "%s", "Message");
첫 번째 매개변수는 우선순위입니다. 우선순위 범위는 DEBUG
(가장 덜 중요함) 부터 EMERG
(긴급 상황에만)까지이며 DEBUG
, INFO
, 및 ERR
가 가장 일반적으로 사용됩니다. man 3 syslog
옵션을 확인하세요 .
두 번째와 세 번째 매개변수는 printf와 마찬가지로 형식과 메시지입니다.
이것이 나타나는 로그 파일은 시스템 로그 설정에 따라 다릅니다.
기본 설정에서는 아마도 /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
/var/log/apache2/*
/var/log/httpd/*
open
fopen
write
printf
답변2
그런 다음 활성 syslog 프로그램에 데이터를 보내려면 #include <syslog.h>
이러한 기능을 사용해야 합니다 .syslog()
답변3
많은 가능성이 있는데, 당신의 계획은 무엇인가요? 명령줄에서 로그인하는 옵션만 필요합니까? 살펴보세요 logger
(포함됨)bsdutils). 다음을 입력하세요.
usr@srv % logger test
다음과 같은 내용이 기록됩니다 /var/log/syslog
.
Apr 25 07:55:15 localhost usr: test
당신은 또한 볼 수 있습니다man logger
. 로깅 데몬에 따라 이러한 메시지를 특정 파일로 정렬하거나 우선순위에 따라 필터링할 수 있습니다.
다양한 프로그래밍 언어에 대한 몇 가지 솔루션도 있으므로 원하는 작업을 알려주십시오 ;-)
답변4
프로그램 이름으로 필터링하는 방법은 위에서 언급한 것과 다릅니다. 최신 버전 rsyslog
(내 컴퓨터의 버전은 5.8.6)의 경우 다음과 같습니다.
if $programname == 'popa3d' then /var/log/popa3d.log
자세한 내용은 다음을 확인하세요.여기