2011-08-25 23 views
5

關於web.py如何像日誌文件一樣將輸出重新複製到另一個輸出目標 或完全清除它?如何重新校正web.py中的輸出

+1

輸出什麼? HTML輸出發送到瀏覽器還是'print()'輸出發送到控制檯? –

+0

將print()輸出發送到控制檯。 – Cletrix

回答

2

控制檯通過print輸出發送到sys.stdout。如果需要,您可以用打開的文件或自己的​​文件類對象替換此流。唯一的要求是您的自定義對象有一個write()方法。

class MyOutputStream(object): 

    def write(self, data): 
     pass # Ignore output 

import sys 
sys.stdout = MyOutputStream() 

print("Test") # Output is ignored 

如果要訪問或恢復原始輸出流,請使用sys.__stdout__

sys.stdout = sys.__stdout__ # Restore stdout 
+0

不適合我。服務器輸出有: 192.168.0.123:52931 - - [27/Aug/2011 11:57:45]「HTTP/1.1 POST/params」 - 200 OK 192.168.0.123:52937 - - [27/Aug/2011 11:57:47]「HTTP/1.1 POST/params」 - 200 OK 192.168.0.123:52942 - - [27/Aug/2011 11:57:49]「HTTP/1.1 POST/params」 - 200 OK 192.168.0.123:52947 - [27/Aug/2011 11:57:50]「HTTP/1.1 POST/params」 - 200 OK – Cletrix

+1

我再試一次,並且可以正常工作。 tks – Cletrix

+0

'web.httpserver.sys.stderr = MyOutputStream()' 如果您不想抑制程序的其他輸出 –

0

您可以打印到這樣的文件:

file = open("/tmp/test.txt", "wt") 
print >> file, "Foobar" 

的Python還提供日誌記錄功能模塊

但是質量問題留下了太多的解釋你想要輸出和爲什麼,因此給出一個很好的答案是不可能的。請嘗試編輯該問題以獲取更多詳細信息。

0

雖然這是一個古老的線程,人們跑到它可能是有興趣在此solution from the web.py cookbook

它基本上解釋瞭如何控制日誌的默認HttpServer的。

更新:

另一個解決方案是直接改變web.py的代碼和httpserver.py打印重定向到一個文件,如建議here

4

我不得不修改http://webpy.org/cookbook/logging中的示例,以便能夠將請求/響應事件記錄到文件中。基本上,除了(根據鏈接示例)傳遞的WsgiLogging實例重載init調用函數也需要重載。

class FileLog(WsgiLog): 
    def __init__(self, application): 
    WsgiLog.__init__(
     self, 
     application, 
     logformat = '[%(asctime)s][%(name)s][%(levelname)s]: %(message)s', 
     debug = True, 
     tofile = web.config.log_tofile, 
     toprint = False, 
     file = web.config.log_file, 
     loglevel = logging.DEBUG 
     ) 

    def __call__(self, environ, start_response): 
    def hstart_response(status, response_headers, *args): 
     out = start_response(status, response_headers, *args) 
     try: 
     logline=environ["SERVER_PROTOCOL"]+" "+environ["REQUEST_METHOD"]+" "+environ["REQUEST_URI"]+" - "+status 

     except err: 
     logline="Could not log <%s> due to err <%s>" % (str(environ), err) 

     self.logger.info(logline) 

     return out 

    return super(FileLog, self).__call__(environ, hstart_response) 

的Web.config變量被設置在我的主要功能

import sys 
import os 
import datetime, time 
import optparse 
import logging 
from wsgilog import WsgiLog 

if __name__ == "__main__": 

    parser = optparse.OptionParser() 


    parser.add_option("--logfile", dest="logfile", default="", 
       help="OPTIONAL send log messages to specified file instead of std out") 

    (options, args) = parser.parse_args() 

    #P Need to "eat" all of the passed in args because webpy will try to interpret them first 
    sys.argv = [] 

    webpyapp = web.application(urls, locals()) 

    if hasattr(options, "logfile") and options.logfile != '': 
    web.config.log_file = options.logfile 
    web.config.log_toprint = False 
    web.config.log_tofile = True 
    webpyapp.run(FileLog) 
    else: 
    webpyapp.run() 

這將記錄請求事件,併到指定的文件的響應,這樣

[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 OPTIONS /api/sessions/5399d05f41f0 - 200 OK 
[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 GET /api/sessions/5399d05f41f0 - 200 OK 
[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 GET /api/sessions/5399d05f41f0/tasks/ - 200 OK 
[Tue, 01 Apr 2014 17:40:56][wsgilog.log][INFO]: HTTP/1.1 GET /api/sessions/5399d05f41f0/tasks//messages/?timestamp__gt=1396291350 - 200 OK 

修改FileLogger中的'logformat'變量來改變輸出在文件中的格式。

據我所知,沒有辦法抑制由web.py框架生成的請求/響應消息的輸出。它使用自己的類(httpserver.py中的LogMiddleware)來打印事件。 FileLogger只是將自己添加到各種記錄器,它不會替代LogMiddleware。如果你想記錄到文件中,你可以將stdout和stderr的輸出重定向到/ dev/null;

./yourapp.py > /dev/null 2> /dev/null 

希望這會有所幫助,祝你好運!

RDP

0

擺脫它

web.config.debug =假仍然沒有幫助。一些輸出仍然完成。在文件

註釋掉行: C:\ Python27 \ LIB \站點包\網絡\ httpserver.py

行:

print >> outfile, utils.safestr(msg) -> 
#print >> outfile, utils.safestr(msg)