diff --git a/src/core/common/notifier.cpp b/src/core/common/notifier.cpp index d0994256f..c39a36a6e 100644 --- a/src/core/common/notifier.cpp +++ b/src/core/common/notifier.cpp @@ -206,8 +206,9 @@ exit: void Notifier::LogChangedFlags(otChangedFlags aFlags) const { - otChangedFlags flags = aFlags; - bool isFirst = true; + otChangedFlags flags = aFlags; + bool addSpace = false; + bool didLog = false; String string; for (uint8_t bit = 0; bit < sizeof(otChangedFlags) * CHAR_BIT; bit++) @@ -216,20 +217,34 @@ void Notifier::LogChangedFlags(otChangedFlags aFlags) const if (flags & (1 << bit)) { - SuccessOrExit(string.Append("%s%s", isFirst ? "" : " ", FlagToString(1 << bit))); - isFirst = false; + if (string.GetLength() >= kFlagsStringLineLimit) + { + otLogInfoCore("Notifier: StateChanged (0x%08x) %s%s ...", aFlags, didLog ? "... " : "[", + string.AsCString()); + string.Clear(); + didLog = true; + addSpace = false; + } + + string.Append("%s%s", addSpace ? " " : "", FlagToString(1 << bit)); + addSpace = true; + flags ^= (1 << bit); } } exit: - otLogInfoCore("Notifier: StateChanged (0x%04x) [%s] ", aFlags, string.AsCString()); + otLogInfoCore("Notifier: StateChanged (0x%08x) %s%s] ", aFlags, didLog ? "... " : "[", string.AsCString()); } const char *Notifier::FlagToString(otChangedFlags aFlag) const { const char *retval = "(unknown)"; + // To ensure no clipping of flag names in the logs, the returned + // strings from this method should have shorter length than + // `kMaxFlagNameLength` value. + switch (aFlag) { case OT_CHANGED_IP6_ADDRESS_ADDED: diff --git a/src/core/common/notifier.hpp b/src/core/common/notifier.hpp index 34744b323..c432c7a77 100644 --- a/src/core/common/notifier.hpp +++ b/src/core/common/notifier.hpp @@ -187,7 +187,9 @@ private: enum { kMaxExternalHandlers = OPENTHREAD_CONFIG_MAX_STATECHANGE_HANDLERS, - kFlagsStringBufferSize = 128, + kFlagsStringLineLimit = 70, // Character limit to divide the log into multiple lines in `LogChangedFlags()`. + kMaxFlagNameLength = 25, // Max length for string representation of a flag by `FlagToString()`. + kFlagsStringBufferSize = kFlagsStringLineLimit + kMaxFlagNameLength, }; struct ExternalCallback