Via Flask.debug_log_format
dies nur tun:
app.debug = True
app.debug_log_format = """-------------------------------------------------------------------------
%(worker_id)s (levelname)s in %(module)s [%(pathname)s:%(lineno)d]:\n%(message)s
-------------------------------------------------------------------------"""
app.logger.log("test", extra={"worker_id": request.your_uuid_property)
Beispiel:
import logging
from flask import Flask, request
app = Flask(__name__)
# please replace "request.uuid" with your actual property
log = lambda msg: app.logger.info(msg, extra={'worker_id': "request.uuid" })
@app.route("/")
def hello():
log("hello world")
return "Hello World!"
if __name__ == "__main__":
app.debug_log_format = """-------------------------------------------------------------------------
%(worker_id)s in %(module)s [%(pathname)s:%(lineno)d]:
%(message)s
-------------------------------------------------------------------------"""
app.debug = True
log("hello world")
app.run()
Via Handler und Formatter von Standardprotokollierungsmodul
Flask verwendet Protokollierung in beliebiger Weise, so dass Sie logging.Handler und logging.Formatter verwenden können, um außerhalb von Flask zu erreichen. Ein generisches Beispiel kann here gefunden werden.
import logging
from flask import Flask
app = Flask(__name__)
class CustomFormatter(logging.Formatter):
def format(self, record):
record.worker_id = "request.uuid" # replace this with your variable
return super(CustomFormatter,self).format(record)
@app.route("/")
def hello():
app.logger.info("hello world")
return "Hello World!"
if __name__ == "__main__":
custom_format = """-------------------------------------------------------------------------
%(worker_id)s in %(module)s [%(pathname)s:%(lineno)d]:
%(message)s
-------------------------------------------------------------------------"""
app.debug = True
ch = logging.StreamHandler()
ch.setFormatter(CustomFormatter(fmt=custom_format))
app.logger.addHandler(ch)
app.logger.debug("hello world")
app.run()
Via zwingende logging.Logger Klasse
Das gleiche Ziel kann sein: Erweiterte Thema Protokollkonfiguration kann in the doc und in der cookbook
Ein maßgeschneidertes Beispiel in Bezug auf Ihre Frage gefunden werden erreicht durch Überschreiben der Standard-Logger-Klasse. Die Kombination der flask request context stack, würden Sie in der Lage sein, Ihr eigenes Feld im Protokoll zu erhalten:
import logging
from flask import Flask
app = Flask(__name__)
from flask import _request_ctx_stack
CUSTOM_FORMAT = """-------------------------------------------------------------------------
%(worker_id)s in %(module)s [%(pathname)s:%(lineno)d]:
%(message)s
-------------------------------------------------------------------------"""
class MyLogger(logging.Logger):
def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):
ctx = _request_ctx_stack.top
custom_extra = dict(
worker_id="request.uuid"
)
if ctx is not None:
url = ctx.request.url # please replace this with your own field
custom_extra["worker_id"] = url
if extra is not None:
extra.update(custom_extra)
else:
extra = custom_extra
return super(MyLogger,self).makeRecord(name, level, fn, lno, msg, args, exc_info, func=func, extra=extra)
logging.setLoggerClass(MyLogger)
@app.route("/")
def hello():
app.logger.info("hello world")
return "Hello World!"
if __name__ == "__main__":
app.debug_log_format = CUSTOM_FORMAT
app.debug = True
app.logger.debug("hello world")
app.run()
Wie kann ich die 'work_id' passieren Rekord zu protokollieren, Da formatter nicht auf den Protokolldatensatz zugreifen kann, kann er nicht darauf zugreifen, was bedeutet, dass Ihre erste Lösung überhaupt nicht funktioniert hat. –
@NotanID siehe meine Updates. – chfw
Das würde funktionieren. Aber ich suche nach einer Möglichkeit, den 'app.logger' direkt zu ändern, also muss ich diese umgebrochenen Protokollfunktionen nicht als globale Variablen importieren.Danke trotzdem :) –