1 #pragma once
2 
3 #include <systemd/sd-journal.h>
4 
5 #include <string>
6 #include <vector>
7 
8 namespace openpower::pels
9 {
10 
11 /**
12  * @class JournalBase
13  * Abstract class to read messages from the journal.
14  */
15 class JournalBase
16 {
17   public:
18     JournalBase() = default;
19     virtual ~JournalBase() = default;
20     JournalBase(const JournalBase&) = default;
21     JournalBase& operator=(const JournalBase&) = default;
22     JournalBase(JournalBase&&) = default;
23     JournalBase& operator=(JournalBase&&) = default;
24 
25     /**
26      * @brief Get messages from the journal
27      *
28      * @param syslogID - The SYSLOG_IDENTIFIER field value
29      * @param maxMessages - Max number of messages to get
30      *
31      * @return The messages
32      */
33     virtual std::vector<std::string> getMessages(const std::string& syslogID,
34                                                  size_t maxMessages) const = 0;
35 
36     /**
37      * @brief Call journalctl --sync to write unwritten journal data to disk
38      */
39     virtual void sync() const = 0;
40 };
41 
42 /**
43  * @class Journal
44  *
45  * Reads from the journal.
46  */
47 class Journal : public JournalBase
48 {
49   public:
50     Journal() = default;
51     ~Journal() = default;
52     Journal(const Journal&) = default;
53     Journal& operator=(const Journal&) = default;
54     Journal(Journal&&) = default;
55     Journal& operator=(Journal&&) = default;
56 
57     /**
58      * @brief Get messages from the journal
59      *
60      * @param syslogID - The SYSLOG_IDENTIFIER field value
61      * @param maxMessages - Max number of messages to get
62      *
63      * @return The messages
64      */
65     std::vector<std::string> getMessages(const std::string& syslogID,
66                                          size_t maxMessages) const override;
67 
68     /**
69      * @brief Call journalctl --sync to write unwritten journal data to disk
70      */
71     void sync() const override;
72 
73   private:
74     /**
75      * @brief Gets a field from the current journal entry
76      *
77      * @param journal - pointer to current journal entry
78      * @param field - The field name whose value to get
79      *
80      * @return std::string - The field value
81      */
82     std::string getFieldValue(sd_journal* journal,
83                               const std::string& field) const;
84 
85     /**
86      * @brief Gets a readable timestamp from the journal entry
87      *
88      * @param journal - pointer to current journal entry
89      *
90      * @return std::string - A timestamp string
91      */
92     std::string getTimeStamp(sd_journal* journal) const;
93 };
94 } // namespace openpower::pels
95