पाइथन में लॉगिंग को syslog में कैसे कॉन्फ़िगर करें?


121

मैं पायथन के loggingमॉड्यूल के आसपास अपना सिर नहीं पा सकता हूं । मेरी ज़रूरतें बहुत सरल हैं: मैं बस सब कुछ लॉग इन करना चाहता हूं। प्रलेखन पढ़ने के बाद मैं इस सरल परीक्षण स्क्रिप्ट के साथ आया:

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 में कोई लॉग रिकॉर्ड नहीं बनाती है। क्या गलत है?


3
आप अपने syslog संदेशों की जाँच कहाँ कर रहे हैं? SysLogHandler () उन संदेशों को लोकलहोस्ट में पोर्ट 514 में udp सॉकेट के लिए उत्सर्जित करता है।
१21

आप बिल्कुल सही कह रहे है। और मैंने देखा है कि प्रलेखन में 'लोकलहोस्ट -514', लेकिन यह नहीं सोचा है कि / देव / लॉग डिफ़ॉल्ट रूप से उपयोग किया जाना चाहिए .. आह ..
थोर

जवाबों:


140

लाइन को इसमें बदलें:

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')

12
ध्यान दें, जैसा कि डॉक्टर कहते हैं, '/var/run/syslog'OS X पर राइट थिंग है।
offby1


3
हम इन लॉग को syslog में कैसे पहचान सकते हैं? जैसे हम कोई भी एप्लिकेशन नाम दे सकते हैं या syslogtag = django जैसे कोई भी टैग दे सकते हैं?
Lu3333preet

और याद रखें /etc/syslog.d/conf फ़ाइल कॉन्फ़िगर करें, और syslog / rsyslog सेवा को पुनः आरंभ करें
linrongbin

5
@ Luv33preet मैंने परीक्षण किया है कि (लेकिन बिना नहीं) एक फ़ॉर्मैटर की तरह logging.Formatter(fmt='myscriptname[%(process)d]: %(levelname)s: %(message)s', ...), $programname == 'myscriptname'काम की तरह एक rsyslog स्थिति ।
पीटर

26

तुम्हे करना चाहिए टीसीपी स्टैक के माध्यम से लॉगिंग के लिए हमेशा स्थानीय होस्ट का उपयोग , चाहे / देव / लॉग या लोकलहोस्ट करना हो। यह पूरी तरह से RFC आज्ञाकारी और सुविधापूर्ण प्रणाली लॉगिंग डेमॉन को syslog को संभालने की अनुमति देता है। यह दूरस्थ डेमॉन के कार्यात्मक होने की आवश्यकता को समाप्त करता है और उदाहरण के लिए syslog डेमॉन जैसे कि rysyslog और syslog-ng की बढ़ी हुई क्षमता प्रदान करता है। एक ही दर्शन SMTP के लिए जाता है। बस इसे स्थानीय एसएमटीपी सॉफ्टवेयर को सौंप दें। इस मामले में 'प्रोग्राम मोड' का उपयोग डेमॉन नहीं, बल्कि यह एक ही विचार है। अधिक सक्षम सॉफ़्टवेयर को इसे संभालने दें। Syslog और इसके बाद के लिए UDP के बजाय TCP का उपयोग करके पुन: प्रयास करना, कतारबद्ध करना, स्थानीय स्पूलिंग करना संभव हो गया है। आप उन रीमों को भी अपने कोड से अलग कर सकते हैं जिन्हें यह होना चाहिए।

अपने एप्लिकेशन के लिए अपनी कोडिंग सहेजें, अन्य सॉफ़्टवेयर को कॉन्सर्ट में काम करने दें।


2
आप एक उचित मुद्दा उठाते हैं। क्या आप विभिन्न लॉगिंग डेमॉन द्वारा उपयोग किए जाने वाले सामान्य पते और पोर्ट इंगित कर सकते हैं? क्या यह निर्धारित करने के लिए कोई मानक खोज तंत्र है कि डेमॉन tcp सॉकेट से जुड़ा है या नहीं?
init_js

मैं आपसे पूरी तरह सहमत हूं।
डेक्स

20

मुझे आपके द्वारा वर्णित मूल लॉगिंग व्यवहार को प्राप्त करने में काफी आसान बनाने के लिए syslog मॉड्यूल मिला :

import syslog
syslog.syslog("This is a test message")
syslog.syslog(syslog.LOG_INFO, "Test message at INFO priority")

अन्य चीजें भी हैं जो आप कर सकते हैं, लेकिन यहां तक ​​कि उसकी पहली दो पंक्तियां भी आपको वही मिलेंगी, जो आपने मुझसे मांगी थीं।


मैं लॉगिंग मॉड्यूल रखता हूं क्योंकि यह सभी कथनों को प्रभावित किए बिना लकड़हारा सेटिंग को बदलने की अनुमति देता है। यदि आप उस समय अलग-अलग प्रकार की लॉगिंग करना चाहते हैं, तो व्यवहार को बदलने की अनुमति देता है
chachan

14

यहाँ और अन्य स्थानों से चीजों को एक साथ मिलाते हुए, यह वही है जो मैं 12.04 और सेंटोस 6 पर काम करता है

/etc/rsyslog.d/उस फ़ाइल को अंत में .conf में बनाएँ और निम्नलिखित पाठ जोड़ें

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")

1
सेंटोस 7 पर rsyslog को पुनः आरंभ करने के लिए,sudo service rsyslog restart
radtek

12

मैं इसमें कुछ अतिरिक्त टिप्पणी करता हूँ क्योंकि यह किसी को भी मदद करता है क्योंकि मुझे यह विनिमय उपयोगी लगा लेकिन इसे काम करने के लिए इस थोड़ी अतिरिक्त जानकारी की आवश्यकता थी।

SysLogHandler का उपयोग करके एक विशिष्ट सुविधा में प्रवेश करने के लिए आपको सुविधा मान निर्दिष्ट करने की आवश्यकता होती है। उदाहरण के लिए कहें कि आपने परिभाषित किया है:

local3.* /var/log/mylog

syslog में, तब आप उपयोग करना चाहेंगे:

handler = logging.handlers.SysLogHandler(address = ('localhost',514), facility=19)

और आपको UDP पर / dev / log के बजाय लोकलहोस्ट का उपयोग करने के लिए syslog सुनने की आवश्यकता है।


3
UDP पर syslog सुनने की कोई 'आवश्यकता' नहीं है। आपका उदाहरण पूरी तरह से एड्रेस = '/ देव / लॉग' के साथ काम करेगा।
थोर

5
हां, निश्चित, लेकिन पते के साथ = ('लोकलहोस्ट', 514), जिस दिन आपके पास लॉग सर्वर होगा, आप लोकलहोस्ट को सर्वर के पते से बदल देंगे और आपको रिमोट लॉगिंग मिल जाएगी ;-)
ओलिवर हेनरीट

5
सुविधा = 19 कहां से आती है? यह सुविधा क्यों नहीं है = "लोकल 3"
नाविक

4
@ Mark0978 19 RFC3146 (और बाद में RFC5424) द्वारा परिभाषित स्थानीय 3 का संख्यात्मक प्रतिनिधित्व है
एंड्रयू

3
मैंने इस बारे में भी सोचा, और पाया कि सुविधा कोड पाइथन के SysLogHandler के
Clebio

11

क्या आपका syslog.conf सुविधा = उपयोगकर्ता को संभालने के लिए स्थापित है?

आप अजगर लॉगर द्वारा उपयोग की जाने वाली सुविधा को सुविधा तर्क के साथ सेट कर सकते हैं, कुछ इस तरह से:

handler = logging.handlers.SysLogHandler(facility=SysLogHandler.LOG_DAEMON)

आपको निर्दिष्ट करने की आवश्यकता है कि LOG_DAEMONआप facilityपैरामीटर के लिए एक मूल्य के रूप में क्या प्रदान करते हैं ।
tzot

4
वह होगा SysLogHandler.LOG_DAEMON
क्रेग ट्रेडर

7
import syslog
syslog.openlog(ident="LOG_IDENTIFIER",logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0)
syslog.syslog('Log processing initiated...')

उपरोक्त स्क्रिप्ट हमारे कस्टम "LOG_IDENTIFIER" के साथ LOCAL0 सुविधा में प्रवेश करेगी ... आप स्थानीय उद्देश्य के लिए LOCAL [4-7] का उपयोग कर सकते हैं।


1
आपकी टिप्पणी का मूल अनुरोध से कोई लेना-देना नहीं है
थोर

@ मैं सहमत हूँ कि यह प्रासंगिक है। मैं यह अनुमान लगाने जा रहा हूं कि शुद्ध पायथन कार्यान्वयन की तुलना में सिसलॉग पैकेज थोड़ा अधिक कुशल है? (यदि कम लचीला है)
डैनियल सैंटोस

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')

यह बहुत दिलचस्प है, लेकिन यह अजगर 2.6.6 (आरएचईएल 6.4) पर काम नहीं करता है: ट्रैसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "syslog_bridge.py", लाइन 68, में <मॉड्यूल> हैंडलर.एपेंड (SLLogLibHandler (logFacilityLocalNocal) )) फ़ाइल "syslog_bridge.py", पंक्ति 29, init syslog.openlog (syslog.LOG_PID, self.FACILITY [n]) टाइपरोर: पहचान स्ट्रिंग [, लॉगॉप्शन [सुविधा]]]
स्टीव कोहेन

के आधार पर संपादित: github.com/luismartingil/scripts/commit/…
luismartingil

3

यहाँ 3.2 और बाद के लिए अनुशंसित यमल तानाशाह रास्ता है।

लॉग में 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 विशिष्ट है।


1

मैं इसे अपनी नोटबुक पर ठीक करता हूं। Rsyslog सेवा सॉकेट सेवा पर नहीं सुनी।

मैं इस लाइन को /etc/rsyslog.confफाइल में कॉन्फ़िगर करता हूं और समस्या को हल करता हूं :

$SystemLogSocketName /dev/log


-1

अपने लॉग को स्थानीय फ़ाइल में भेजने के लिए आप एक फ़ाइल हैंडलर या रोटेटिंग फ़ाइल हैंडलर भी जोड़ सकते हैं: http://docs.python.org/2/library/logging.handlers.html


3
बहुत उपयोगी नहीं है यदि आप एक से अधिक प्रक्रिया चलाना चाहते हैं।
१ .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.