7.5. 로그 파일을 이름 지정된 파이프로 교체

많은 관리자가 특정 이벤트만 기록하도록 액세스 로그를 구성하여 로깅 데이터를 사용하여 일부 특수 구성 또는 작업을 수행하려고 합니다. 표준 Directory Server 로그 파일 구성 속성을 사용할 수는 없지만 로그 데이터를 명명된 파이프로 보낸 다음 다른 스크립트를 사용하여 데이터를 처리할 수 있습니다. 로그에 명명된 파이프를 사용하면 다음과 같이 이러한 특수 작업이 간소화됩니다.

  • 실패한 바인딩 시도 또는 특정 사용자 또는 IP 주소의 연결과 같은 특정 이벤트 로깅
  • 특정 정규식 패턴과 일치하는 로깅 항목
  • 로그를 특정 길이로 유지(로깅은 마지막 행 수만 해당)
  • 이벤트가 발생할 때 이메일과 같은 알림 전송

로그 파일을 파이프로 교체하는 경우 특히 작업 속도가 높은 서버의 성능이 향상됩니다.

명명된 파이프는 스크립트를 사용하여 로그 버퍼에서 데이터를 처리하는 방식 때문에 로그에서 데이터를 추출하는 것과 다릅니다.

로그가 버퍼링되면 서버 성능이 좋지만 중요한 데이터는 이벤트가 발생하는 즉시 디스크에 기록되지 않습니다.If a log is buffered, server performance is good, but important data are not written to disk (the log file) as soon as the event occurs. 서버에 충돌에 문제가 있는 경우 데이터를 디스크에 기록하기 전에 충돌할 수 있으며 스크립트의 데이터를 추출할 데이터가 없습니다.

로그가 버퍼링되지 않은 경우[1]쓰기는 각 작업에서 디스크로 플러시되므로 디스크 I/O 및 성능 저하가 많이 발생합니다.

파이프로 로그 디스크 파일을 교체할 경우, 파이프에서 읽은 스크립트가 간단한 스크립트로는 들어오는 로그 데이터를 버퍼링할 수 있기 때문에 버퍼링의 이점이 있습니다.

스크립트의 사용법 및 옵션 세부 정보는 9.4절. “ds-logpipe.py” 에서 참조하십시오. 기본 형식은 ds-logpipe.py/path/to/named_pipe--userpipe_user--maxlinesnumber--serverpidfilefile.pid--serverpidPID--serverpid PID --plugin=to/plugin.pypluginfile.arg=값입니다.

7.5.1. 로깅에 이름 지정된 파이프 사용

Directory Server 인스턴스는 명명된 파이프 로그 스크립트를 실행하고 파이프 이름을 지정하여 로깅에 명명된 파이프를 사용할 수 있습니다. (서버가 이미 실행중인 경우 로그를 다시 열어야 하지만, 구성이 필요하지 않습니다.)

# ds-logpipe.py /var/log/dirsrv/slapd-example/access

이러한 방식으로 ds-logpipe.py 를 실행하면 구현하기가 간단하고 Directory Server 구성 변경이 필요하지 않은 이점이 있습니다. 이는 특히 특정 유형의 이벤트를 검색하는 경우 빠른 디버깅 또는 모니터링에 유용합니다.

Directory Server 인스턴스가 로깅을 위해 실제 파일이 아닌 명명된 파이프를 자주 또는 영구적으로 사용하는 경우 인스턴스를 재구성하여 명명된 파이프를 만들고 로깅에 사용할 수 있습니다(기본적으로 로그 파일의 경우).

인스턴스의 로그 구성에 대해 다음 세 가지를 구성해야 합니다.

  • 사용할 로그 파일을 파이프(nsslapd-*log )로 변경해야 합니다. 여기서 *는 access, error 또는 audit일 수 있습니다.[2]구성 중인 로그 유형에 따라 다음을 수행합니다.
  • 스크립트가 이미 로그 항목을 버퍼링하므로 버퍼링을 비활성화해야 합니다(nsslapd-*log-logbuffering)
  • 서버가 명명된 파이프를 회전하지 않도록 로그 순환을 비활성화해야 합니다(nsslapd-*log-maxlogsperdir,nsslapd-*log-logexpirationtime, nsslapd-*log-logrotationtime)

이러한 구성 변경은 디렉터리 서버 콘솔에서 또는 ldapmodify 를 사용하여 변경할 수 있습니다.

예를 들어 이렇게 하면 액세스 로그가 access.pipe가 됩니다.For example, this switches the access log to access.pipe:

# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

dn: cn=config
changetype: modify
replace: nsslapd-accesslog
nsslapd-accesslog: /var/log/dirsrv/slapd-instance/access.pipe
-
replace: nsslapd-accesslog-logbuffering
nsslapd-accesslog-logbuffering: off
-
replace: nsslapd-accesslog-maxlogsperdir
nsslapd-accesslog-maxlogsperdir: 1
-
replace: nsslapd-accesslog-logexpirationtime
nsslapd-accesslog-logexpirationtime: -1
-
replace: nsslapd-accesslog-logrotationtime
nsslapd-accesslog-logrotationtime: -1
참고

이러한 변경으로 인해 서버에서 현재 로그 파일을 종료하고 명명된 파이프로 즉시 전환합니다. 이는 실행 중인 서버를 디버깅하고 특정 메시지에 대한 로그 출력을 삭제하는 데 매우 유용할 수 있습니다.

7.5.2. 서버에서 이름 지정된 파이프 시작

명명된 파이프는 인스턴스의 init 스크립트 구성 파일을 편집하여 Directory Server 인스턴스와 함께 시작하고 종료할 수 있습니다.

참고

서버 시작 시 호출되기 전에 명명된 파이프 스크립트를 인스턴스의 dse.ldif 파일에서 구체적으로 구성해야 합니다.

  1. 서버 시스템의 인스턴스 구성 파일을 엽니다.

    /etc/sysconfig/dirsrv-instance_name
    주의

    /etc/sysconfig/dirsrv 파일을 편집 하지 마십시오.

  2. 파일 끝에 다음과 같은 행이 있습니다.

    # Put custom instance specific settings below here.

    해당 행 아래에 ds-logpipe.py 명령을 삽입하여 서버가 시작될 때 시작합니다. 예를 들면 다음과 같습니다.

    # only keep the last 1000 lines of the error log
    python /usr/bin/ds-logpipe.py /var/log/dirsrv/slapd-example/errors.pipe -m 1000 -u dirsrv -s /var/run/dirsrv/slapd-example.pid > /var/log/dirsrv/slapd-example/errors &
    
    # only log failed binds
    python /usr/bin/ds-logpipe.py /var/log/dirsrv/slapd-example/access.pipe -u dirsrv -s /var/run/dirsrv/slapd-example.pid --plugin=/usr/share/dirsrv/data/failedbinds.py failedbinds.logfile=/var/log/dirsrv/slapd-example/access.failedbinds &
    참고

    s 옵션은 둘 다 서버에서 PID를 쓸 수 있는 .pid 파일을 지정하고 서버 프로세스를 시작하고 중지하도록 스크립트를 설정합니다.

7.5.3. Named Pipe Log로 플러그인 사용

명명된 파이프에서 로그 데이터를 읽고 여기에 대해 일부 작업을 수행하려면 플러그인을 호출할 수 있습니다. 이름이 지정된 파이프 로그 스크립트와 함께 플러그인을 사용하는 경우 몇 가지 고려해야 할 사항이 있습니다.

  • 플러그인 함수는 명명된 파이프에서 읽은 모든 행에 대해 호출됩니다.
  • 플러그인 함수는 Python 스크립트여야 하며 .py 로 끝나야 합니다.
  • 모든 플러그인 인수는 명령줄에서 명명된 파이프 로그 스크립트로 전달됩니다.
  • 플러그인이 로드되는 시기에 대한 사전 작동 함수를 지정할 수 있습니다.
  • 스크립트가 종료될 때 post-operation 함수를 호출할 수 있습니다.

7.5.3.1. Named Pipe Log Script를 사용하여 플러그인 로드

ds-logpipe.py 에는 플러그인에 사용할 두 가지 옵션이 있습니다.

  • --plugin 옵션은 플러그인 파일의 경로를 제공합니다(Python 스크립트여야 하며 .py로 끝나야 함).
  • plugin.arg 옵션은 플러그인 인수를 명명된 파이프 로그 스크립트에 전달합니다. 플러그인 파일 이름( .py 확장자를 사용하지 않음)은 플러그인 이며 해당 플러그인에서 허용되는 모든 인수는 arg 이 될 수 있습니다.

예를 들면 다음과 같습니다.

ds-logpipe.py /var/log/dirsrc/slapd-example/errors.pipe --plugin=/usr/share/dirsrv/data/example-funct.py example-funct.regex="warning" > warnings.txt

동일한 인수에 대해 전달되는 값이 두 개 이상 있는 경우 플러그인 dict의 값 목록으로 변환됩니다. 예를 들어 이 스크립트는 arg1 에 대해 두 개의 값을 제공합니다.

--plugin=/path/to/pluginname.py pluginname.arg1=foo pluginname.arg1=bar pluginname.arg2=baz

플러그인에서 이 값은 다음과 같이 변환됩니다.

{'arg1': ['foo', 'bar'],
 'arg2': 'baz'}

이는 두 개의 키가 있는 Python dict 오브젝트입니다. 첫 번째 키는 문자열 arg1 이고, 해당 값은 두 개의 요소가 있는 Python 목록 오브젝트이며, 문자열 foobar. 두 번째 키는 문자열 arg2 이고 해당 값은 문자열 baz 입니다. 인수에 단일 값이 있는 경우 간단한 문자열로 유지됩니다. 단일 인수 이름의 여러 값이 문자열 목록으로 변환됩니다.

7.5.3.2. Named Pipe Log Script와 함께 사용할 플러그인 작성

ds-logpipe.py 명령은 플러그인(), pre () 및 post() 와 같은 모든 플러그인에서 3개의 함수를 예상합니다.

ds-logpipe.py 명령과 함께 사용되는 모든 플러그인은 플러그인 기능을 지정해야 합니다.

플러그인() 기능은 로그 데이터의 모든 행에 대해 수행되며, 사전() 및 포스트 () 기능은 스크립트가 시작되고 중지될 때 실행됩니다.

각 함수에는 모든 인수를 정의할 수 있으며, 이러한 인수는 plugin.arg 옵션을 사용하여 스크립트에 전달할 수 있습니다. 또한 각 함수는 자체 반환 값 및 작업을 정의할 수 있습니다.

예 7.8. 간단한 이름 지정된 Pipe Log 플러그인

def pre(myargs):
    retval = True
    myarg = myargs['argname']
    if isinstance(myarg, list): # handle list of values
    else: # handle single value
    if bad_problem:
        retval = False
    return retval

def plugin(line):
    retval = True
    # do something with line
    if something_is_bogus:
        retval = False
    return retval

def post(): # no arguments
    # do something
    # no return value


[1] 오류 로그에서 또는 감사 로깅을 사용하여 로그 수준을 변경하면 서버 성능이 저하됩니다.Server performance suffers when log buffering is disabled on the access log, when the log level is changed on the error log, or with audit logging.
[2] 감사 로그는 기본적으로 활성화되어 있지 않으므로 이름을 지정한 파이프를 교체하기 전에 이 로그를 활성화해야 합니다.