提问者:小点点

python瓶子始终记录到控制台,不记录到文件


在一个有多个线程的python项目中,我的日志记录可以很好地写入日志文件。基本上基于日志、StreamHandler和标准流

我的项目的一部分是瓶网络服务器也运行良好。但是每个瓶子呼叫都会像这样向控制台写入日志:

 192.168.178.20 - - [26/Jun/2015 20:22:17] "GET /edit?addJob HTTP/1.1" 200 48028

如何以与其他代码相同的方式处理此问题,使瓶子日志也转到记录器文件?


共3个答案

匿名用户

如果您正在滚动自己的解决方案,您应该编写一个简单的Bottle插件,该插件向日志记录程序发出日志行。下面是一个设置基本记录器、定义日志插件并创建一个在所有路由上安装该插件的Bottle应用的示例。

from bottle import Bottle, request, response
from datetime import datetime
from functools import wraps
import logging

logger = logging.getLogger('myapp')

# set up the logger
logger.setLevel(logging.INFO)
file_handler = logging.FileHandler('myapp.log')
formatter = logging.Formatter('%(msg)s')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)

def log_to_logger(fn):
    '''
    Wrap a Bottle request so that a log line is emitted after it's handled.
    (This decorator can be extended to take the desired logger as a param.)
    '''
    @wraps(fn)
    def _log_to_logger(*args, **kwargs):
        request_time = datetime.now()
        actual_response = fn(*args, **kwargs)
        # modify this to log exactly what you need:
        logger.info('%s %s %s %s %s' % (request.remote_addr,
                                        request_time,
                                        request.method,
                                        request.url,
                                        response.status))
        return actual_response
    return _log_to_logger

app = Bottle()
app.install(log_to_logger)

@app.route('/')
def home():
    return ['hello, world']

app.run(host='0.0.0.0', port='8080', quiet=True)

运行该代码会得到您想要的:

% python myapp.py &
% curl -v http://localhost:8080/
% tail myapp.log    
127.0.0.1 2015-06-27 16:57:09.983249 GET http://localhost:8080/ 200 OK

匿名用户

我尝试使用Ron的解决方案,在线程上启动瓶子程序:

tWeb = Thread(target=runWeb, args=('192.168.178.16', 5003)).start()

具有

def runWeb(aserver, aport):
    run(host=aserver, port=aport, debug=True)

但这失败了。任何“打印”都会进入文件,而不是“产量”(见上文),它会进入控制台。

另外,将“debug=True”更改为“quiet=True”只会更改为:控制台上根本没有输出。

匿名用户

你在运行内置服务器,对吗?然后您可以制作一个简单的插件:

from bottle import request, response, route, install, run
from datetime import datetime


def logger(func):
    def wrapper(*args, **kwargs):
        log = open('log.txt', 'a')
        log.write('%s %s %s %s %s \n' % (request.remote_addr, datetime.now().strftime('%H:%M'),
                                         request.method, request.url, response.status))
        log.close()
        req = func(*args, **kwargs)
        return req
    return wrapper

install(logger)


@route('/')
def index():
    return 'Hello, World'

run(quiet=True)

或者试试这个