저는 yocto를 사용하여 구축된 임베디드 Linux 운영 체제를 사용하고 있습니다. busybox syslogd를 파일과 버퍼로 출력하도록 변경하려고 합니다. 이렇게 하면 logread -f
나중에 볼 필요가 있을 경우를 대비하여 출력을 사용하고 파일에 저장할 수 있습니다. 이제 내가 보는 문제는 syslogd-startup.conf 파일을 다음과 같이 변경한 후입니다.
DESTINATION=" file buffer" # log destinations (buffer file remote)
LOGFILE=/mnt/userrw/sd/logs # where to log (file)
REMOTE=loghost:514 # where to log (syslog remote)
REDUCE=no # reduce-size logging
DROPDUPLICATES=no # whether to drop duplicate log entries
ROTATESIZE=2000 # rotate log if grown beyond X [kByte]
ROTATEGENS=2 # keep X generations of rotated logs
BUFFERSIZE=2000 # size of circular buffer [kByte]
FOREGROUND=no # run in foreground (don't use!)
#LOGLEVEL=7 # local log level (between 1 and 8)
그런 다음 재부팅 명령을 실행 /etc/init.d/syslog
하고 다음을 실행했습니다.
ps aux | grep syslogd
syslogd의 매개변수가 올바른지 확인하는 다음 메시지가 나타납니다.
ps aux | grep syslogd
root 1648 0.3 1.7 4236 2588 ? S 14:35 0:00 /sbin/syslogd -n -O /mnt/userrw/sd/logs -s 2000 -b 2 -C2000
root 1671 0.0 0.3 2240 496 pts/0 S+ 14:35 0:00 grep syslogd
그러나 문제는 파일에 인쇄되지 않는다는 것입니다. 버퍼에만 해당됩니다. -C2000 인수를 꺼내면(즉, DESTINATION=file만 있으면) 파일로 인쇄됩니다. 파일과 버퍼로 출력하려면 어떻게 해야 합니까? 이게 가능하지 않나요? 내 syslogd.conf 파일이 비어 있습니다. 이것을 파일로 출력하고 syslogd-startup.conf를 사용하여 버퍼로 출력해야 합니까?
답변1
일부 소스를 확인해 보세요.시스템 로그 파일존재하다ㅏbusybox 버전에서는 이것이 불가능한 것 같습니다. 적절한 코드는 다음과 같습니다.
if (LOG_PRI(pri) < G.logLevel) {
if ((option_mask32 & OPT_circularlog) && G.shbuf) {
log_to_shmem(G.printbuf);
return;
}
log_locally(now, G.printbuf, &G.logFile);
}
따라서 버퍼에 기록하면 파일에 기록하지 않고 반환됩니다. 조금 근시안적인 것 같습니다. 아마도 yocto를 패치하여 해당 return;
명령문을 제거할 수 있을 것입니다.