ROS 2 公式文書(英語) 日本語訳シリーズです。
本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。
※2019/05/06 現在のものです。
概要
現在サポートされているロギング機能は次のとおりです。
以下を提供するために共通のロギングライブラリを使用するクライアントライブラリ(
rclcpp
とrclpy
)。- さまざまなフィルタで通信内容を記録します。
- ロガーの階層
- ノードの名前と名前空間を自動的に使用するノードに関連付けられたロガー。
コンソール出力
- リモートでメッセージ確認するための rosout に類似したファイル出力と機能性を、近いうちに搭載します。
プログラムによるロガーレベルの設定
- デフォルトのロガーレベルの起動時設定がサポートされています。実行時の設定ファイルと外部設定が予定されています。
ロガーの概念
ログメッセージには、重要度レベルが関連付けられています:DEBUG
、INFO
、WARN
、ERROR
、またはFATAL
。いずれも昇順です。
ロガーは、ロガー用に選択された指定レベル以上の重大度を持つログメッセージのみを処理します。
各ノード(rclcpp
およびrclpy
内)には、自動的にノードの名前と名前空間を含むロガーが関連付けられています。ノードの名前がソースコードで定義されているもの以外のものに外部的にリマップされている場合、それはロガー名に反映されます。特定の名前を使用する非ノード向けロガーも作成できます。
ロガーの名称を階層を表現することができます。 “ abc.def” という名前のロガーのレベルが設定されていない場合は、“ abc” という名前の親のレベルに従います。そのレベルも設定されていない場合は、デフォルトのロガーレベルが使用されます。ロガー "abc" のレベルが変更されると、そのレベルを明示的に設定していない限り、そのすべての子孫(「abc.def」、「abc.ghi.jkl」など)にも変更が反映されます。
ロギング使用法
C++ の場合
- 使用例については、ロギングのデモのチュートリアル(英語) を参照して下さい。
- 豊富な機能リストについては、rclcppのドキュメントを参照して下さい。
Python の場合
- ノードのロガーの使用例については、
rclpy
のサンプルを参照して下さい。 - キーワード引数の使用例については、
rclpy
のテストを参照して下さい(例:skip_first
、once
)。
ロガー設定
デフォルトの重大度のコマンドライン設定
Bouncy ROS 2リリース以降、ロガーのデフォルトの重大度レベルは、たとえば次のようにコマンドラインから設定できます(レベル文字列は大文字と小文字を区別しません)。
ros2 run demo_nodes_cpp listener __log_level:=debug
これは、特定の重大度を使用するように明示的に設定されていないすべてのロガーに影響します。コマンドラインから特定のロガーを設定できる機能も近々搭載予定です。
個々のロガーのプログラムによる設定
ロガー設定はまだ開発中です。現時点では、個々のロガーの重大度レベルは、次のようにプログラム的に設定できます。
C++ の場合
rcutils_logging_set_logger_level("logger_name", RCUTILS_LOG_SEVERITY_DEBUG);
Python の場合
logger.set_level(rclpy.logging.LoggingSeverity.DEBUG)
rclpy.logging.set_logger_level('logger_name', rclpy.logging.LoggingSeverity.DEBUG)
ロギングデモのチュートリアルでは、ロガーを外部で設定できるように手動でサービスを公開するサンプルを紹介しています。将来的には、ロガーの実行時設定機能が自動的に公開される仕様とすることを検討しています。
コンソール出力設定
デフォルトでは、コンソール出力はメッセージの重大度、ロガー名、およびメッセージを含むようにフォーマットされます。ファイル名、関数名、ログ呼び出しの行番号などの情報も利用できます。
カスタムコンソール出力フォーマットはRCUTILS_CONSOLE_OUTPUT_FORMAT
環境変数で設定できます。詳細はrcutils のドキュメントを参照してください。 rclpy
とrclcpp
は両方ともロギングにrcutils
を使用するので、これは全ての Python と C++ のノードにも反映されます。