关于web.py如何将输出重定向到另一个输出目标 像一个日志文件或完全摆脱它?
答案 0 :(得分:4)
我必须修改http://webpy.org/cookbook/logging中的示例才能将请求/响应事件记录到文件中。基本上,除了(根据链接示例)传递重载 init 的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变量在我的主函数
中设置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
修改&#39; logformat&#39; FileLogger中的变量,用于更改文件中输出格式的格式。
据我所知,没有办法压缩web.py框架生成的请求/响应消息的输出。它使用自己的类(httpserver.py中的LogMiddleware)来打印事件。 FileLogger只是将自己添加到各种记录器中,它不会取代LogMiddleware。
根据需要记录到文件后,您可以将stdout和stderr的输出重定向到/ dev / null;
./yourapp.py > /dev/null 2> /dev/null
希望这会有所帮助并祝你好运!
RDP
答案 1 :(得分: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
答案 2 :(得分:0)
您可以打印到这样的文件:
file = open("/tmp/test.txt", "wt")
print >> file, "Foobar"
Python还为日志功能提供日志记录模块。
然而,问题的质量对于解释你想要输出的内容和原因而言太过分了,因此给出一个好的答案是不可能的。请尝试编辑问题以获取更多详细信息。
答案 3 :(得分:0)
虽然这是一个旧线程,但遇到它的人可能会对此solution from the web.py cookbook
感兴趣它基本上解释了如何控制默认HTTPServer的日志记录。
更新
另一种解决方案是直接更改web.py的代码并将httpserver.py
中的打印重定向到文件,例如推荐的here。
答案 4 :(得分:0)
摆脱它
web.config.debug = False仍然没有帮助。一些输出仍然完成。
注释掉文件中的行: C:\ Python27 \ LIB \站点包\幅\ httpserver.py
行:
print >> outfile, utils.safestr(msg) ->
#print >> outfile, utils.safestr(msg)