web-dev-qa-db-ja.com

pythonボトルは常にコンソールにログを記録し、ファイルにはログを記録しません

複数のスレッドを持つpythonプロジェクトでは、ロギングはロガーファイルへの書き込みに適しています。基本的に ロギング、StreamHandler、および標準ストリーム に基づいています。

私のプロジェクトの一部は、ボトルのWebサーバーでもあります。しかし、すべてのボトル呼び出しは、次のようにコンソールにログを書き込みます。

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

これを他のコードと同じように処理して、ボトルのログがロガーファイルにも移動するようにするにはどうすればよいですか?

14
gNeandr

独自のソリューションを展開している場合は、ログ行を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
8
ron rothman

スレッドでボトルプログラムを開始して、Ronのソリューションを使用しようとしています。

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」に変更すると、次のように変更されます。コンソールに出力がまったくありません。

0
gNeandr