পাইথনে সিগ্লগে লগিং কীভাবে কনফিগার করবেন?


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

কিন্তু এই স্ক্রিপ্টটি সিসলগে কোনও লগ রেকর্ড তৈরি করে না। কোনো সমস্যা?


3
আপনি কোথায় সিসলগ বার্তা পরীক্ষা করছেন? সিসলগহ্যান্ডলার () লোকালহোস্টের 514 পোর্টে এই বার্তাগুলি সকেটকে ইউডিপি করতে প্রেরণ করে।
সুজনশক্যা

তুমি একদমই সঠিক. আমি দেখা করেছি যে 'স্থানীয় হোস্ট-514' ডকুমেন্টেশন কিন্তু চিন্তা না হয় / dev / লগ ডিফল্টরূপে ব্যবহার করা উচিত .. দীর্ঘশ্বাস ফেলা ..
Thor

উত্তর:


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'ওএস এক্স
অফবি 1


3
আমরা কীভাবে সিসলগে এই লগগুলি সনাক্ত করতে পারি? যেমন আমরা কোনও অ্যাপ্লিকেশন নাম দিতে পারি বা সিস্লগটাগ = জ্যাঙ্গোর মতো কোনও ট্যাগ দিতে পারি?
Luv33preet

এবং /etc/syslog.d/conf ফাইলটি কনফিগার করুন এবং
সিসলগ

5
@ ল্যুভ 33প্রীত আমি পরীক্ষার জন্য এটির মতো একটি ফর্ম্যাটর (তবে ছাড়াই নয়) logging.Formatter(fmt='myscriptname[%(process)d]: %(levelname)s: %(message)s', ...), একটি কাজের মতো আরএসলগ শর্ত রয়েছে $programname == 'myscriptname'
পিটার

26

TCP স্ট্যাকের মাধ্যমে / dev / লগ করুন বা লোকালহোস্ট হোক না কেন আপনার সর্বদা স্থানীয় হোস্টটি লগিংয়ের জন্য ব্যবহার করা উচিত । এটি সম্পূর্ণরূপে আরএফসি অনুবর্তী এবং ফিচারাল সিস্টেম লগিং ডেমনকে সিসলগ হ্যান্ডেল করতে দেয়। এটি দূরবর্তী ডেমনকে কার্যক্ষম করার প্রয়োজনীয়তা দূর করে এবং উদাহরণস্বরূপ সিস্টেলগ ডেমনের যেমন আরএসিসলগ এবং সিসলগ-এনজি এর বর্ধিত ক্ষমতা সরবরাহ করে। একই দর্শন এসএমটিপিতে যায়। এটি কেবল স্থানীয় এসএমটিপি সফ্টওয়্যারকে দিয়ে দিন। এই ক্ষেত্রে ডেমনটি নয় 'প্রোগ্রাম মোড' ব্যবহার করুন, তবে এটি একই ধারণা। আরও সক্ষম সফ্টওয়্যার এটি পরিচালনা করতে দিন। সিসলগের জন্য ইউডিপির পরিবর্তে টিসিপি ব্যবহার করে পুনরায় চেষ্টা করা, কুইন করা, স্থানীয় স্পুলিং করা এবং এর ফলে আরও সম্ভব become আপনি এই ডিমনগুলি যেভাবে হওয়া উচিত সেটিকে আলাদা করে কনফিগার করতে পারেন [পুনরায়]।

আপনার অ্যাপ্লিকেশনটির জন্য আপনার কোডিং সংরক্ষণ করুন, অন্য সফ্টওয়্যারকে কনসার্টে এটি কাজ করতে দিন।


2
আপনি একটি সুস্পষ্ট পয়েন্ট উত্থাপন। আপনি লগিং ডেমন দ্বারা ব্যবহৃত সাধারণ ঠিকানা এবং পোর্টগুলি নির্দেশ করতে পারেন? ডিমন টিসিপি সকেটের সাথে আবদ্ধ কিনা তা নির্ধারণের জন্য কি কোনও মান আবিষ্কারের ব্যবস্থা আছে?
init_js

আমি আপনার সাথে সম্পূর্ণ একমত।
ডাকস

20

আপনার বর্ণিত মৌলিক লগিং আচরণটি পাওয়া বেশ সহজ করার জন্য আমি সিসলগ মডিউলটি পেয়েছি :

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

এছাড়াও আপনি করতে পারেন এমন আরও কিছু জিনিস রয়েছে তবে তার প্রথম দুটি লাইনই আমি যা বুঝতে পেরেছিলাম তা আপনি পেয়ে যাবেন।


আমি লগিং মডিউলটি রাখি কারণ এটি সমস্ত বিবৃতিকে প্রভাবিত না করে লগার সেটিংস পরিবর্তন করতে দেয় allows আপনি সেই সময়ে বিভিন্ন ধরণের লগিং করতে চান এমন ক্ষেত্রে আচরণ পরিবর্তন করতেও অনুমতি দেয়
চাচান

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
CentOS7 এ rsyslog পুনঃসূচনা করতে,sudo service rsyslog restart
Radtek

12

আমি যে কাউকে সাহায্য করি সে ক্ষেত্রে আমি কিছুটা অতিরিক্ত মন্তব্য যুক্ত করি কারণ আমি এই বিনিময়টি দরকারী বলে খুঁজে পেয়েছি তবে এটি সমস্ত কাজ করার জন্য এই অল্প অতিরিক্ত বিট তথ্য প্রয়োজন।

সিসলগহ্যান্ডলার ব্যবহার করে একটি নির্দিষ্ট সুবিধা লগ ইন করার জন্য আপনাকে সুবিধার মানটি নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ বলুন যে আপনি সংজ্ঞায়িত করেছেন:

local3.* /var/log/mylog

সিস্লগ-এ, তারপরে আপনি ব্যবহার করতে চাইবেন:

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

এবং / ডি / লগের পরিবর্তে লোকালহোস্ট ব্যবহার করতে আপনার ইউডিপিতে সিসলগ শোনানোও দরকার।


3
ইউডিপিতে সিসলগ শোনার কোনও দরকার নেই is আপনার উদাহরণ ঠিকানা = '/ dev / লগ' এর সাথেও পুরোপুরি কাজ করবে।
Thor

5
হ্যাঁ, অবশ্যই, তবে ঠিকানার সাথে = ('লোকালহোস্ট', ৫১৪), যেদিন আপনার লগ সার্ভার রয়েছে, আপনি সার্ভারের ঠিকানায় লোকালহোস্টটি প্রতিস্থাপন করবেন এবং রিমোট লগিং পেয়েছেন ;-)
অলিভার হেনরিট

5
সুবিধা = 19 কোথা থেকে আসে? কেন এটি সুবিধা নেই = "স্থানীয় 3"
বোটকোডার

4
@ মার্ক0978 19 হ'ল স্থানীয় 3 এর সাংখ্যিক উপস্থাপনা যা আরএফসি 3146 (এবং পরবর্তীকালে আরএফসি5424) দ্বারা সংজ্ঞায়িত হয়েছে
অ্যান্ড্রু স্লেজ

3
আমি এটি সম্পর্কেও অবাক হয়েছি, এবং খুঁজে পেয়েছি যে সুবিধা কোডগুলি পাইথনের সিসলোগহ্যান্ডলারের জন্য রয়েছে
ক্লিবিও

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 সুবিধাতে লগ ইন করবে ... আপনি স্থানীয় উদ্দেশ্যে স্থানীয় [0-7] ব্যবহার করতে পারেন।


1
আপনার মন্তব্য কিছুই আসল অনুরোধটি কি আছে
Thor

@ তবে আমি সম্মত হবো যে এটি প্রাসঙ্গিক। আমি অনুমান করতে যাচ্ছি যে সিসলগ প্যাকেজটি খাঁটি পাইথন বাস্তবায়নের চেয়ে কিছুটা দক্ষ? (যদি কম নমনীয় হয়)
ড্যানিয়েল সান্তোস

7

Https://github.com/luismartingil/per.scriptts/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')

এটি অত্যন্ত আকর্ষণীয়, তবে এটি পাইথন ২.6..6 (আরএইচএল .4.৪) এ কাজ করে না: ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): ফাইল "সিসলগ_ব্রিজ.পি", লাইন 68, <মডুল> হ্যান্ডলারস অ্যাপেন্ডে (সিসলোগলিবহ্যান্ডলার (লগ ফ্যাকিলিটিলোকলএন )) "Syslog_bridge.py" ফাইলটি 29, init syslog.openlog-এ (syslog.LOG_PID, স্ব.ফ্যাসিলিটি [এন]) টাইপ এরর: আইডেন্ট স্ট্রিং [, লোগোপশন [, সুবিধা]]
স্টিভ কোহেন


3

এখানে যামল ডিক্টনফিগ উপায়টি ৩.২ বা তার পরে প্রস্তাবিত।

লগ ইন 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/logওএস নির্দিষ্ট।


1

আমি আমার নোটবুকে এটি ঠিক করেছি। আরএসল্লগ পরিষেবা সকেট পরিষেবাটি শোনেনি।

আমি এই লাইনটি /etc/rsyslog.confফাইলটিতে কনফিগার করেছি এবং সমস্যার সমাধান করেছি:

$SystemLogSocketName /dev/log


-1

স্থানীয় ফাইলগুলিতে আপনার লগগুলি প্রেরণ করতে আপনি কোনও ফাইল হ্যান্ডলার বা ঘোরানো ফাইল হ্যান্ডলার যুক্ত করতে পারেন: http://docs.python.org/2/library/logging.handlers.html


3
একাধিক প্রক্রিয়া চালাতে চাইলে খুব কার্যকর নয়।
aloreলোরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.