Создание обработчика ведения журнала для подключения к Oracle?

Поэтому прямо сейчас мне нужно создать и внедрить расширение модуля протоколов Python, который будет использоваться для входа в нашу базу данных. В основном у нас есть несколько приложений python (которые все работают в фоновом режиме), которые в настоящее время регистрируются в случайном mishmash текстовых файлов. Из-за чего практически невозможно выяснить, не удалось ли какое-либо приложение или нет.

Задача, которую я поставил перед собой, – переместить указанный журнал в текстовые файлы в Oracle. Таблицы уже определены, и там, где все должно быть зарегистрировано, но прямо сейчас, я смотрю на добавление другого обработчика ведения журнала, который будет регистрироваться в БД.

Я использую python 2.5.4 и cx_Oracle, и приложения в целом могут быть запущены в эфир как служба / демон или прямое приложение.

Мне просто любопытно, что было бы самым лучшим способом для этого. Несколько вопросов:

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

  2. В то же время мы начали применять тот факт, что люди используют sys.stderr / stdout.write вместо печати, поэтому в худшем случае мы не будем сталкиваться с какими-либо проблемами, когда печать становится устаревшей. Есть ли способ, чтобы все тысячи вызовов sys.std были переданы непосредственно в регистратор и были ли регистраторы загружены в слабину?

  3. После каждого зарегистрированного сообщения, должен ли скрипт автоматически совершать коммит? (там будет несколько десятков в секунду.)

  4. Каков наилучший способ реализовать новый обработчик для системы ведения журнала? Наследование от базового класса Handler кажется простым.

Любые идеи / предложения были бы замечательными.

    One Solution collect form web for “Создание обработчика ведения журнала для подключения к Oracle?”

    1. Если с cx_Oracle возникают ошибки, лучше всего их записать в текстовый файл.
    2. Вы можете попробовать перенаправить sys.stdout и sys.stderr к файлоподобным объектам, которые записывают все, что написано в них, в регистратор.
    3. Я бы предположил, что вы хотите совершить после каждого события, если у вас нет веских причин не делать этого. Кроме того, вы можете буферизовать несколько событий и записывать их все в одной транзакции так часто.
    4. Ниже приведен пример, в котором используется mx.ODBC, вы можете, вероятно, адаптировать его к cx_Oracle без особых проблем. Я думаю, что он должен быть совместимым с Python DB-API 2.0.

    Автономный дистрибутив регистрации Python (до входа в систему был добавлен в Python) находится по адресу http://www.red-dove.com/python_logging.html, и хотя пакет протоколирования в Python намного более современен, автономный дистрибутив содержит тест каталог, в котором есть много полезных примеров производных классов обработчиков.

    #!/usr/bin/env python # # Copyright 2001-2009 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies and that # both that copyright notice and this permission notice appear in # supporting documentation, and that the name of Vinay Sajip # not be used in advertising or publicity pertaining to distribution # of the software without specific, written prior permission. # VINAY SAJIP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING # ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL # VINAY SAJIP BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR # ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # # This file is part of the standalone Python logging distribution. See # http://www.red-dove.com/python_logging.html # """ A test harness for the logging module. An example handler - DBHandler - which writes to an Python DB API 2.0 data source. You'll need to set this source up before you run the test. Copyright (C) 2001-2009 Vinay Sajip. All Rights Reserved. """ import sys, string, time, logging class DBHandler(logging.Handler): def __init__(self, dsn, uid='', pwd=''): logging.Handler.__init__(self) import mx.ODBC.Windows self.dsn = dsn self.uid = uid self.pwd = pwd self.conn = mx.ODBC.Windows.connect(self.dsn, self.uid, self.pwd) self.SQL = """INSERT INTO Events ( Created, RelativeCreated, Name, LogLevel, LevelText, Message, Filename, Pathname, Lineno, Milliseconds, Exception, Thread ) VALUES ( %(dbtime)s, %(relativeCreated)d, '%(name)s', %(levelno)d, '%(levelname)s', '%(message)s', '%(filename)s', '%(pathname)s', %(lineno)d, %(msecs)d, '%(exc_text)s', '%(thread)s' ); """ self.cursor = self.conn.cursor() def formatDBTime(self, record): record.dbtime = time.strftime("#%m/%d/%Y#", time.localtime(record.created)) def emit(self, record): try: #use default formatting self.format(record) #now set the database time up self.formatDBTime(record) if record.exc_info: record.exc_text = logging._defaultFormatter.formatException(record.exc_info) else: record.exc_text = "" sql = self.SQL % record.__dict__ self.cursor.execute(sql) self.conn.commit() except: import traceback ei = sys.exc_info() traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) del ei def close(self): self.cursor.close() self.conn.close() logging.Handler.close(self) dh = DBHandler('Logging') logger = logging.getLogger("") logger.setLevel(logging.DEBUG) logger.addHandler(dh) logger.info("Jackdaws love my big %s of %s", "sphinx", "quartz") logger.debug("Pack my %s with five dozen %s", "box", "liquor jugs") try: import math math.exp(1000) except: logger.exception("Problem with %s", "math.exp") 
    Python - лучший язык программирования в мире.