diff --git a/docs/internal-api.md b/docs/internal-api.md index 18dd15b1b0..cc14658ca8 100644 --- a/docs/internal-api.md +++ b/docs/internal-api.md @@ -6,6 +6,16 @@ These flags and variables are for LWNode.js core development usage only. Do not ### Flags +#### `--dlog=` + +If the `--dlog` flag is specified on Tizen, LWNode prints logs via `DLOG` when +running from an embedder or the terminal. `DLOG_TAG` must be given, and is used +as the output TAG for loggers like `console.log()`. + +```shell +--dlog=JS_APP +``` + #### `--internal-log` If the `--internal-log` flag is specified or the `LWNODE_INTERNAL_LOG` environment variable is set to 1, LWNode will print internal logs in release build. diff --git a/src/api/engine.cc b/src/api/engine.cc index 5d9a8fc6d6..2935d78f6b 100644 --- a/src/api/engine.cc +++ b/src/api/engine.cc @@ -373,6 +373,29 @@ void Engine::initialize() { registerGCEventListeners(); } +#if defined(HOST_TIZEN) + if (EscargotShim::Global::flags()->isOn( + EscargotShim::Flag::Type::DlogOutput)) { + Flag* flag = EscargotShim::Global::flags()->getFlag( + EscargotShim::Flag::Type::DlogOutput); + + std::string user_tag = flag->getValue(); + if (!user_tag.empty()) { + LogKind::user()->tag = user_tag; + } + + LogOption::setDefaultOutputInstantiator([]() { + static thread_local std::shared_ptr s_loggerOutput; + if (s_loggerOutput == nullptr) { + s_loggerOutput = std::static_pointer_cast( + std::make_shared()); + } + return s_loggerOutput; + }); + LWNODE_DEV_LOG("DEV_LOG: OK"); + } +#endif + mainThreadId_ = std::this_thread::get_id(); } diff --git a/src/api/utils/logger/flags.cc b/src/api/utils/logger/flags.cc index b9005883c0..99dc159e4e 100644 --- a/src/api/utils/logger/flags.cc +++ b/src/api/utils/logger/flags.cc @@ -46,6 +46,7 @@ void Flags::initFlags() { addFlag("--trace-call=", Flag::Type::TraceCall, true); addFlag("--internal-log", Flag::Type::InternalLog); addFlag("--start-debug-server", Flag::Type::DebugServer); + addFlag("--dlog=", Flag::Type::DlogOutput, true); } bool Flag::isPrefixOf(const std::string& name) { @@ -92,7 +93,8 @@ void Flags::add(const std::string& userOption) { add(flag); if (flag->type() == Flag::Type::TraceCall || - flag->type() == Flag::Type::UnhandledRejections) { + flag->type() == Flag::Type::UnhandledRejections || + flag->type() == Flag::Type::DlogOutput) { std::string optionValues = userOption.substr(userOption.find_first_of('=') + 1); // +1 for skipping '=' auto tokens = strSplit(optionValues, ','); diff --git a/src/api/utils/logger/flags.h b/src/api/utils/logger/flags.h index 44a09563e0..009052e240 100644 --- a/src/api/utils/logger/flags.h +++ b/src/api/utils/logger/flags.h @@ -49,6 +49,7 @@ class Flag { InternalLog, LWNodeOther, DebugServer, + DlogOutput, }; Flag(const std::string& name, Type type, bool useAsPrefix = false) @@ -61,6 +62,7 @@ class Flag { virtual void addValue(const std::string& value){}; virtual bool hasValue(const std::string& value) { return false; } + virtual std::string getValue() { return ""; } virtual void addNegativeValue(const std::string& value) {} virtual bool hasNegativeValue(const std::string& value) { return false; } @@ -85,6 +87,14 @@ class FlagWithValues : public Flag { return values_.find(value) != values_.end(); } + virtual std::string getValue() override { + if (!values_.empty()) { + auto iter = values_.begin(); + return *iter; + } + return ""; + } + private: std::set values_; }; @@ -131,13 +141,13 @@ class LWNODE_EXPORT Flags { std::set get() { return flags_; }; void set(std::set flags) { flags_ = flags; } + Flag* getFlag(Flag::Type type); + private: void initFlags(); Flag* findFlagObject(const std::string& name); Flag* findFlagObject(Flag::Type type); - Flag* getFlag(Flag::Type type); - template void addFlag(const char* name, Flag::Type type, bool useAsPrefix = false) { validFlags_.push_back(std::make_unique(name, type, useAsPrefix));