OpenRTM-aistはFluent Bitプラグインのように、OpenRTM-aistデフォルトのロガー以外のロギング機能を拡張することができます。
このページでは独自ロガーの作成方法、使用手順を説明します。
今回作成したソースコードは以下から入手できます。
C++の場合はビルドのためのCMakeLists.txtを用意してください。今回はTestLoggerという名前で作成します。
cmake_minimum_required(VERSION 3.1) set(target TestLogger) project(${target} CXX) find_package(OpenRTM REQUIRED) add_definitions(${OPENRTM_CFLAGS}) link_directories(${OPENRTM_LIBRARY_DIRS}) add_library(${target} SHARED ${target}.cpp ${target}.h) target_link_libraries(${target} ${OPENRTM_LIBRARIES}) target_include_directories(${target} SYSTEM PRIVATE ${OPENRTM_INCLUDE_DIRS}) set_target_properties(${target} PROPERTIES PREFIX "")
ヘッダーファイル(TestLogger.h)、ソースファイル(TestLogger.cpp)を用意します。 coil::LogStreamBufferクラスを継承したTestLoggerStreamクラス、RTC::LogstreamBaseクラスを継承したTestLoggerクラスを実装します。 TestLoggerStreamはロギングの処理を実装するクラスで、TestLoggerはTestLoggerStreamを生成して外部から取得可能にするクラスです。
#ifndef TESTLOGGER_H #define TESTLOGGER_H #include <rtm/LogstreamBase.h> class TestLoggerStream : public coil::LogStreamBuffer { public: TestLoggerStream(); ~TestLoggerStream() override; bool init(const coil::Properties& prop); void write(int level, const std::string& name, const std::string& date, const std::string& mes) override; private: std::string header; }; class TestLogger : public RTC::LogstreamBase { public: TestLogger(); ~TestLogger() override; bool init(const coil::Properties& prop) override; coil::LogStreamBuffer* getStreamBuffer() override; private: TestLoggerStream m_logstream; }; extern "C" { void DLL_EXPORT TestLoggerInit(); } #endif
#include "TestLogger.h" #include <iostream> TestLoggerStream::TestLoggerStream() { } TestLoggerStream::~TestLoggerStream() { } bool TestLoggerStream::init(const coil::Properties& prop) { header = prop["header"]; return true; } void TestLoggerStream::write(int level, const std::string& name, const std::string& date, const std::string& mes) { std::cout << header << ":" << mes << std::endl; } TestLogger::TestLogger() { } TestLogger::~TestLogger() { } bool TestLogger::init(const coil::Properties& prop) { m_logstream.init(prop); return true; } coil::LogStreamBuffer* TestLogger::getStreamBuffer() { return &m_logstream; } extern "C" { void TestLoggerInit() { ::RTC::LogstreamFactory:: instance().addFactory("testlogger", ::coil::Creator< ::RTC::LogstreamBase, TestLogger>, ::coil::Destructor< ::RTC::LogstreamBase, TestLogger>); } }
TestLoggerクラスのinit関数で初期化、getStreamBuffer関数でLogStreamBufferオブジェクトを取得することができます。 TestLoggerクラスは特に理由が無ければ変更の必要はないです。
TestLoggerStreamクラスのwrite関数でログの出力を行います。 この例では、プロパティのheaderオプションに設定した文字列をログメッセージの先頭に追加して標準出力しています。
TestLoggerInit関数は動的ライブラリをロードする時に呼び出す関数です。〇〇.dllであれば〇〇Initというように、初期化関数は動的ライブラリの名前+Initにしてください。 TestLoggerInit関数内でLogstreamFactoryのaddFactory関数を呼ぶことでロガーを追加できます。
ビルドしてTestLogger.dll、TestLogger.soを生成後に動作確認を行います。
以下のrtc.confを作成してください。
logger.enable: YES logger.log_level: VERBOSE logger.plugins: TestLogger.dll logger.logstream.testlogger.enable: ON logger.logstream.testlogger.header: example
まずlogger.pluginsオプションを設定してTestLoggerをロードするようにします。 ただロードするだけでは有効にはならないため、logger.logstream.testlogger.enableオプションを設定します。
※OpenRTM-aistの動作としてはlogger.logstream.${モジュール名}以下のオプションが設定されている場合にロガーが有効になるため、必ずしもenableオプションである必要はありません。
logger.logstream.testlogger.headerオプションでログメッセージの先頭に追加する文字列を指定しています。
このrtc.confを指定してRTCを起動するとログが標準出力されることが確認できます。
Pythonファイル(TestLogger.py)を用意します。 OpenRTM_aist.LogstreamBaseを継承したTestLoggerクラスを実装します。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import OpenRTM_aist class TestLogger(OpenRTM_aist.LogstreamBase): def __init__(self): OpenRTM_aist.LogstreamBase.__init__(self) self._header = "" def __del__(self): pass def init(self, prop): self._header = prop.getProperty("header") return True def log(self, msg, level, name): print(self._header+":"+msg) return True def setLogLevel(self, level): pass def shutdown(self): return True def TestLoggerInit(mgr): OpenRTM_aist.LogstreamFactory.instance().addFactory("testlogger", TestLogger)
TestLoggerクラスのinit関数で初期化、log関数でログの出力、setLogLevel関数でログレベルの設定、shutdown関数で終了処理を行います。 この例では、プロパティのheaderオプションに設定した文字列をログメッセージの先頭に追加して標準出力しています。
TestLoggerInit関数はPythonモジュールをロードする時に呼び出す関数です。〇〇.pyであれば〇〇Initというように、初期化関数はPythonファイルの名前+Initにしてください。 TestLoggerInit関数内でLogstreamFactoryのaddFactory関数を呼ぶことでロガーを追加できます。
以下のrtc.confを作成してください。
logger.enable: YES logger.log_level: VERBOSE logger.plugins: TestLogger.py logger.logstream.testlogger.enable: ON logger.logstream.testlogger.header: example
まずlogger.pluginsオプションを設定してTestLoggerをロードするようにします。 ただロードするだけでは有効にはならないため、logger.logstream.testlogger.enableオプションを設定します。
logger.logstream.testlogger.headerオプションでログメッセージの先頭に追加する文字列を指定しています。
このrtc.confを指定してRTCを起動するとログが標準出力されることが確認できます。