【问题标题】:Save logs - SimpleHTTPServer保存日志 - SimpleHTTPServer
【发布时间】:2014-10-11 05:14:38
【问题描述】:

如何保存控制台的输出,例如

“192.168.1.1 - - [18/Aug/2014 12:05:59] 代码 404,消息文件未找到”

到一个文件?

代码如下:

import SimpleHTTPServer
import SocketServer

PORT = 1548

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT

httpd.serve_forever()

【问题讨论】:

  • 如果我尝试 LOG_FILENAME = 'logger1.txt' logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) 没有任何反应。他只是创建文件而不写入文件。
  • 我可以告诉你python example.py > log.txt 2>&1 不起作用。我猜日志记录机制必须意识到stderr没有连接到tty。

标签: python logging save simplehttpserver


【解决方案1】:

BaseHTTPRequestHandler.log_message() 通过写入sys.stderr 打印所有日志消息。你有两个选择:

1) 继续使用BaseHTTPRequestHandler.log_message(),但更改sys.stderr 的值:

import SimpleHTTPServer
import SocketServer

PORT = 1548

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT

import sys
buffer = 1
sys.stderr = open('logfile.txt', 'w', buffer)
httpd.serve_forever()

2) 创建一个新的xxxRequestHandler 类,替换.log_message()

import SimpleHTTPServer
import SocketServer
import sys

PORT = 1548

class MyHTTPHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    buffer = 1
    log_file = open('logfile.txt', 'w', buffer)
    def log_message(self, format, *args):
        self.log_file.write("%s - - [%s] %s\n" %
                            (self.client_address[0],
                             self.log_date_time_string(),
                             format%args))

Handler = MyHTTPHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT

httpd.serve_forever()

【讨论】:

  • 非常感谢罗伯。
  • 您应该在写入后添加self.log_file.flush()
  • @BrunoBronosky 是的,我使用 Python 2.7.12 对其进行了测试。为了清楚起见,我编辑了我的答案以包含一个完整的程序而不是一个片段。
  • 谢谢@Robᵩ。原来是缓冲问题。
  • 使用 Python 3.4.3 我发现将缓冲区设置为 1 对“行缓冲”有效,如 described in the docs。但是将其设置为更大的值(我想要 512,因此每 4 次调用就会写入一次日志)导致它缓冲完整的io.DEFAULT_BUFFER_SIZE(在我的情况下为 8192)。在我的测试中,我从未进行过填充缓冲区所需的 131 次调用。所以这是我困惑的主要原因。我认为这是 Python 或 Linux/C/etc 中的错误。
【解决方案2】:

我使用 BaseHTTPServer 而不是 SimpleHTTPServer。

你去吧:

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer

PORT_NUMBER = 5451

#This class will handles any incoming request from
#the browser 
class myHandler(BaseHTTPRequestHandler):

    #Handler for the GET requests
    def do_GET(self):
        self.send_response(200)
        #self.send_header('Content-type','text/html')
        self.end_headers()
        text_file = open("ip.txt", "a")
        text_file.write(str(self.client_address) + "\n")
        text_file.close()
        # Send the html message
        #self.wfile.write("Hello World !")

        return

try:
    #Create a web server and define the handler to manage the
    #incoming request
    server = HTTPServer(('', PORT_NUMBER), myHandler)
    print 'Started httpserver on port ' , PORT_NUMBER

    #Wait forever for incoming htto requests
    server.serve_forever()

except KeyboardInterrupt:
    print '^C received, shutting down the web server'
    server.socket.close()

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2018-05-11
    • 2010-10-26
    • 2022-11-03
    相关资源
    最近更新 更多