2011-08-25 8 views
5

web.pyについて出力先を別の出力先に再調整するにはどうすればよいですか? ログファイルのようにするか、あなたはこのようなファイルを印刷することができweb.pyの出力を再調整するには

+1

? HTML出力はブラウザに送られ、 'print()'出力はコンソールに送られますか? –

+0

コンソールに送信されたprint()出力。 – Cletrix

答えて

2

コンソール出力printは、sys.stdoutに送信されます。必要に応じて、このストリームを開いているファイルまたはファイルに似たオブジェクトに置き換えることができます。唯一の要件は、カスタムオブジェクトにwrite()メソッドがあることです。

元の出力ストリームにアクセスするには、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 - - [ 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のコードを変更し、推奨hereのように、ファイルにhttpserver.pyで印刷をリダイレクトすることになります。

4

要求/応答イベントをファイルに記録するには、例をhttp://webpy.org/cookbook/loggingに変更する必要がありました。基本的には、をオーバーロードするWsgiLoggingのインスタンスを渡す(リンクされた例)に加えて、コール関数もオーバーロードする必要があります。

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ファイル変数は、この

[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 

変更のように、

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

これは、要求イベントと指定されたファイルに応答を記録します私の主な機能に設定されています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 = Falseをまだ助けていませんでした。まだいくつかの出力が行われました。ファイル内

コメントアウト行: C:\ Python27 \ Libの\サイト - パッケージ\ウェブ\ httpserver.py

ライン:どのような出力

print >> outfile, utils.safestr(msg) -> 
#print >> outfile, utils.safestr(msg) 
関連する問題