2012-08-09 49 views
2

我在Linux Ubuntu 12.04系统。 我一直在使用这个代码记录所有输出和错误+在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) 
+0

另外,我建议把'level ='参数放到'__init __()',不要写'()'。 – glglgl 2012-08-09 08:51:31

+0

对不起glglgl我不明白你的意思? – 2012-08-09 10:53:21

+0

为了清楚起见,它的格式设置为'+++%(asctime)s%(name)-12s%(levelname)-8s%(message)s +++'的运行情况如何? – Deestan 2012-08-09 10:57:34

回答

0

这是由于print如何工作。

我修改了您的示例,以便我在write()方法中使用print (level, msg)

它让我看到以下内容:

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

0

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

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

我能想到的最简单的方法是从msg中去掉换行符,并检查消息是否为空。不是最漂亮的,但如果可行,换行符可能是原因,你可以从那里开始工作:

def write(self, msg, level=logging.INFO): 
    msg = msg.rstrip("\n") 
    if msg: 
     self.logger.log(level, msg) 
+0

如果仅仅是这样,你会是对的。但是,可惜的是,'print'对每个组件进行拆分调用,并对''''和''\ n''进行拆分。 – glglgl 2012-08-09 08:52:08

+2

这似乎很奇怪,正在使用的应用程序,首先不使用Python日志记录。在这种情况下使用打印语句并不合适。 – Evert 2012-08-09 09:06:15

+1

这可能发生在有机增长的应用程序中...... – glglgl 2012-08-09 10:02:09