programing

Python에서 syslog에 대한 로깅을 구성하는 방법은 무엇입니까?

i4 2023. 9. 8. 21:09
반응형

Python에서 syslog에 대한 로깅을 구성하는 방법은 무엇입니까?

파이썬 집에 정신이 없네요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")

당신이 할 수 있는 다른 일들도 있지만, 그 첫 두 줄만으로도 당신이 요청한 것을 얻을 수 있을 것입니다.

여기와 다른 곳에서 나온 것들을 종합해보면, 이것이 우분투 12.04와 cent에서 작동하는 것입니다.OS6

에서 파일 /etc/rsyslog.d/. text.conf로다를음다e를t고음sd로n.f .

local6.*        /var/log/my-logfile

시작하기 rsyslog이 새 파일에 것 . 즉, 가 하지 에 하지 .기존 콘프 파일만 다시 로드하는 것은 아닐까요?

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 수신 기능이 있어야 합니다.

facility= 사용자를 처리하도록 syslog.conf가 설정되어 있습니까?

facility 인수를 사용하여 python logger에서 사용하는 facility를 다음과 같이 설정할 수 있습니다.

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_IDENTIFER"를 사용하여 LOCAL0 facility에 기록됩니다...로컬 용도로 LOCAL[0-7]을 사용할 수 있습니다.

출처: https://github.com/luismartingil/per.scripts/tree/master/python_syslog

#!/usr/bin/python
# -*- coding: utf-8 -*-

'''
Implements a new handler for the logging module which uses the pure syslog python module.

@author:  Luis Martin Gil
@year: 2013
'''
import logging
import syslog

class SysLogLibHandler(logging.Handler):
    """A logging handler that emits messages to syslog.syslog."""
    FACILITY = [syslog.LOG_LOCAL0,
                syslog.LOG_LOCAL1,
                syslog.LOG_LOCAL2,
                syslog.LOG_LOCAL3,
                syslog.LOG_LOCAL4,
                syslog.LOG_LOCAL5,
                syslog.LOG_LOCAL6,
                syslog.LOG_LOCAL7]
    def __init__(self, n):
        """ Pre. (0 <= n <= 7) """
        try:
            syslog.openlog(logoption=syslog.LOG_PID, facility=self.FACILITY[n])
        except Exception , err:
            try:
                syslog.openlog(syslog.LOG_PID, self.FACILITY[n])
            except Exception, err:
                try:
                    syslog.openlog('my_ident', syslog.LOG_PID, self.FACILITY[n])
                except:
                    raise
        # We got it
        logging.Handler.__init__(self)

    def emit(self, record):
        syslog.syslog(self.format(record))

if __name__ == '__main__':
    """ Lets play with the log class. """
    # Some variables we need
    _id = 'myproj_v2.0'
    logStr = 'debug'
    logFacilityLocalN = 1

    # Defines a logging level and logging format based on a given string key.
    LOG_ATTR = {'debug': (logging.DEBUG,
                          _id + ' %(levelname)-9s %(name)-15s %(threadName)-14s +%(lineno)-4d %(message)s'),
                'info': (logging.INFO,
                         _id + ' %(levelname)-9s %(message)s'),
                'warning': (logging.WARNING,
                            _id + ' %(levelname)-9s %(message)s'),
                'error': (logging.ERROR,
                          _id + ' %(levelname)-9s %(message)s'),
                'critical': (logging.CRITICAL,
                             _id + ' %(levelname)-9s %(message)s')}
    loglevel, logformat = LOG_ATTR[logStr]

    # Configuring the logger
    logger = logging.getLogger()
    logger.setLevel(loglevel)

    # Clearing previous logs
    logger.handlers = []

    # Setting formaters and adding handlers.
    formatter = logging.Formatter(logformat)
    handlers = []
    handlers.append(SysLogLibHandler(logFacilityLocalN))
    for h in handlers:
        h.setFormatter(formatter)
        logger.addHandler(h)

    # Yep!
    logging.debug('test debug')
    logging.info('test info')
    logging.warning('test warning')
    logging.error('test error')
    logging.critical('test critical')

다음은 3.2 이상에 권장되는 yaml dictConfig 방법입니다.

로그인cfg.yml:

version: 1
disable_existing_loggers: true

formatters:
    default:
        format: "[%(process)d] %(name)s(%(funcName)s:%(lineno)s) - %(levelname)s: %(message)s"

handlers:
    syslog:
        class: logging.handlers.SysLogHandler
        level: DEBUG
        formatter: default
        address: /dev/log
        facility: local0

    rotating_file:
        class: logging.handlers.RotatingFileHandler
        level: DEBUG
        formatter: default
        filename: rotating.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

root:
    level: DEBUG
    handlers: [syslog, rotating_file]
    propogate: yes

loggers:
    main:
        level: DEBUG
        handlers: [syslog, rotating_file]
        propogate: yes

다음을 사용하여 구성을 로드합니다.

log_config = yaml.safe_load(open('cfg.yml'))
logging.config.dictConfig(log_config)

syslog와 직접 파일을 모두 구성했습니다.참고하세요./dev/logOS에 따라 다릅니다.

제 공책에 그것을 고칩니다.소켓 서비스에서 rsyslog 서비스가 수신되지 않았습니다.

아래 라인을 구성합니다./etc/rsyslog.conf파일을 작성하고 문제를 해결했습니다.

$SystemLogSocketName /dev/log

저는 JSON logging을 사용하고 UDP 포트 514와 함께 SysLogHandler를 사용하고 싶었습니다.결국 JSON 핸들러 구성이 작동하게 되었습니다.핸들러 섹션에는 다음과 같은 내용이 있습니다.

{
    "syslog": {
        "class": "logging.handlers.SysLogHandler",
        "address": ["127.0.0.1", 514],
        "facility": "local6",
        "formatter": "syslog_fmt"
}

다른 곳에선 못 찾았어요

[편집] 여기서 무슨 일이 일어나고 있는지 더 명확하게 하기 위해: 이것은 오직 파이썬 코드를 위한 것이고, 파이썬의 내장된 로깅 모듈을 사용하는 것입니다.모듈은 로그 메시지의 형식과 대상을 구성할 수 있도록 합니다.로그 형식과 대상을 구성하는 한 가지 방법은 로그를 구성하는 데 사용되는 JSON 파일을 사용하는 것입니다.

위의 예를 통해 로그 메시지를 syslog 데몬으로 보낼 수 있었습니다.

이러한 파일의 전체 예시는 아래에 나와 있습니다.

{
    "version": 1,
    "disable_existing_loggers": "False",
    "formatters": {
        "verbose": {
            "format": "%(asctime)s:%(levelname)s:%(process)d:%(filename)s:%(funcName)s:L%(lineno)d:%(message)s"
        },
        "syslog": {
            "format": "%(levelname)s:%(process)d:%(filename)s:%(funcName)s:L%(lineno)d:%(message)s"
        }
    },
    "handlers": {
        "console": {
            "class":"logging.StreamHandler",
            "formatter": "standard"
        },
        "syslog": {
        "class": "logging.handlers.SysLogHandler",
        "address": ["127.0.0.1", 514],
        "facility": "local6",
        "formatter": "syslog_fmt"
        }
    },
    "loggers": {
        "": {
            "handlers": ["console","syslog"],
            "level": "DEBUG",
            "propagate": "True"
        }
    }
}

위의 예제는 syslog와 콘솔 모두에 python 로그 메시지를 보냅니다.대상에 대한 메시지 형식이 다릅니다(syslog는 이미 각 메시지 앞에 타임스탬프가 있음).syslog 대상의 경우 로그는 LOCAL6 기능을 사용합니다.

파일 핸들러 또는 회전 파일 핸들러를 추가하여 로그를 로컬 파일(http://docs.python.org/2/library/logging.handlers.html 로 보낼 수도 있습니다.

언급URL : https://stackoverflow.com/questions/3968669/how-to-configure-logging-to-syslog-in-python

반응형