Chromatrace는 Process ID와 함께 Trace 및 Request ID 관리를 포함하여 고급 로깅 기능을 위해 설계된 Python 패키지입니다. 유연한 로깅 구성을 제공하며 더 나은 가시성을 위해 색상 로깅을 지원합니다.
로깅은 모든 응용 프로그램의 필수 부분이라고 생각하며 잘 조직되고 구조화 된 로깅 시스템을 갖는 것이 중요합니다. Chromatrace는 Python 응용 프로그램에 통합 될 수있는 간단하고 사용하기 쉬운 로깅 시스템을 제공하는 것을 목표로합니다. 간단히 말해, Chromatrace는 Python로 기록하는 모범 사례입니다.
PIP를 통해 Chromatrace를 설치할 수 있습니다.
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 데코레이터를 사용하여 기능을 추적합니다.
@ 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-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 클래스를 확인하십시오.
당신은 나를 믿지 않습니까? 이해합니다. 실제로보고 싶어요? 나는 당신을 덮었습니다. :)
예제 디렉토리에서 Chromatrace를 사용하는 방법의 예를 찾을 수 있습니다. 다음 명령을 사용하여 예제를 실행하십시오.
python main.py그런 다음 달리기 :
curl 0.0.0.0:8000이제 터미널의 로그를 확인하십시오.
또한 소켓 서버가 시작하여 클라이언트가 http://localhost:8001 에서 연결 될 때까지 기다립니다. 소켓 클라이언트 측면의 경우 다른 터미널에서 다음 명령을 실행합니다.
python adaptors/socket_client.py이제 두 터미널의 로그를 확인하십시오.
이 프로젝트는 GNU Affero General Public License에 따라 라이센스가 부여됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.