Chromatrace เป็นแพ็คเกจ Python ที่ออกแบบมาสำหรับความสามารถในการบันทึกขั้นสูงรวมถึงการติดตามและการร้องขอการจัดการ ID พร้อมกับรหัสกระบวนการ มันมีการกำหนดค่าการบันทึกที่ยืดหยุ่นและรองรับการบันทึกสีเพื่อการมองเห็นที่ดีขึ้น
ฉันเชื่อว่าการบันทึกเป็นส่วนสำคัญของแอปพลิเคชันใด ๆ และเป็นสิ่งสำคัญที่จะต้องมีระบบการบันทึกที่ดีและมีโครงสร้าง Chromatrace มีจุดมุ่งหมายเพื่อให้ระบบการบันทึกที่ง่ายและใช้งานง่ายซึ่งสามารถรวมเข้ากับแอปพลิเคชัน Python ใด ๆ กล่าวง่ายๆว่า Chromatrace เป็นแนวปฏิบัติที่ดีที่สุดในการเข้าสู่ระบบใน Python
คุณสามารถติดตั้ง 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__ ) ใช้ tracer decorator เพื่อติดตามฟังก์ชั่นของคุณ:
@ 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
บันทึกสองครั้งแรกออกจากการติดตามและไม่ได้เพิ่มรหัสติดตามลงในข้อความบันทึก ส่วนที่เหลือของบันทึกอยู่ในการติดตามและการติดตาม ID - 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
อย่างที่คุณเห็น ID คำขอ - 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
ใช่บันทึกซ็อกเก็ตยังอยู่ในร่องรอย TRACE ID- 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]
บันทึกอยู่ใน ID กระบวนการ - 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 ทั่วไป - ดูไฟล์ใบอนุญาตสำหรับรายละเอียด