Chromatrace是一個專為高級日誌記錄功能而設計的Python軟件包,包括跟踪和請求ID管理以及過程ID。它提供了靈活的日誌記錄配置,並支持彩色日誌記錄,以提高可見度。
我認為記錄是任何應用程序的重要組成部分,並且至關重要的是擁有良好的結構化記錄系統。 Chromatrace旨在提供一個簡單易於使用的記錄系統,可以集成到任何Python應用程序中。簡而言之,色譜是在Python中登錄的最佳實踐。
您可以通過PIP安裝色譜:
pip install 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裝飾器跟踪您的功能:
@ 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中的日誌消息。其餘的日誌在跟踪中,並且在日誌消息中添加了跟踪ID -T 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 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
是的,插座日誌也在跟踪中。跟踪ID- S-4e2b7c5e和S-aaf46528已添加到日誌消息中。為了獲得更好的體驗,將前綴S添加到跟踪ID中,以將其與請求ID區分開。
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類。
你不信任我,對嗎?我明白。您想在行動中看到它,對嗎?我給你覆蓋了。 :)
您可以在示例目錄中找到如何使用色譜的示例。使用以下命令運行示例:
python main.py然後,運行:
curl 0.0.0.0:8000現在,檢查終端中的日誌。
此外,套接字服務器將啟動並等待客戶端在http://localhost:8001上連接。對於插座客戶端,在另一個終端運行以下命令:
python adaptors/socket_client.py現在,檢查兩個終端中的日誌。
該項目是根據GNU Affero通用公共許可證獲得許可的 - 有關詳細信息,請參見許可證文件。