나는 파이썬 logging
모듈에 대해 머리를 쓸 수 없습니다 . 내 요구 사항은 매우 간단합니다. 모든 것을 syslog에 기록하고 싶습니다. 문서를 읽은 후 다음과 같은 간단한 테스트 스크립트를 만들었습니다.
import logging
import logging.handlers
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler()
my_logger.addHandler(handler)
my_logger.debug('this is debug')
my_logger.critical('this is critical')
그러나이 스크립트는 syslog에 로그 레코드를 생성하지 않습니다. 뭐가 문제 야?
답변
줄을 다음과 같이 변경하십시오.
handler = SysLogHandler(address='/dev/log')
이것은 나를 위해 작동합니다
import logging
import logging.handlers
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
handler = logging.handlers.SysLogHandler(address = '/dev/log')
my_logger.addHandler(handler)
my_logger.debug('this is debug')
my_logger.critical('this is critical')
답변
/ dev / log 또는 TCP 스택을 통한 localhost에 관계없이 항상 로컬 호스트를 사용하여 로깅 해야합니다 . 이를 통해 RFC를 완전히 준수하고 기능이있는 시스템 로깅 데몬이 syslog를 처리 할 수 있습니다. 이렇게하면 원격 데몬이 작동 할 필요가 없으며 예를 들어 rsyslog 및 syslog-ng와 같은 syslog 데몬의 향상된 기능을 제공합니다. SMTP에도 동일한 철학이 적용됩니다. 로컬 SMTP 소프트웨어에 전달하기 만하면됩니다. 이 경우 데몬이 아닌 ‘프로그램 모드’를 사용하지만 같은 생각입니다. 더 유능한 소프트웨어가 처리하도록하십시오. 재시도, 큐잉, 로컬 스풀링, syslog 용 UDP 대신 TCP 사용 등이 가능해집니다. 또한 해당 데몬을 코드와 별도로 [재-] 구성 할 수 있습니다.
응용 프로그램에 대한 코딩을 저장하고 다른 소프트웨어가 함께 작업하도록하십시오.
답변
설명하는 기본 로깅 동작을 쉽게 얻을 수 있도록 syslog 모듈 을 찾았 습니다 .
import syslog
syslog.syslog("This is a test message")
syslog.syslog(syslog.LOG_INFO, "Test message at INFO priority")
당신이 할 수있는 다른 일들도 있지만, 그것의 처음 두 줄만 내가 이해하는대로 당신이 요청한 것을 얻을 수있을 것입니다.
답변
여기와 다른 곳에서 사물을 결합하여 unbuntu 12.04 및 centOS6에서 작동하는 것이 제가 생각해 낸 것입니다.
/etc/rsyslog.d/
.conf로 끝나는 파일을 만들고 다음 텍스트를 추가하십시오.
local6.* /var/log/my-logfile
다시 시작 rsyslog
, 다시로드가 새 로그 파일에 대해 작동하지 않는 것 같습니다. 아마도 기존 conf 파일 만 다시로드할까요?
sudo restart rsyslog
그런 다음이 테스트 프로그램을 사용하여 실제로 작동하는지 확인할 수 있습니다.
import logging, sys
from logging import config
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(module)s P%(process)d T%(thread)d %(message)s'
},
},
'handlers': {
'stdout': {
'class': 'logging.StreamHandler',
'stream': sys.stdout,
'formatter': 'verbose',
},
'sys-logger6': {
'class': 'logging.handlers.SysLogHandler',
'address': '/dev/log',
'facility': "local6",
'formatter': 'verbose',
},
},
'loggers': {
'my-logger': {
'handlers': ['sys-logger6','stdout'],
'level': logging.DEBUG,
'propagate': True,
},
}
}
config.dictConfig(LOGGING)
logger = logging.getLogger("my-logger")
logger.debug("Debug")
logger.info("Info")
logger.warn("Warn")
logger.error("Error")
logger.critical("Critical")
답변
나는이 교환이 유용하다는 것을 알았 기 때문에 누군가에게 도움이되는 경우를 대비하여 약간의 추가 의견을 추가했지만 모든 것이 작동하려면 약간의 추가 정보가 필요했습니다.
SysLogHandler를 사용하여 특정 시설에 기록하려면 시설 값을 지정해야합니다. 예를 들어 다음과 같이 정의했습니다.
local3.* /var/log/mylog
syslog에서 다음을 사용하고 싶을 것입니다.
handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)
또한 / dev / log 대신 localhost를 사용하려면 UDP에서 수신 대기하는 syslog가 있어야합니다.
답변
syslog.conf가 시설 = 사용자를 처리하도록 설정되어 있습니까?
다음과 같이 시설 인수를 사용하여 파이썬 로거가 사용하는 시설을 설정할 수 있습니다.
handler = logging.handlers.SysLogHandler(facility=SysLogHandler.LOG_DAEMON)
답변
import syslog
syslog.openlog(ident="LOG_IDENTIFIER",logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0)
syslog.syslog('Log processing initiated...')
위의 스크립트는 사용자 정의 “LOG_IDENTIFIER”를 사용하여 LOCAL0 시설에 기록합니다 … 로컬 용도로 LOCAL [0-7]을 사용할 수 있습니다.
