Chromatrace هي حزمة Python مصممة لقدرات التسجيل المتقدمة ، بما في ذلك إدارة التتبع والطلب مع معرف العملية. إنه يوفر تكوين تسجيل مرن ويدعم التسجيل الملون لتحسين الرؤية.
أعتقد أن قطع الأشجار جزء أساسي من أي تطبيق ، ومن الأهمية بمكان أن يكون لديك نظام تسجيل جيد التنظيم ومنظم. يهدف Chromatrace إلى توفير نظام تسجيل بسيط وسهل الاستخدام يمكن دمجه في أي تطبيق Python. بعبارات بسيطة ، يعد Chromatrace أفضل ممارسة لتسجيل في بيثون.
يمكنك تثبيت Chromatrace عبر PIP:
pip install chromatraceلاستخدام Chromatrace في التطبيق الخاص بك ، يمكنك استيراد المكونات اللازمة:
from chromatrace import LoggingSettings , LoggingConfig , tracerقم بتكوين إعدادات التسجيل الخاصة بك:
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__ ) استخدم Decorator tracer لتتبع وظائفك:
@ 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 ]) ثم ، أضف LoggingConfig إلى خدمتك:
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" )نتائج:
[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
كان السجل الأولان خارج تتبع ولم تتم إضافة معرف التتبع إلى رسالة السجل. كانت بقية السجلات داخل التتبع وتم إضافة معرف التتبع - T-dc1be4de ، إلى رسالة السجل.
ملاحظة : الشيء المهم هو أن كل فئة أو خدمة يمكن أن يكون لها مستوى السجل الخاص بها. هذا مفيد عندما ترغب في الحصول على مستويات سجل مختلفة لخدمات مختلفة.
from chromatrace import RequestIdMiddleware
app = FastAPI ()
app . add_middleware ( RequestIdMiddleware )نتيجة:
[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
كما ترون ، يتم إضافة معرف الطلب - R-ffe0a9a2 تلقائيًا إلى رسائل السجل من مؤشر الترابط الذي يتولى الطلب.
from chromatrace import SocketRequestIdMiddleware
socket_application = SocketRequestIdMiddleware ( socket_application )يمكن العثور على المثال الكامل في ملف socket_app.py. أوصيك بالتحقق من ذلك قبل اتخاذ أي قرار. يمكن العثور على رمز من جانب العميل في ملف socket_client.py.
نتيجة:
[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
نعم ، سجلات المقبس هي أيضًا داخل التتبع. تمت إضافة معرف التتبع- S-4e2b7c5e و S-aaf46528 إلى رسائل السجل. للحصول على خبرة أفضل ، تمت إضافة البادئة S إلى معرف التتبع للتمييز بين معرف الطلب.
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 ,
)
),
)نتيجة:
(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]
تقع السجلات ضمن معرف العملية - PID:3710345 إلى رسائل السجل. يتم أيضًا تلوين رسائل السجل للحصول على رؤية أفضل. تتم كتابة رسائل السجل أيضًا إلى الملف إذا تم ضبط enable_file_logging على True . لمزيد من المعلومات ، تحقق من ملف config.py ، فئة UvicornLoggingSettings .
أنت لا تثق بي ، أليس كذلك؟ أفهم. هل تريد رؤيته في العمل ، أليس كذلك؟ لقد قمت بتغطية. سائدا
يمكنك العثور على أمثلة حول كيفية استخدام Chromatrace في دليل الأمثلة. قم بتشغيل الأمثلة باستخدام الأمر التالي:
python main.pyثم ، قم بالتشغيل:
curl 0.0.0.0:8000الآن ، تحقق من السجلات في المحطة.
أيضًا ، سيبدأ خادم المقبس وينتظر حتى يتصل العميل على http://localhost:8001 . بالنسبة إلى جانب عميل المقبس ، قم بتشغيل الأمر التالي في محطة أخرى:
python adaptors/socket_client.pyالآن ، تحقق من السجلات في كل من المحطة.
تم ترخيص هذا المشروع بموجب ترخيص GNU Affero العام - راجع ملف الترخيص للحصول على التفاصيل.