rsyslog가 존재하지 않는 경우 rsyslog에 로그 파일을 생성하도록 어떻게 지시합니까?

rsyslog가 존재하지 않는 경우 rsyslog에 로그 파일을 생성하도록 어떻게 지시합니까?

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

이제 (CentOs, Scientific Linux) rsyslog가 이미 실행 중일 때 로그 파일(예: 애플리케이션 추적 기록 전용 파일)을 삭제한 다음 애플리케이션 rsyslog를 실행하는 것을 확인했습니다.~하지 않을 것이다추적을 기록하지 않는 로그 파일을 만듭니다.

추적을 추가하기 전에 로그 파일이 없는 경우 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 ###

답변1

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

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

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

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

이는 몇 가지 유용한 의미가 있는 버그가 아닌 기능입니다. 예를 들어 rsyslog가 HUP 신호를 수신할 때까지 rsyslog가 회전 후에도(예: /mv-ed 이름 바꾸기) 동일한 로그 파일에 계속 쓰는 이유입니다. 즉, 로그 처리 스크립트와 유틸리티는 타이밍에 매우 주의할 필요가 없습니다. 모든 로그를 회전하고 HUP를 rsyslog로 보내면 로그 데이터 손실 없이 모든 것이 계속 작동합니다.

그런데 rsyslog에서 이런 일이 발생하지 않도록 하는 유일한 방법은 sync()모든 쓰기(또는 적어도 호출)에서 각 로그 파일을 닫았다가 다시 여는 것입니다. 성능이 끔찍할 것입니다.

답변2

$파일 생성 모드

이 옵션으로 원하는 효과를 얻지 못하셨나요?$파일 생성 모드?

발췌

$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 매개변수를 사용하여 이를 수행할 수 있습니다.

발췌옴 파일 모듈

문서

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

시스템 로그에 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'.

관련 정보