문제

우리가 응용 프로그램에서 사용하는 리눅스 syslog 메커니즘이 있습니다.후 일주일을 보낸 이유를 알아 내기 위해 노력하고있 이 응용 프로그램이 실행되고 예상보다 느리게,우리는 발견하는 경우 우리는 제거 syslog,그리고 다 쓴에 직접 로그 파일,성능을 획기적으로 개선.

왜 syslog 이 느린 것보다 직접적인 파일에 기록합니다.하지만 내가 궁금:이 있을 구성하는 방법에는 syslog 을 최적화하여 성능은?

도움이 되었습니까?

해결책

구성 파일의 로그 파일 경로에 "-"를 작성하여 로그 메시지 후 로그 파일을 동기화하지 않도록 syslogd (및 rsyslog)를 구성 할 수 있습니다. 이로 인해 충돌로 로그 메시지가 손실 될 수있는 위험을 희생하면서 성능이 상승합니다.

다른 팁

거기에 몇 가지 옵션을 향상시킬 syslog 성능:

  • 최적화 밖으로 호출된 매크로

     int LogMask = LOG_UPTO(LOG_WARNING);
     #define syslog(a, ...) if ((a) & LogMask ) syslog((a), __VA_ARGS__)
    
     int main(int argc, char **argv)
     {
              LogMask = setlogmask(LOG_UPTO(LOG_WARNING));
              ...
     }
    

    이 매크로를 사용하여 필터를 syslog 전화는 전체 통화 감소하는 조건에 뛰어 전역 변수,매우 도움이 일어날 경우 는 디버그 호출되는 번역하는 대량 데이터 집합을 통해 다른 기능이 있습니다.

  • setlogmask()

    setlogmask(LOG_UPTO(LOG_LEVEL))
    

    setlogmask()을 최적화하여 통화록하지 않는/dev/로그인이지만,프로그램 호출 기능을 사용으로 인수입니다.

  • 필터링으로 syslog.conf

     *.err                                               /var/log/messages
    

    "을 확인하는 남자 페이지를 syslog.conf 파일에 대한 상세정보."

  • 구성 syslog 하는 비동기거나 버퍼링 로깅

    metalog 사용하여 버퍼 로그 출력 및 러시에 블록입니다.주식 syslog 및 syslog-ng 이렇게 하지 않으로하고 있는 것으로 알고 있습니다.

착수하기 전에 새로운 데몬을 작성을 확인할 수 있는 경우 syslog-ng 빠르(또는 구성할 수 있습니다 더 빠르게)보다 일반전 syslog.

로깅 애플리케이션에 소스를 제어 할 경우 사용할 수있는 한 가지 트릭은 Syslog.conf 대신 앱 자체에서 원하는 로그 레벨을 마스킹하는 것입니다. 나는 올해 전에 거대하고 거대하고 엄청난 양의 디버그 로그를 생성 한 앱을 사용했습니다. 프로덕션 코드에서 통화를 제거하는 대신 디버그 레벨 호출이 데몬으로 보내지 않도록 마스크를 마스킹했습니다. 실제로 코드를 찾았습니다. Perl이지만 SetLogmask (3) 호출의 앞면입니다.

use Sys::Syslog;
# Start system logging
# setlogmask controls what levels we're going to let get through.  If we mask
# them off here, then the syslog daemon doesn't need to be concerned by them
# 1   = emerg
# 2   = alert
# 4   = crit
# 8   = err
# 16  = warning
# 32  = notice
# 64  = info
# 128 = debug
Sys::Syslog::setlogsock('unix');
openlog($myname,'pid,cons,nowait','mail');
setlogmask(127); # allow everything but debug
#setlogmask(255); # everything
syslog('debug',"syslog opened");

비트 마스크 대신 소수점을 사용한 이유는 확실하지 않습니다 ... 어깨를 으쓱하다

자신의 Syslog 구현을 작성하십시오. :-피

이것은 두 가지 방법으로 달성 될 수 있습니다.

  1. 나만의 글을 쓰십시오 LD_PRELOAD Syslog 함수를 무시하고 출력으로 만듭니다. stderr 대신에. 나는 실제로 몇 년 전에이 글을 썼습니다. http://marc.info/?m=97175526803720 :-피
  2. 나만의 Syslog 데몬을 작성하십시오. 데이터 그램을 잡는 단순한 문제 일뿐입니다. /dev/log! :-피

좋아, 좋아, 그래서 이것들은 둘 다 딱딱한 대답이다. 당신은 프로파일 링 했습니까? syslogd 가장 질식하는 곳을보기 위해?

logfile (예 : user.* [탭] -/var/log/user.log)를 경로에 놓아서 syslogd의 레벨 (또는 시설)을 비동기로 로그로 기록 할 수 있습니다.

건배.

syslog-async () 구현은 다른 시간에 로그 라인 손실 / 경계 지연의 위험에 도움이 될 수 있습니다.http://thekelleys.org.uk/syslog-async/

참고 : '비동기식'은 응용 프로그램 내에서 로그 이벤트를 큐잉하는 것을 말하며 다른 답변이 참조하는 비동기 Syslogd 출력 파일 구성 옵션이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top