2011-08-25 33 views
5

Giới thiệu về web.py Làm cách nào để chuyển hướng đầu ra đến một đích đầu ra khác như tệp nhật ký hoặc loại bỏ hoàn toàn?Làm cách nào để chuyển hướng đầu ra trong web.py

+1

sản lượng gì? Đầu ra HTML được gửi đến trình duyệt hoặc đầu ra 'print()' được gửi tới bàn điều khiển? –

+0

đầu ra print() được gửi tới bàn điều khiển. – Cletrix

Trả lời

2

Đầu ra bàn điều khiển theo print được gửi đến sys.stdout. Bạn có thể thay thế luồng này bằng một tệp mở hoặc đối tượng giống như tệp của bạn nếu bạn muốn. Yêu cầu duy nhất là đối tượng tùy chỉnh của bạn có phương thức write().

class MyOutputStream(object): 

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

import sys 
sys.stdout = MyOutputStream() 

print("Test") # Output is ignored 

Nếu bạn muốn truy cập hoặc khôi phục luồng đầu ra ban đầu, hãy sử dụng sys.__stdout__.

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

không hoạt động với tôi. đầu ra máy chủ có: 192.168.0.123 matches2931 - - [27/Aug/2011 11:57:45] "HTTP/1.1 POST/params" - 200 OK 192.168.0.123 WEBC2937 - - [27/Aug/2011 11:57:47] "HTTP/1.1 POST/params" - 200 OK 192.168.0.123 WEBC2942 - - [27/Aug/2011 11:57:49] "HTTP/1.1 POST/params" - 200 OK 192.168.0.123 WEBC2947 - - [27/Aug/2011 11:57:50] "HTTP/1.1 POST/params" - 200 OK – Cletrix

+1

Tôi thử lại và hoạt động. tks – Cletrix

+0

'web.httpserver.sys.stderr = MyOutputStream()' nếu bạn không muốn chặn sản lượng khác khỏi chương trình của mình –

0

Bạn có thể in vào một tập tin như thế này:

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

Python cũng cung cấp khai thác gỗ mô-đun cho các chức năng đăng nhập.

Tuy nhiên, chất lượng của câu hỏi để lại quá nhiều cho việc giải thích những gì bạn đang cố gắng để sản xuất và tại sao, do đó đưa ra một câu trả lời tốt là không thể. Vui lòng thử chỉnh sửa câu hỏi để biết thêm chi tiết.

0

Mặc dù nó là một chủ đề cũ, người chạy vào nó có thể quan tâm này solution from the web.py cookbook

Về cơ bản nó giải thích làm thế nào để kiểm soát khai thác gỗ cho một mặc định HTTPServer.

Cập nhật:

Một giải pháp sẽ được trực tiếp thay đổi mã web.py và chuyển hướng in trong httpserver.py vào một tập tin, như khuyến cáo here.

4

Tôi phải sửa đổi ví dụ từ http://webpy.org/cookbook/logging để có thể ghi lại sự kiện yêu cầu/phản hồi vào tệp. Về cơ bản, ngoài (ví dụ liên quan) đi qua một ví dụ của WsgiLogging rằng quá tải init, các chức năng gọi cũng cần phải được quá tải.

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) 

Các biến web.config được thiết lập trong chức năng chính của tôi

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

này sẽ ghi lại các sự kiện theo yêu cầu và phản ứng vào một file nào, như thế này

[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 

Sửa biến 'logformat' trong FileLogger để thay đổi cách đầu ra được định dạng trong tệp.

Theo như tôi có thể nói, không có cách nào để ngăn chặn đầu ra của thông báo yêu cầu/phản hồi được tạo bởi khung công tác web.py. Nó sử dụng lớp riêng của mình (LogMiddleware trong httpserver.py) để in ra các sự kiện. FileLogger chỉ thêm chính nó vào các logger khác nhau, nó không thay thế LogMiddleware.

Khi bạn đã đăng nhập vào tệp như bạn muốn, bạn chỉ có thể chuyển hướng đầu ra của stdout và stderr đến/dev/null;

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

Hy vọng điều này sẽ giúp và chúc may mắn!

rdp

0

để thoát khỏi nó

web.config.debug = False vẫn không giúp đỡ. Một số đầu ra vẫn được thực hiện.

Comment ra dòng trong file: C: \ Python27 \ Lib \ site-packages \ web \ httpserver.py

dòng:

print >> outfile, utils.safestr(msg) -> 
#print >> outfile, utils.safestr(msg) 
Các vấn đề liên quan