python bottle 总是记录到控制台,不记录到文件
python bottle always logs to console, no logging to file
在具有多个线程的 python 项目中,我的日志记录可以很好地写入记录器文件。基本基于Logging, StreamHandler and standard streams
我项目的一部分是一个运行良好的瓶子网络服务器。但是每次 bottle 调用都会像这样将日志写入控制台:
192.168.178.20 - - [26/Jun/2015 20:22:17] "GET /edit?addJob HTTP/1.1" 200 48028
如何像处理其他代码一样处理此问题,以便瓶子日志也进入记录器文件?
你 运行 内置服务器对吗?然后你可以做一个简单的插件:
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)
或尝试this one
如果您正在推出自己的解决方案,您应该编写一个简单的 Bottle 插件,将日志行发送到 logging
记录器。下面是一个设置基本记录器、定义日志记录插件并创建一个 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 的解决方案在线程上启动 bottle 程序:
tWeb = Thread(target=runWeb, args=('192.168.178.16', 5003)).start()
和
def runWeb(aserver, aport):
run(host=aserver, port=aport, debug=True)
但是那失败了。任何 'print' 都会转到文件,但 'yield' 不会(见上文),它会转到控制台。
同样把"debug=True"改成"quiet=True"只会改成:控制台上根本没有输出。
在具有多个线程的 python 项目中,我的日志记录可以很好地写入记录器文件。基本基于Logging, StreamHandler and standard streams
我项目的一部分是一个运行良好的瓶子网络服务器。但是每次 bottle 调用都会像这样将日志写入控制台:
192.168.178.20 - - [26/Jun/2015 20:22:17] "GET /edit?addJob HTTP/1.1" 200 48028
如何像处理其他代码一样处理此问题,以便瓶子日志也进入记录器文件?
你 运行 内置服务器对吗?然后你可以做一个简单的插件:
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)
或尝试this one
如果您正在推出自己的解决方案,您应该编写一个简单的 Bottle 插件,将日志行发送到 logging
记录器。下面是一个设置基本记录器、定义日志记录插件并创建一个 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 的解决方案在线程上启动 bottle 程序:
tWeb = Thread(target=runWeb, args=('192.168.178.16', 5003)).start()
和
def runWeb(aserver, aport):
run(host=aserver, port=aport, debug=True)
但是那失败了。任何 'print' 都会转到文件,但 'yield' 不会(见上文),它会转到控制台。
同样把"debug=True"改成"quiet=True"只会改成:控制台上根本没有输出。