当前位置: 首页 > 面试题库 >

创建日志记录处理程序以连接到Oracle?

钦耀
2023-03-14
问题内容

因此,现在我需要创建并实现Python日志记录模块的扩展,该扩展将用于登录到我们的数据库。基本上,我们有几个python应用程序(它们都在后台运行)当前登录到文本文件的随机混合。这几乎使得不可能确定某个应用程序是否失败。

给我的问题是将所说的日志记录文本文件移动到oracle数据库。这些表已经定义好了,需要记录到什么地方,但是现在,我正在寻找添加另一个将记录到数据库的记录处理程序。

我使用的是python 2.5.4和cx_Oracle,一般情况下,应用程序都可以作为服务/守护程序或直接应用程序运行。

我主要是想知道什么是最好的解决方法。几个问题:

  1. 如果cx_Oracle发生任何错误,这些错误应记录到哪里?如果它崩溃了,那么最好只是让记录器退回到默认的文本文件?

  2. 不久之前,我们开始强制人们使用sys.stderr / stdout.write而不使用print,因此在最坏的情况下,我们不会遇到过时的打印问题。有没有一种方法可以无缝地将所有成千上万的sys.std调用直接通过管道传送到记录器,并让记录器来弥补这一懈怠?

  3. 在每条记录的消息之后,脚本是否应该自动进行提交?(每秒将有几十个。)

  4. 为日志记录系统实现新处理程序的最佳方法是什么?从基本的Handler类继承似乎是最简单的。

任何想法/建议都很好。


问题答案:
  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")


 类似资料:
  • 每个类都必须将所有的错误消息记录到自己的错误文件中,并将所有的跟踪消息记录到自己的跟踪文件中。这两个文件都需要每晚翻转。此外,在系统中记录的任何内容都必须在主系统日志中结束。 我创建了下面的代码片段来尝试这个想法。它似乎会工作,但结果不是我所期望的。下面是可以直接运行的测试程序: 下面是logback.xml文件: 如果运行此代码,它将正确地将所有内容记录到主日志文件中。并且它将按预期创建2个跟踪

  • 我想知道如何在Spring批处理中使用MCD记录诸如和之类的内容。 下面是一些代码: Bootstrap.properties 这个文件有我的主要方法。当我用手动设置这里的字段时,我在日志中看到了它,但我不明白如何将我需要的实际信息放在这里。 如果有任何见解,我将不胜感激:)谢谢。

  • 问题内容: 我在以下两个问题中寻求您的帮助-如何为不同的日志级别(如python)设置处理程序。目前,我有 但是Scrapy生成的调试消息也会添加到日志文件中。这些时间非常长,理想情况下,我希望将DEBUG级别的消息保留在标准错误上,并将INFO消息转储到我的。 其次,在文档中,它说我的问题是,我应该在哪里运行它?它在我的蜘蛛里面吗? 问题答案: 嗯, 只是想更新一下,我能够使用来获取日志文件处理

  • 问题内容: 假设我有以下代码: 我希望在处理程序上进行设置会导致将调试级别的消息写入日志文件。但是,这将打印有效级别的30(等于,默认值),并且仅将消息记录到日志文件中,而不记录调试消息。 似乎该处理程序的日志级别被丢弃在地板上,例如,它被静默忽略。这让我感到奇怪,为什么要在处理程序上放所有东西? 问题答案: 它允许更好的控制。默认情况下,root记录程序已设置级别,这意味着它不会打印较低级别的消

  • 问题内容: 我想编写一个例程,该例程将允许我在跨越设定时间范围的表中记录日期已久的事件(记录),并且在特定的一天没有发生任何事件的情况下,将创建一个重复次数最多的事件事件DID发生的最近的先前记录。 例如:如果在9月4日,字段1 = X,字段2 = Y,字段3 = Z,然后什么也没有发生,直到9月8日字段1 = Y,字段2 = Z,字段3 = X,该例程将创建记录在表格中说明3天什么都没发生的情况

  • 我刚刚在我的应用程序中实现了日志记录,我想知道是否有一种方法来检查日志记录程序是否为空。 我想到的是在我的脚本中设置两个处理程序: 一个用于带有级别的控制台 一个用于级别为的文件 在脚本的末尾,我需要检查logger是否不为空。这意味着在运行期间,记录了一些的消息,在这种情况下,我希望通过将调试级别的日志文件发送到我的邮箱。 这种检查在脚本本身中是否可能,而不需要shell重定向到文件?