[unix] 로그 파일이 없으면 rsyslog에 지시하는 방법?

rsyslog의 기본 동작은 기존 로그 파일에 추적을 추가하는 것 입니다.

rsyslog가 이미 실행 중일 때 로그 파일 (예 : 응용 프로그램의 로그 추적 전용 파일)을 삭제 한 다음 응용 프로그램을 실행하면 rsyslog 로그 파일을 만들지 않습니다 (CentOs, Scientific Linux). 추적이 기록되지 않습니다.

추적 파일을 추가하기 전에 rsyslog에 로그 파일이 없으면 로그 파일을 작성하도록 지시 할 수있는 구성 옵션이 있습니까?

참고 : service rsyslog restart빈 로그 파일을 강제로 작성하면됩니다.

rsyslog.conf (아무것도 추가되지 않음)

# rsyslog v5 configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
#$ModLoad immark  # provides --MARK-- message capability

$SystemLogRateLimitInterval 1
$SystemLogRateLimitBurst 50000

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514


#### GLOBAL DIRECTIVES ####

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf


#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none    /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog


# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$WorkDirectory /var/lib/rsyslog # where to place spool files
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList   # run asynchronously
#$ActionResumeRetryCount -1    # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
# ### end of the forwarding rule ###



답변

rsyslog의 POV에서 삭제 된 로그 파일이 여전히 존재합니다. rsyslog가 파일 이름을 쓰지 않고 로그 파일을 위해 열린 파일 핸들에 쓰려고하기 때문입니다.

유닉스 시스템은 파일에 열린 핸들이있는 프로세스가 없을 때까지 실제로 파일을 삭제하지 않습니다. 즉, 열려있는 모든 파일 핸들을 닫을 때까지 삭제 된 파일에 사용 된 디스크 공간이 비워지지 않습니다. 또한 삭제 된 파일에 대한 열린 파일 핸들이있는 프로세스가 파일을 계속 읽거나 파일에 쓸 수 있음을 의미합니다.

rsyslog에 HUP 신호를 보내면 (예 : pkill -HUP rsyslog또는 /etc/init.d/rsyslog rotate) rsyslog에 열려있는 모든 파일을 닫고 구성 파일을 다시로드 한 후 쓰기 위해 모든 로그 파일을 다시 열어서 기록해야합니다 (필요한 경우 작성).

rsyslogd를 다시 시작해도 작동합니다.

이것은 rsyslog가 HUP 신호를 수신 할 때까지 rsyslog가 회전 된 후에도 (즉, 이름이 바뀌거나 / mv-ed 인 경우) rsyslog가 동일한 로그 파일에 계속 기록하는 이유입니다. 이는 로그 처리 스크립트 및 유틸리티가 타이밍에 대해 신중하게주의 할 필요가 없음을 의미합니다. 모든 로그를 회전하고 rsyslog에 HUP를 전송하면 로그 데이터 손실없이 모든 것이 계속 작동합니다.

BTW, rsyslog에서 이러한 일이 발생하지 않는 유일한 방법은 모든 쓰기 (또는 적어도 호출 sync()) 에서 모든 로그 파일을 닫았다가 다시 여는 경우에만 가능합니다 . 성능이 심할 것입니다.


답변

$ FileCreateMode

이 옵션이 원하는대로하지 않습니까 , $ FileCreateMode ?

발췌

$FileCreateMode 0600

This sample lets rsyslog create files with read and write access only for the
users it runs under.

The following sample is deemed to be a complete rsyslog.conf:

$umask 0000 # make sure nothing interferes with the following definitions
*.* /var/log/file-with-0644-default
$FileCreateMode 0600
*.* /var/log/file-with-0600
$FileCreateMode 0644

*.* /var/log/file-with-0644

파일 출력 모듈

rsyslog 문서에 따르면 파일 출력 모듈의 File 인수를 사용하여이를 수행 할 수 있습니다.

발췌 된 omfile 모듈

파일

파일이 이미 존재하면 새 데이터가 추가됩니다. 기존 데이터가 잘리지 않습니다. 파일이 없으면 작성됩니다. rsyslogd가 활성화되어있는 동안 파일은 열린 상태로 유지됩니다. 이것은 외부 로그 파일 회전과 충돌합니다. 회전 후 파일을 닫으려면 파일이 회전 된 후 rsyslogd에 HUP 신호를 보냅니다.

syslog에게 HUP 신호 보내기

이 작업을 수행하려면 rsyslog를 “트리거”해야한다고 생각합니다. 나는 그것이 당신이 자동으로 원하는 것이라고 생각하지 않습니다. 따라서 로그 파일이 삭제 된 후 재 작성을 트리거하도록 HUP 신호를 제공 할 수 있습니다.

$ sudo pkill -HUP rsyslog

이렇게하면 내 /var/log/messages로그 파일 에 다음 메시지가 생성 됩니다.

Sep 26 15:16:17 grinchy rsyslogd: [origin software="rsyslogd" swVersion="4.6.3" x-pid="1245" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.
Sep 26 15:16:44 grinchy rsyslogd: [origin software="rsyslogd" swVersion="4.6.3" x-pid="1245" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.


답변