Chromatrace ist ein Python -Paket für erweiterte Protokollierungsfunktionen, einschließlich Trace- und Anforderungs -ID -Verwaltung sowie Prozess -ID. Es bietet eine flexible Protokollierungskonfiguration und unterstützt farbige Protokollierung für eine bessere Sichtbarkeit.
Ich glaube, dass die Protokollierung ein wesentlicher Bestandteil jeder Anwendung ist, und es ist wichtig, ein gut organisiertes und strukturiertes Protokollierungssystem zu haben. Chromatrace zielt darauf ab, ein einfaches und benutzerfreundliches Protokollierungssystem bereitzustellen, das in jede Python-Anwendung integriert werden kann. In einfachen Worten ist Chromatrace eine beste Praxis, sich in Python anzumelden.
Sie können Chromatrace über PIP installieren:
pip install chromatraceUm Chromatrace in Ihrer Anwendung zu verwenden, können Sie die erforderlichen Komponenten importieren:
from chromatrace import LoggingSettings , LoggingConfig , tracerKonfigurieren Sie Ihre Protokollierungseinstellungen:
logging_config = LoggingConfig (
settings = LoggingSettings (
application_level = "Development" ,
enable_tracing = True ,
ignore_nan_trace = False ,
enable_file_logging = True ,
)
)
logger = logging_config . get_logger ( __name__ ) Verwenden Sie den tracer -Dekorator, um Ihre Funktionen zu verfolgen:
@ tracer
async def my_async_function ():
logger . debug ( "Check something" )
logger . info ( "Doing something" )
logger . warning ( "Doing something" )
logger . error ( "Something went wrong" ) from lagom import Container
container = Container ()
from chromatrace import LoggingConfig , LoggingSettings
container [ LoggingSettings ] = LoggingSettings (
application_level = "Development" ,
enable_tracing = True ,
ignore_nan_trace = False ,
enable_file_logging = True ,
)
container [ LoggingConfig ] = LoggingConfig ( container [ LoggingSettings ]) Fügen Sie dann die LoggingConfig zu Ihrem Service hinzu:
import logging
from chromatrace import LoggingConfig
class SomeService :
def __init__ ( self , logging_config : LoggingConfig ):
self . logger = logging_config . get_logger ( self . __class__ . __name__ )
self . logger . setLevel ( logging . ERROR )
async def do_something ( self ):
self . logger . debug ( "Check something in second service" )
self . logger . info ( "Doing something in second service" )
self . logger . error ( "Something went wrong in second service" )Ergebnisse:
[Development]-(2024-11-21 23:43:26)-[INFO]-[APIService]-FILENAME:api_app.py-FUNC:do_something-THREAD:MainThread-LINE:27 ::
Doing something in API service
[Development]-(2024-11-21 23:43:26)-[ERROR]-[APIService]-FILENAME:api_app.py-FUNC:do_something-THREAD:MainThread-LINE:28 ::
Something went wrong in API service
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[INFO]-[Main]-FILENAME:main.py-FUNC:main-THREAD:MainThread-LINE:21 ::
Starting main
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[ERROR]-[ExampleService]-FILENAME:example_service.py-FUNC:do_something-THREAD:MainThread-LINE:26 ::
Something went wrong
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[INFO]-[InnerService]-FILENAME:example_service.py-FUNC:do_something-THREAD:MainThread-LINE:13 ::
Doing something in second service
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[ERROR]-[InnerService]-FILENAME:example_service.py-FUNC:do_something-THREAD:MainThread-LINE:14 ::
Something went wrong in second service
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[DEBUG]-[AnotherSample]-FILENAME:sample.py-FUNC:do_something-THREAD:MainThread-LINE:12 ::
Check something
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[INFO]-[AnotherSample]-FILENAME:sample.py-FUNC:do_something-THREAD:MainThread-LINE:13 ::
Doing something
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[WARNING]-[AnotherSample]-FILENAME:sample.py-FUNC:do_something-THREAD:MainThread-LINE:14 ::
Doing something
[T-dc1be4de]-[Development]-(2024-11-21 23:43:26)-[ERROR]-[AnotherSample]-FILENAME:sample.py-FUNC:do_something-THREAD:MainThread-LINE:15 ::
Something went wrong
Die beiden ersten Protokoll war nicht mehr und die Trace -ID wurde der Protokollnachricht nicht hinzugefügt. Der Rest der Protokolle befand sich innerhalb der Spur und die Trace -ID T-dc1be4de wurde der Protokollnachricht hinzugefügt.
Hinweis : Wichtig ist, dass jede Klasse oder jeder Dienst eine eigene Protokollebene haben kann. Dies ist nützlich, wenn Sie unterschiedliche Protokollebenen für verschiedene Dienste haben möchten.
from chromatrace import RequestIdMiddleware
app = FastAPI ()
app . add_middleware ( RequestIdMiddleware )Ergebnis:
[R-ffe0a9a2]-[Development]-(2024-11-22 00:13:53)-[INFO]-[APIService]-FILENAME:api_app.py-FUNC:read_root-THREAD:MainThread-LINE:38 ::
Hello World
[R-ffe0a9a2]-[Development]-(2024-11-22 00:13:53)-[ERROR]-[ExampleService]-FILENAME:example_service.py-FUNC:do_something-THREAD:MainThread-LINE:26 ::
Something went wrong
[R-ffe0a9a2]-[Development]-(2024-11-22 00:13:53)-[INFO]-[InnerService]-FILENAME:example_service.py-FUNC:do_something-THREAD:MainThread-LINE:13 ::
Doing something in second service
[R-ffe0a9a2]-[Development]-(2024-11-22 00:13:53)-[ERROR]-[InnerService]-FILENAME:example_service.py-FUNC:do_something-THREAD:MainThread-LINE:14 ::
Something went wrong in second service
Wie Sie sehen können, wird die Anforderungs -ID - R-ffe0a9a2 zu den Protokollnachrichten aus dem Thread, mit dem die Anforderung verarbeitet wird, automatisch hinzugefügt.
from chromatrace import SocketRequestIdMiddleware
socket_application = SocketRequestIdMiddleware ( socket_application )Das vollständige Beispiel finden Sie in der Datei socket_app.py. Ich empfehle Ihnen, es zu überprüfen, bevor Sie Entscheidungen treffen. Der clientseitige Code finden Sie in der Datei socket_client.py.
Ergebnis:
[S-4e2b7c5e]-[Development]-(2024-12-06 01:15:18)-[INFO]-[Socket]-FILENAME:socket_app.py-FUNC:connect-THREAD:MainThread-LINE:86 ::
Socket connected on main namespace. SID: wB-srwnv9Xa2w_8bAAAB
[S-4e2b7c5e]-[Development]-(2024-12-06 01:15:20)-[INFO]-[Socket]-FILENAME:socket_app.py-FUNC:message-THREAD:MainThread-LINE:90 ::
Received message on main namespace. SID: wB-srwnv9Xa2w_8bAAAB, Message: Hello from the client
[S-aaf46528]-[Development]-(2024-12-06 01:15:47)-[INFO]-[Socket]-FILENAME:socket_app.py-FUNC:connect-THREAD:MainThread-LINE:86 ::
Socket connected on main namespace. SID: FI3E_S_A-KsTi4RLAAAD
[S-aaf46528]-[Development]-(2024-12-06 01:15:49)-[INFO]-[Socket]-FILENAME:socket_app.py-FUNC:message-THREAD:MainThread-LINE:90 ::
Received message on main namespace. SID: FI3E_S_A-KsTi4RLAAAD, Message: Hello from the client
Ja, die Sockelprotokolle befinden sich ebenfalls in der Spur. Die Trace ID- S-4e2b7c5e und S-aaf46528 wurde zu den Protokollnachrichten hinzugefügt. Für eine bessere Erfahrung wurde das Präfix S der Trace -ID hinzugefügt, um sie von der Anforderungs -ID zu unterscheiden.
from chromatrace . uvicorn import GetLoggingConfig , UvicornLoggingSettings
rest_application = FastAPI ()
uvicorn . run (
rest_application ,
host = "0.0.0.0" ,
port = 8000 ,
log_level = "debug" ,
log_config = GetLoggingConfig (
UvicornLoggingSettings (
enable_file_logging = True ,
show_process_id = True ,
)
),
)Ergebnis:
(2024-12-12 20:54:54)-[PID:3710345]-[INFO]: Started server process [3710345]
(2024-12-12 20:54:54)-[PID:3710345]-[INFO]: Waiting for application startup.
(2024-12-12 20:54:54)-[PID:3710345]-[INFO]: Application startup complete.
(2024-12-12 20:54:54)-[PID:3710345]-[INFO]: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
(2024-12-12 20:54:57)-[PID:3710345]-[INFO]: ADDRESS:(127.0.0.1:46166) - REQUEST:"GET /consume HTTP/1.1" - STATUS:200 OK
(2024-12-12 20:55:45)-[PID:3710345]-[INFO]: ADDRESS:(127.0.0.1:54018) - REQUEST:"GET /consume HTTP/1.1" - STATUS:200 OK
(2024-12-12 20:56:51)-[PID:3710345]-[INFO]: ADDRESS:(127.0.0.1:58240) - REQUEST:"GET / HTTP/1.1" - STATUS:200 OK
(2024-12-12 20:56:51)-[PID:3710345]-[INFO]: ADDRESS:(127.0.0.1:58254) - REQUEST:"GET / HTTP/1.1" - STATUS:200 OK
(2024-12-12 20:56:52)-[PID:3710345]-[INFO]: ADDRESS:(127.0.0.1:58260) - REQUEST:"GET / HTTP/1.1" - STATUS:200 OK
(2024-12-12 20:56:52)-[PID:3710345]-[INFO]: ADDRESS:(127.0.0.1:58270) - REQUEST:"GET / HTTP/1.1" - STATUS:200 OK
(2024-12-12 21:16:45)-[PID:3710345]-[INFO]: Shutting down
(2024-12-12 21:16:45)-[PID:3710345]-[INFO]: Waiting for application shutdown.
(2024-12-12 21:16:45)-[PID:3710345]-[INFO]: Application shutdown complete.
(2024-12-12 21:16:45)-[PID:3710345]-[INFO]: Finished server process [3710345]
Die Protokolle befinden sich innerhalb der Prozess -ID - PID:3710345 wurde zu den Protokollnachrichten hinzugefügt. Die Protokollnachrichten sind auch für eine bessere Sichtbarkeit gefärbt. Die Protokollnachrichten werden auch in die Datei geschrieben, wenn die enable_file_logging auf True eingestellt ist. Weitere Informationen finden Sie in der uvicornLoggingettingsklasse UvicornLoggingSettings .
Du vertraust mir nicht, oder? Ich verstehe. Du willst es in Aktion sehen, oder? Ich habe dich versichert. :)
Sie können Beispiele für die Verwendung von Chromatrace im Beispielverzeichnis finden. Führen Sie die Beispiele mit dem folgenden Befehl aus:
python main.pyDann rennen Sie:
curl 0.0.0.0:8000Überprüfen Sie nun die Protokolle im Terminal.
Außerdem startet der Socket -Server und wartet, bis der Client eine Verbindung unter http://localhost:8001 herstellt. Führen Sie für Socket Client-Side den folgenden Befehl in einem anderen Terminal aus:
python adaptors/socket_client.pyÜberprüfen Sie nun die Protokolle im beiden Terminal.
Dieses Projekt ist unter der GNU Affero General Public Lizenz lizenziert - Einzelheiten finden Sie in der Lizenzdatei.