5

我在 Linux Ubuntu 12.04 系统上。我一直在使用此代码将所有 stdout 和 stderr + INFO 级别的附加日志记录到文件中。

class LogFile(object):
    def __init__(self, name=None):
        self.logger = logging.getLogger(name)

    def write(self, msg, level=logging.INFO):
        self.logger.log(level, msg)

    def flush(self):
        for handler in self.logger.handlers:
            handler.flush()

logging.basicConfig(level=logging.INFO, 
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d-%y %H:%M:%S',
                    filename='logging.log')
sys.stdout = LogFile('stdout')
sys.stderr = LogFile('stderr')

出于某种原因,每当我得到一个条目时,它总是后跟一个空行,这是我的日志的一个小输出:

08-09-12 09:52:54 stdout       INFO     CheckCon: Checking Portal access.
08-09-12 09:52:54 stdout       INFO     

08-09-12 09:52:54 stdout       INFO     CheckCon: Portal ping successful.
08-09-12 09:52:54 stdout       INFO     

08-09-12 09:53:08 stderr       INFO     Bottle server starting up (using PasteServer())...

08-09-12 09:53:08 stderr       INFO     Listening on http://0.0.0.0:8654/

08-09-12 09:53:08 stderr       INFO     Hit Ctrl-C to quit.


08-09-12 09:53:08 stdout       INFO     URI: Generated https://*****
08-09-12 09:53:08 stdout       INFO     

08-09-12 09:53:08 stdout       INFO     CheckCon: Checking Portal access.
08-09-12 09:53:08 stdout       INFO     

08-09-12 09:53:08 stdout       INFO     serving on 0.0.0.0:8654 view at http://127.0.0.1:8654
08-09-12 09:53:08 stdout       INFO     

08-09-12 09:53:08 stdout       INFO     CheckCon: Google ping successful.
08-09-12 09:53:08 stdout       INFO     

这就是它在文件中的样子,有一个空的 stdout 行,然后是一个完整的空行。如果您注意到瓶子服务器的输出似乎没有空行,但每行之间仍然有一个空行。

任何人都知道是什么原因造成的,或者我该如何预防?

编辑:

根据我已将所有打印更改为 logging.info 的建议,我仍然遇到瓶和粘贴服务器正在执行常规打印的问题:\

所以我的日志现在修改了格式format='%(asctime)s %(levelname)-4s: %(message)s'

08-09-12 12:44:40 INFO: URI: Generated https://****
08-09-12 12:44:40 INFO: CheckCon: Checking Portal access.
08-09-12 12:44:40 INFO: serving on 0.0.0.0:9002 view at http://127.0.0.1:9002
08-09-12 12:44:40 INFO: 

08-09-12 12:44:40 INFO: CheckCon: Google ping successful.
08-09-12 12:44:40 INFO: FullW: opening url: ****
08-09-12 12:44:40 INFO: FullW: showing.
08-09-12 12:44:40 INFO: LOOP: starting.

据我所知,额外的空行也是因为空的信息行,所以现在越来越近了..

编辑以澄清输出:有趣的一点:

+++08-09-12 13:01:04 stdout       INFO     serving on 0.0.0.0:9002 view at     http://127.0.0.1:9002+++
+++08-09-12 13:01:04 stdout       INFO     
+++

最终编辑:

更改了我的写入以检查味精的长度是否低于 2 个字符,并且消除了空白行.. 仍然不能 100% 确定原因。

def write(self, msg, level=logging.INFO):
    if len(msg) < 2:
        pass
    else:
        self.logger.log(level, msg)
4

2 回答 2

1

这是由于print工作方式的原因。

我已经修改了您的示例,以便print (level, msg)write()方法中有一个。

它向我展示了以下内容:

>>> x=LogFile("foo")
>>> print >>x, "123\n321\n444", "321", "222",
(20, '123\n321\n444')
(20, ' ')
(20, '321')
(20, ' ')
(20, '222')
>>> print >>x, "123\n321\n444", "321", "222"
(20, ' ')
(20, '123\n321\n444')
(20, ' ')
(20, '321')
(20, ' ')
(20, '222')
(20, '\n')

如果每个呼叫都被转移到一个logger呼叫中,您将获得每个呼叫的条目。

为了解决这个问题,您可以实现一种仅需要logger.log()完整行和关闭时的缓冲。

于 2012-08-09T08:25:13.253 回答
0

我能想到的是,由于您覆盖了 sys.stdout,因此写入日志记录行的实际命令将附加一个换行符:sys.stdout.write("log text\n"). 日志记录模块/方法本身会附加一个换行符,所以你会得到两个换行符。

但是,这应该只显示一个完全空行,而不是一个空行<date> <name> <level>。这可能是由sys.stdout.write("\n")其他地方的单个语句引起的。

我能想到的最简单的防止这种情况的方法是从 中删除换行符msg,并检查 message 是否为空。不是最漂亮的,但如果可行,则换行可能是原因,您可以从那里开始工作:

def write(self, msg, level=logging.INFO):
    msg = msg.rstrip("\n")
    if msg:
        self.logger.log(level, msg)
于 2012-08-09T08:29:46.767 回答