17c5d7b27SShawn McCarney /** 27c5d7b27SShawn McCarney * Copyright © 2020 IBM Corporation 37c5d7b27SShawn McCarney * 47c5d7b27SShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License"); 57c5d7b27SShawn McCarney * you may not use this file except in compliance with the License. 67c5d7b27SShawn McCarney * You may obtain a copy of the License at 77c5d7b27SShawn McCarney * 87c5d7b27SShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0 97c5d7b27SShawn McCarney * 107c5d7b27SShawn McCarney * Unless required by applicable law or agreed to in writing, software 117c5d7b27SShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS, 127c5d7b27SShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137c5d7b27SShawn McCarney * See the License for the specific language governing permissions and 147c5d7b27SShawn McCarney * limitations under the License. 157c5d7b27SShawn McCarney */ 167c5d7b27SShawn McCarney #pragma once 177c5d7b27SShawn McCarney 18ca08a790SBob King #include <systemd/sd-journal.h> 19ca08a790SBob King 205248b8abSShawn McCarney #include <phosphor-logging/log.hpp> 215248b8abSShawn McCarney 227c5d7b27SShawn McCarney #include <string> 235248b8abSShawn McCarney #include <vector> 245248b8abSShawn McCarney 255248b8abSShawn McCarney namespace phosphor::power::regulators 265248b8abSShawn McCarney { 275248b8abSShawn McCarney 285248b8abSShawn McCarney /** 295248b8abSShawn McCarney * @class Journal 305248b8abSShawn McCarney * 315248b8abSShawn McCarney * Abstract base class that provides a journal interface. 325248b8abSShawn McCarney * 335248b8abSShawn McCarney * The interface is used to write messages/log entries to the system journal. 345248b8abSShawn McCarney */ 355248b8abSShawn McCarney class Journal 365248b8abSShawn McCarney { 375248b8abSShawn McCarney public: 385248b8abSShawn McCarney // Specify which compiler-generated methods we want 395248b8abSShawn McCarney Journal() = default; 405248b8abSShawn McCarney Journal(const Journal&) = delete; 415248b8abSShawn McCarney Journal(Journal&&) = delete; 425248b8abSShawn McCarney Journal& operator=(const Journal&) = delete; 435248b8abSShawn McCarney Journal& operator=(Journal&&) = delete; 445248b8abSShawn McCarney virtual ~Journal() = default; 455248b8abSShawn McCarney 465248b8abSShawn McCarney /** 47a528a281SShawn McCarney * Gets the journal messages that have the specified field set to the 48a528a281SShawn McCarney * specified value. 49a528a281SShawn McCarney * 50a528a281SShawn McCarney * The messages in the returned vector are ordered from oldest to newest. 51a528a281SShawn McCarney * 52a528a281SShawn McCarney * @param field journal field name 53a528a281SShawn McCarney * @param fieldValue expected field value 54a528a281SShawn McCarney * @param max Maximum number of messages to return. Specify 0 to return all 55a528a281SShawn McCarney * matching messages. 56a528a281SShawn McCarney * @return matching messages from the journal 57a528a281SShawn McCarney */ 58*92261f88SPatrick Williams virtual std::vector<std::string> getMessages(const std::string& field, 59*92261f88SPatrick Williams const std::string& fieldValue, 60a528a281SShawn McCarney unsigned int max = 0) = 0; 61a528a281SShawn McCarney 62a528a281SShawn McCarney /** 635248b8abSShawn McCarney * Logs a debug message in the system journal. 645248b8abSShawn McCarney * 655248b8abSShawn McCarney * @param message message to log 665248b8abSShawn McCarney */ 675248b8abSShawn McCarney virtual void logDebug(const std::string& message) = 0; 685248b8abSShawn McCarney 695248b8abSShawn McCarney /** 705248b8abSShawn McCarney * Logs debug messages in the system journal. 715248b8abSShawn McCarney * 725248b8abSShawn McCarney * @param messages messages to log 735248b8abSShawn McCarney */ 745248b8abSShawn McCarney virtual void logDebug(const std::vector<std::string>& messages) = 0; 755248b8abSShawn McCarney 765248b8abSShawn McCarney /** 775248b8abSShawn McCarney * Logs an error message in the system journal. 785248b8abSShawn McCarney * 795248b8abSShawn McCarney * @param message message to log 805248b8abSShawn McCarney */ 815248b8abSShawn McCarney virtual void logError(const std::string& message) = 0; 825248b8abSShawn McCarney 835248b8abSShawn McCarney /** 845248b8abSShawn McCarney * Logs error messages in the system journal. 855248b8abSShawn McCarney * 865248b8abSShawn McCarney * @param messages messages to log 875248b8abSShawn McCarney */ 885248b8abSShawn McCarney virtual void logError(const std::vector<std::string>& messages) = 0; 895248b8abSShawn McCarney 905248b8abSShawn McCarney /** 915248b8abSShawn McCarney * Logs an informational message in the system journal. 925248b8abSShawn McCarney * 935248b8abSShawn McCarney * @param message message to log 945248b8abSShawn McCarney */ 955248b8abSShawn McCarney virtual void logInfo(const std::string& message) = 0; 965248b8abSShawn McCarney 975248b8abSShawn McCarney /** 985248b8abSShawn McCarney * Logs informational messages in the system journal. 995248b8abSShawn McCarney * 1005248b8abSShawn McCarney * @param messages messages to log 1015248b8abSShawn McCarney */ 1025248b8abSShawn McCarney virtual void logInfo(const std::vector<std::string>& messages) = 0; 1035248b8abSShawn McCarney }; 1045248b8abSShawn McCarney 1055248b8abSShawn McCarney /** 1065248b8abSShawn McCarney * @class SystemdJournal 1075248b8abSShawn McCarney * 1085248b8abSShawn McCarney * Implementation of the Journal interface that writes to the systemd journal. 1095248b8abSShawn McCarney */ 1105248b8abSShawn McCarney class SystemdJournal : public Journal 1115248b8abSShawn McCarney { 1125248b8abSShawn McCarney public: 1135248b8abSShawn McCarney // Specify which compiler-generated methods we want 1145248b8abSShawn McCarney SystemdJournal() = default; 1155248b8abSShawn McCarney SystemdJournal(const SystemdJournal&) = delete; 1165248b8abSShawn McCarney SystemdJournal(SystemdJournal&&) = delete; 1175248b8abSShawn McCarney SystemdJournal& operator=(const SystemdJournal&) = delete; 1185248b8abSShawn McCarney SystemdJournal& operator=(SystemdJournal&&) = delete; 1195248b8abSShawn McCarney virtual ~SystemdJournal() = default; 1205248b8abSShawn McCarney 121ca08a790SBob King /** @copydoc Journal::getMessages() */ 122*92261f88SPatrick Williams virtual std::vector<std::string> getMessages(const std::string& field, 123*92261f88SPatrick Williams const std::string& fieldValue, 124ca08a790SBob King unsigned int max) override; 125ca08a790SBob King 1265248b8abSShawn McCarney /** @copydoc Journal::logDebug(const std::string&) */ logDebug(const std::string & message)1275248b8abSShawn McCarney virtual void logDebug(const std::string& message) override 1285248b8abSShawn McCarney { 1295248b8abSShawn McCarney using namespace phosphor::logging; 1305248b8abSShawn McCarney log<level::DEBUG>(message.c_str()); 1315248b8abSShawn McCarney } 1325248b8abSShawn McCarney 1335248b8abSShawn McCarney /** @copydoc Journal::logDebug(const std::vector<std::string>&) */ logDebug(const std::vector<std::string> & messages)1345248b8abSShawn McCarney virtual void logDebug(const std::vector<std::string>& messages) override 1355248b8abSShawn McCarney { 1365248b8abSShawn McCarney for (const std::string& message : messages) 1375248b8abSShawn McCarney { 1385248b8abSShawn McCarney logDebug(message); 1395248b8abSShawn McCarney } 1405248b8abSShawn McCarney } 1415248b8abSShawn McCarney 1425248b8abSShawn McCarney /** @copydoc Journal::logError(const std::string&) */ logError(const std::string & message)1435248b8abSShawn McCarney virtual void logError(const std::string& message) override 1445248b8abSShawn McCarney { 1455248b8abSShawn McCarney using namespace phosphor::logging; 1465248b8abSShawn McCarney log<level::ERR>(message.c_str()); 1475248b8abSShawn McCarney } 1485248b8abSShawn McCarney 1495248b8abSShawn McCarney /** @copydoc Journal::logError(const std::vector<std::string>&) */ logError(const std::vector<std::string> & messages)1505248b8abSShawn McCarney virtual void logError(const std::vector<std::string>& messages) override 1515248b8abSShawn McCarney { 1525248b8abSShawn McCarney for (const std::string& message : messages) 1535248b8abSShawn McCarney { 1545248b8abSShawn McCarney logError(message); 1555248b8abSShawn McCarney } 1565248b8abSShawn McCarney } 1575248b8abSShawn McCarney 1585248b8abSShawn McCarney /** @copydoc Journal::logInfo(const std::string&) */ logInfo(const std::string & message)1595248b8abSShawn McCarney virtual void logInfo(const std::string& message) override 1605248b8abSShawn McCarney { 1615248b8abSShawn McCarney using namespace phosphor::logging; 1625248b8abSShawn McCarney log<level::INFO>(message.c_str()); 1635248b8abSShawn McCarney } 1645248b8abSShawn McCarney 1655248b8abSShawn McCarney /** @copydoc Journal::logInfo(const std::vector<std::string>&) */ logInfo(const std::vector<std::string> & messages)1665248b8abSShawn McCarney virtual void logInfo(const std::vector<std::string>& messages) override 1675248b8abSShawn McCarney { 1685248b8abSShawn McCarney for (const std::string& message : messages) 1695248b8abSShawn McCarney { 1705248b8abSShawn McCarney logInfo(message); 1715248b8abSShawn McCarney } 1725248b8abSShawn McCarney } 173ca08a790SBob King 174ca08a790SBob King private: 175ca08a790SBob King /** 176a528a281SShawn McCarney * Gets the value of the specified field for the current journal entry. 177ca08a790SBob King * 178a528a281SShawn McCarney * Returns an empty string if the current journal entry does not have the 179a528a281SShawn McCarney * specified field. 180a528a281SShawn McCarney * 181a528a281SShawn McCarney * @param journal current journal entry 182a528a281SShawn McCarney * @param field journal field name 183a528a281SShawn McCarney * @return field value 184ca08a790SBob King */ 185a528a281SShawn McCarney std::string getFieldValue(sd_journal* journal, const std::string& field); 186a528a281SShawn McCarney 187a528a281SShawn McCarney /** 188a528a281SShawn McCarney * Gets the realtime (wallclock) timestamp for the current journal entry. 189a528a281SShawn McCarney * 190a528a281SShawn McCarney * @param journal current journal entry 191a528a281SShawn McCarney * @return timestamp as a date/time string 192a528a281SShawn McCarney */ 193a528a281SShawn McCarney std::string getTimeStamp(sd_journal* journal); 1945248b8abSShawn McCarney }; 1955248b8abSShawn McCarney 1965248b8abSShawn McCarney } // namespace phosphor::power::regulators 197