Как настроить ведение журнала в системный журнал в Python?

Я не могу разобраться с модулем Python 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')

Но этот скрипт не создает никаких записей в системном журнале. Что не так?

101 голос | спросил thor 19 +04002010-10-19T17:11:38+04:00312010bEurope/MoscowTue, 19 Oct 2010 17:11:38 +0400 2010, 17:11:38

10 ответов


0

Измените строку на эту:

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')
ответил dr jimbob 19 +04002010-10-19T19:03:39+04:00312010bEurope/MoscowTue, 19 Oct 2010 19:03:39 +0400 2010, 19:03:39
0

Вы должны всегда использовать локальный хост для ведения журнала, будь то /dev /log или localhost через стек TCP. Это позволяет полностью совместимому с RFC и многофункциональному системному журналу регистрации обрабатывать системный журнал. Это устраняет необходимость в работе удаленного демона и обеспечивает расширенные возможности, например, таких демонов syslog, как rsyslog и syslog-ng. Та же философия относится и к SMTP. Просто передайте это локальному программному обеспечению SMTP. В этом случае используйте «программный режим», а не демон, но это та же идея. Позвольте более способному программному обеспечению справиться с этим. Становятся возможными повторные попытки, постановка в очередь, локальная буферизация, использование TCP вместо UDP для системного журнала и т. Д. Вы также можете [заново] настроить эти демоны отдельно от своего кода, как и должно быть.

Сохраните код для своего приложения, позвольте другому программному обеспечению выполнять свою работу согласованно.

ответил egrep 17 Jpm1000000pmThu, 17 Jan 2013 21:12:36 +040013 2013, 21:12:36
0

Собирая все воедино отсюда и из других мест, это то, что я придумал, это работает на 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")
ответил boatcoder 14 +04002013-10-14T22:56:11+04:00312013bEurope/MoscowMon, 14 Oct 2013 22:56:11 +0400 2013, 22:56:11
0

Я нашел модуль syslog , чтобы упростить получение описанного вами базового поведения ведения журнала:

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

Есть и другие вещи, которые вы могли бы сделать, но даже первые две строчки из них помогут вам получить то, о чем вы просили, насколько я понимаю.

ответил lindes-hw 16 J000000Wednesday14 2014, 01:16:00
0

Я добавляю небольшой дополнительный комментарий на тот случай, если он кому-нибудь поможет, потому что я нашел этот обмен полезным, но мне нужно было немного дополнительной информации, чтобы все это заработало.

Чтобы войти в конкретный объект с помощью SysLogHandler, необходимо указать значение объекта. Скажем, например, что вы определили:

local3.* /var/log/mylog

в системном журнале, тогда вы захотите использовать:

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

и вам также нужно прослушивать системный журнал по UDP, чтобы использовать localhost вместо /dev /log.

ответил Oliver Henriot 9 MarpmFri, 09 Mar 2012 14:56:09 +04002012-03-09T14:56:09+04:0002 2012, 14:56:09
0

Ваш syslog.conf настроен для обработки средства = пользователя?

Вы можете установить средство, используемое регистратором Python, с помощью аргумента средства, примерно так:

handler = logging.handlers.SysLogHandler(facility=SysLogHandler.LOG_DAEMON)
ответил bstpierre 19 +04002010-10-19T17:15:29+04:00312010bEurope/MoscowTue, 19 Oct 2010 17:15:29 +0400 2010, 17:15:29
0

От https://github.com/luismartingil/per.scripts/tree /ведущий /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')
ответил luismartingil 17 J000000Wednesday13 2013, 02:31:30
0
import syslog
syslog.openlog(ident="LOG_IDENTIFIER",logoption=syslog.LOG_PID, facility=syslog.LOG_LOCAL0)
syslog.syslog('Log processing initiated...')

вышеприведенный скрипт войдет в систему LOCAL0 с нашим собственным "LOG_IDENTIFIER" ... Вы можете использовать LOCAL [0-7] для локальных целей.

ответил san 21 J0000006Europe/Moscow 2012, 20:57:23
0

Вот способ yaml dictConfig, рекомендуемый для 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/log зависит от ОС.

ответил Bruce Edge 13 Jam1000000amSat, 13 Jan 2018 03:52:57 +030018 2018, 03:52:57
0

Вы также можете добавить обработчик файлов или обработчик вращающихся файлов, чтобы отправлять свои журналы в локальный файл: http://docs.python.org/2/library/logging.handlers.html

ответил Reshad user2701173 26 +04002013-10-26T01:26:25+04:00312013bEurope/MoscowSat, 26 Oct 2013 01:26:25 +0400 2013, 01:26:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132