2016-09-13 1 views
5

Ich verwende current_app.logger und wenn ich versuchte, in Thread zu protokollieren, heißt es "außerhalb des Anwendungskontextes arbeiten". Wie melde ich eine Nachricht von einer Methode, die in einem Thread ausgeführt wird?Verwenden Sie Flask current_app.logger innerhalb Threading

def background(): 
    current_app.logger.debug('logged from thread') 

@app.route('/') 
def index(): 
    Thread(target=background).start() 
    return 'Hello, World!' 
Exception in thread Thread-16: 
Traceback (most recent call last): 
    File "/usr/lib64/python3.5/threading.py", line 914, in _bootstrap_inner 
    self.run() 
    File "/usr/lib64/python3.5/threading.py", line 862, in run 
    self._target(*self._args, **self._kwargs) 
    File "/home/sapam/demo.py", line 57, in background 
    current_app.logger.critical('test') 
    File "/home/sapam/.virtualenvs/demo/lib/python3.5/site-packages/werkzeug/local.py", line 343, in __getattr__ 
    return getattr(self._get_current_object(), name) 
    File "/home/sapam/.virtualenvs/demo/lib/python3.5/site-packages/werkzeug/local.py", line 302, in _get_current_object 
    return self.__local() 
    File "/home/sapam/.virtualenvs/demo/lib/python3.5/site-packages/flask/globals.py", line 51, in _find_app 
    raise RuntimeError(_app_ctx_err_msg) 
RuntimeError: Working outside of application context. 

This typically means that you attempted to use functionality that needed 
to interface with the current application object in a way. To solve 
this set up an application context with app.app_context(). See the 
documentation for more information. 

127.0.0.1 - - [13/Sep/2016 12:28:24] "GET/HTTP/1.1" 200 - 

Antwort

7

Sie verwenden das Standard logging Modul in üblichen Weise: den Logger für das aktuelle Modul erhalten und eine Nachricht mit ihm anmelden.

def background(): 
    logging.getLogger(__name__).debug('logged from thread') 

app.logger ist für die interne Flask Protokollierung, oder zumindest innerhalb eines Protokollierungs app Zusammenhang meist gemeint. Wenn Sie sich in einem Thread befinden, befinden Sie sich nicht mehr im selben App-Kontext.

Sie können current_app._get_current_object() an den Thread übergeben und diesen anstelle von current_app verwenden. Oder Sie können die Unterklasse Thread etwas ähnliches tun.

def background(app): 
    app.logger.debug('logged from thread') 

@app.route('/') 
def index(): 
    Thread(target=background, kwargs={'app': current_app._get_current_object()}).start() 
    return 'Hello, World!' 
class FlaskThread(Thread): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.app = current_app._get_current_object() 

    def run(self): 
     with self.app.app_context(): 
      super().run() 

def background(): 
    current_app.logger.debug('logged from thread') 

@app.route('/') 
def index(): 
    FlaskThread(target=background).start() 
    return 'Hello, World!' 
Verwandte Themen