Chromatraceは、プロセス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
2つの最初のログはトレースがなく、トレース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に基づいてライセンスされています。詳細については、ライセンスファイルを参照してください。