2011-11-25 4 views
4

로그를 작성해야하는 bash 스크립트가 있습니다. 현재 아래 블록과 같은 블록을 사용합니다.Bash 스크립트 로깅 사용

#log stop request 
      { 
       local now=$(date +"%a %b %d %Y %H:%M:%S") 

       printf "batch stop request successful. \n" 
       printf "  Time   :: %s\n" "$now" 
       printf "  PID of process :: %s\n" ${PID[0]}" 
      } >> "${mylogfile}" 

여기서 mylogfile 변수에는 로그 파일의 이름이 있습니다.

이 접근법의 문제점은 2 개 이상의 인스턴스가 실행 중일 때 로그가 인터리브되는 인스턴스의 쓰기로 인해 엉망이되는 경향이 있다는 것입니다.

블록을 사용하여 로그를 한 번에 파일에 기록하므로 문제가 발생하지 않도록주의하십시오.

Vivek Gite post에서 로거 명령을 보았습니다. 하지만 문제는 내가 지정할 수있는 파일에 쓰지 않고/var/log/message에 쓰는 것입니다.

도움을 주시면 감사하겠습니다. 하나의 문자열로 3 printfs 퍼팅 시도

감사합니다 감사합니다 SIBI

+0

모든 글을 하나의 'printf' 문으로 그룹화하면 어떻게됩니까? 단일 메시지에 대해 여러 행을 포기하고 전체 메시지에 대해 한 행만 사용하면 어떻게됩니까? –

+0

작동하지 않습니다. 여전히 인터리브 메시지가 표시됩니다. –

답변

1

, 즉

printf "Epsilon batch stop request successful. \n  Time   :: %s\n  PID of process :: %s\n" "$now" ${PID[0]} 

당신은 여전히 ​​인터리빙을받을 수 있습니다.

각 인스턴스를 자체 로그 파일로 시작하지 마십시오. 로그 파일 이름에 $ {PID}를 사용하여 별도의 인스턴스로 유지하십시오. 즉

>> "${mylogfile}.${PID}" 

편집

당신이 로거 바라고으로, man 페이지 체크 아웃 : 당신이 원하는 모양

logger(1) - Linux man page 

Name 

logger - a shell command interface to the syslog(3) system log module 

Synopsis 
logger [-isd] [-f file] [-p pri] [-t tag] [-u socket] [message ...] 

Description 

Logger makes entries in the system log. It provides a shell command interface to the syslog(3) system log module. 

Options: 

    -i'   Log the process id of the logger process with each line. 
    -s' Log the message to standard error, as well as the system log. 
    -f file 
     Log the specified file. 

..... 

합니다.

이 정보가 도움이되기를 바랍니다.

+0

안녕하세요 셸터, 한 파일에 기록해야한다는 제한이 있습니다. 로거를 사용하여 사용자 정의 파일에 쓸 수있는 방법이 있습니까? –

3

POSIX (IEEE Std 1003.1-2001)는 동일한 파일에 데이터를 보내는 동시 write() syscalls의 동작을 정의하지 않으므로 플랫폼에 따라 다른 결과를 얻을 수 있습니다. 모든 printfs을 하나로 병합하여이 작업이 가능할 것이라는 희망으로 시도 할 수는 있지만 앞으로도 다른 플랫폼에서 보장 할 수는 없습니다.

동시성 제어 및 플러시를 사용하여 쓰기가 순서대로 이루어 지도록하는 대신 모든 프로세스를 대신하여 로그 메시지를 파일에 순차적으로 기록하는 세 번째 프로세스로 메시지를 보낼 수 있습니다. 실제로, 이것은 인용 된 post에서 loggersyslog으로 이루어진 것입니다. logger 명령은 메시지를 /var/log/messages으로 보내지 않습니다. 로그 메시지를 syslog으로 보내고 원하는 위치에 로그 메시지를 저장하도록 구성 할 수 있습니다. 이 구성을 변경하려면 일반적으로 관리 권한이 필요합니다.

syslog을 사용할 수 없거나 사용하지 않으려면 netcat을 로깅 서버로 사용할 수 있습니다.

nc -luk localhost 9876 > shared_log_file & 

(포트 9876는 단지입니다 :이 (이 작업이 백그라운드에서 모든 시간을 계속 실행해야합니다, 당신은 또한 screen에서 실행할 수 있습니다) 파일에 모든 스크립트에서 들어오는 모든 로그 메시지를 멀티 플렉스 실행 예) 및 각 스크립트에서 이런 식으로 로그 :

printf "Log message\n" > /dev/udp/localhost/9876 

당신은 또한 (netcat을 대신 사용자 정의 UDP 서버를 사용할 수 있습니다 예를 들어, 같은 this one).

+0

안녕하세요 아담, 훌륭한 설명에 감사드립니다. 로거에 대한 샘플을 얻을 수있는 모든 포인터는 훌륭합니다. 나는 결과를 얻지 않고 그물을 시험해 보았다. –

+0

그는 특정 종류의 로깅 동작 (예 : syslog (3))을 찾고 있지 않기 때문에 서브 쉘에서 관련 printfs를 그룹화하고 출력을 리디렉션 할 수있을 때 불필요하게 복잡하다고 생각합니다. "라고 씁니다. – jkh

+0

안녕하세요, Adam과 jkh 님, JKH가 바로 거래용 쓰기를 찾고 있습니다. 나를 도와 주신 두 분께. –

2

발견 한대로 블록이 어떤 식 으로든 printfs를 그룹화하지 않습니다. 그러나 할 수있는 일은 하위 셸 (괄호 사이)에있는 모든 명령을 수행 한 다음 하위 셸의 출력을 리디렉션하는 것입니다.

1

로깅의 특성에 따라 개인 로그 파일 대신 시스템 로그에 적합 할 수 있습니다. 이 경우 logger 프로그램은 수작업으로 로깅하는 대신 매우 유용 할 수 있습니다.

+0

나는이 제안을 좋아한다. 시스템 로그를 사용할 수없는 이유에 대해서는 언급하지 않았습니다. – Chris

+0

안녕하세요 phasetwenty, 사용자 지정 위치에서 파일에 로그온해야합니다. –