diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..ea71ad6
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,99 @@
+---
+Language:        Cpp
+# BasedOnStyle:  LLVM
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlinesLeft: false
+AlignOperands:   true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:
+  AfterClass:      true
+  AfterControlStatement: true
+  AfterEnum:       true
+  AfterFunction:   true
+  AfterNamespace:  true
+  AfterObjCDeclaration: true
+  AfterStruct:     true
+  AfterUnion:      true
+  BeforeCatch:     true
+  BeforeElse:      true
+  IndentBraces:    false
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Custom
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: AfterColon
+ColumnLimit:     80
+CommentPragmas:  '^ IWYU pragma:'
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+PointerAlignment: Left
+DisableFormat:   false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
+IncludeBlocks: Regroup
+IncludeCategories:
+  - Regex:           '^[<"](gtest|gmock)'
+    Priority:        5
+  - Regex:           '^"config.h"'
+    Priority:        -1
+  - Regex:           '^".*\.hpp"'
+    Priority:        1
+  - Regex:           '^<.*\.h>'
+    Priority:        2
+  - Regex:           '^<.*'
+    Priority:        3
+  - Regex:           '.*'
+    Priority:        4
+IndentCaseLabels: true
+IndentWidth:     4
+IndentWrappedFunctionNames: true
+KeepEmptyLinesAtTheStartOfBlocks: true
+MacroBlockBegin: ''
+MacroBlockEnd:   ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 60
+ReflowComments:  true
+SortIncludes:    true
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: false
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles:  false
+SpacesInContainerLiterals: true
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard:        Cpp11
+TabWidth:        4
+UseTab:          Never
+...
+
diff --git a/src/dbus_server.cpp b/src/dbus_server.cpp
index 53a2087..aba7694 100644
--- a/src/dbus_server.cpp
+++ b/src/dbus_server.cpp
@@ -19,16 +19,16 @@
  */
 
 #include "dbus_server.hpp"
+
 #include <xyz/openbmc_project/Common/File/error.hpp>
 
-
-DbusServer::DbusServer(LogManager& logManager, sdbusplus::bus::bus& bus, const char* path /*= HOSTLOGGER_DBUS_PATH*/)
-: server_inherit(bus, path),
-  logManager_(logManager)
+DbusServer::DbusServer(LogManager& logManager, sdbusplus::bus::bus& bus,
+                       const char* path /*= HOSTLOGGER_DBUS_PATH*/) :
+    server_inherit(bus, path),
+    logManager_(logManager)
 {
 }
 
-
 void DbusServer::flush()
 {
     const int rc = logManager_.flush();
diff --git a/src/dbus_server.hpp b/src/dbus_server.hpp
index 1e6d47c..e058edf 100644
--- a/src/dbus_server.hpp
+++ b/src/dbus_server.hpp
@@ -21,12 +21,13 @@
 #pragma once
 
 #include "log_manager.hpp"
+
 #include <xyz/openbmc_project/HostLogger/server.hpp>
 
 /** @brief D-Bus interface name. */
 #define HOSTLOGGER_DBUS_IFACE "xyz.openbmc_project.HostLogger"
 /** @brief D-Bus path. */
-#define HOSTLOGGER_DBUS_PATH  "/xyz/openbmc_project/HostLogger"
+#define HOSTLOGGER_DBUS_PATH "/xyz/openbmc_project/HostLogger"
 
 /** @brief unique_ptr functor to release an event reference. */
 struct EventDeleter
@@ -41,27 +42,29 @@
 using EventPtr = std::unique_ptr<sd_event, EventDeleter>;
 
 // Typedef for super class
-using server_inherit = sdbusplus::server::object_t<sdbusplus::xyz::openbmc_project::server::HostLogger>;
-
+using server_inherit = sdbusplus::server::object_t<
+    sdbusplus::xyz::openbmc_project::server::HostLogger>;
 
 /** @class DbusServer
  *  @brief D-Bus service by host logger.
  */
-class DbusServer: public server_inherit
+class DbusServer : public server_inherit
 {
-public:
+  public:
     /** @brief Constructor.
      *
      *  @param[in] logManager - log manager
      *  @param[in] bus - bus to attach to
-     *  @param[in] path - bath to attach at, optional, default is HOSTLOGGER_DBUS_PATH
+     *  @param[in] path - bath to attach at, optional, default is
+     * HOSTLOGGER_DBUS_PATH
      */
-    DbusServer(LogManager& logManager, sdbusplus::bus::bus& bus, const char* path = HOSTLOGGER_DBUS_PATH);
+    DbusServer(LogManager& logManager, sdbusplus::bus::bus& bus,
+               const char* path = HOSTLOGGER_DBUS_PATH);
 
     // From server_inherit
     void flush();
 
-private:
+  private:
     /** @brief Log manager instance. */
     LogManager& logManager_;
 };
diff --git a/src/dbus_watch.cpp b/src/dbus_watch.cpp
index ca5118e..f97c33b 100644
--- a/src/dbus_watch.cpp
+++ b/src/dbus_watch.cpp
@@ -18,11 +18,13 @@
  * limitations under the License.
  */
 
-#include "config.hpp"
 #include "dbus_watch.hpp"
+
+#include "config.hpp"
+
+#include <chrono>
 #include <set>
 #include <string>
-#include <chrono>
 
 // D-Bus path to the host state object
 #define DBUS_HOST_OBJECT_PATH "/xyz/openbmc_project/state/host0"
@@ -31,25 +33,21 @@
 // positive code is not an error in the systemd dbus implementation.
 #define DBUS_RC_TO_ERR(c) (c = (c <= 0 ? -c : 0))
 
-
-DbusWatcher::DbusWatcher(LogManager& logManager, sdbusplus::bus::bus& bus)
-: logManager_(logManager),
-  bus_(bus)
+DbusWatcher::DbusWatcher(LogManager& logManager, sdbusplus::bus::bus& bus) :
+    logManager_(logManager), bus_(bus)
 {
 }
 
-
 int DbusWatcher::initialize()
 {
     int rc;
 
     // Add IO callback for host's log stream socket
-    rc = sd_event_add_io(bus_.get_event(), NULL,
-                         logManager_.getHostLogFd(),
+    rc = sd_event_add_io(bus_.get_event(), NULL, logManager_.getHostLogFd(),
                          EPOLLIN, &DbusWatcher::ioCallback, this);
-    if (DBUS_RC_TO_ERR(rc)) {
-        fprintf(stderr, "Unable to add IO handler: %i %s\n",
-                        rc, strerror(rc));
+    if (DBUS_RC_TO_ERR(rc))
+    {
+        fprintf(stderr, "Unable to add IO handler: %i %s\n", rc, strerror(rc));
         return rc;
     }
 
@@ -62,71 +60,70 @@
     return rc;
 }
 
-
 void DbusWatcher::registerEventHandler()
 {
     conds_["xyz.openbmc_project.State.Host"] = {
         .property = "RequestedHostTransition",
-        .values = {
-            "xyz.openbmc_project.State.Host.Transition.On"
-        }
-    };
+        .values = {"xyz.openbmc_project.State.Host.Transition.On"}};
     conds_["xyz.openbmc_project.State.OperatingSystem.Status"] = {
         .property = "OperatingSystemState",
-        .values = {
-            "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.BootComplete",
-            "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus.Inactive"
-        }
-    };
-    for (auto& cond: conds_) {
-        cond.second.match = std::make_unique<sdbusplus::bus::match_t>(bus_,
-                            sdbusplus::bus::match::rules::propertiesChanged(
-                            DBUS_HOST_OBJECT_PATH, cond.first),
-                            [this](auto& msg){ this->hostStateHandler(msg); });
+        .values = {"xyz.openbmc_project.State.OperatingSystem.Status.OSStatus."
+                   "BootComplete",
+                   "xyz.openbmc_project.State.OperatingSystem.Status.OSStatus."
+                   "Inactive"}};
+    for (auto& cond : conds_)
+    {
+        cond.second.match = std::make_unique<sdbusplus::bus::match_t>(
+            bus_,
+            sdbusplus::bus::match::rules::propertiesChanged(
+                DBUS_HOST_OBJECT_PATH, cond.first),
+            [this](auto& msg) { this->hostStateHandler(msg); });
     }
 }
 
-
 int DbusWatcher::registerTimerHandler()
 {
     int rc;
     sd_event_source* ev = NULL;
 
-    rc = sd_event_add_time(bus_.get_event(), &ev, CLOCK_MONOTONIC,
-                           UINT64_MAX, 0, &DbusWatcher::timerCallback, this);
-    if (DBUS_RC_TO_ERR(rc)) {
-        fprintf(stderr, "Unable to add timer handler: %i %s\n", rc, strerror(rc));
+    rc = sd_event_add_time(bus_.get_event(), &ev, CLOCK_MONOTONIC, UINT64_MAX,
+                           0, &DbusWatcher::timerCallback, this);
+    if (DBUS_RC_TO_ERR(rc))
+    {
+        fprintf(stderr, "Unable to add timer handler: %i %s\n", rc,
+                strerror(rc));
         return rc;
     }
 
     rc = sd_event_source_set_enabled(ev, SD_EVENT_ON);
-    if (DBUS_RC_TO_ERR(rc)) {
-        fprintf(stderr, "Unable to enable timer handler: %i %s\n", rc, strerror(rc));
+    if (DBUS_RC_TO_ERR(rc))
+    {
+        fprintf(stderr, "Unable to enable timer handler: %i %s\n", rc,
+                strerror(rc));
         return rc;
     }
 
     return setupTimer(ev);
 }
 
-
 int DbusWatcher::setupTimer(sd_event_source* event)
 {
     // Get the current time and add the delta (flush period)
     using namespace std::chrono;
     auto now = steady_clock::now().time_since_epoch();
     hours timeOut(loggerConfig.flushPeriod);
-    auto expireTime = duration_cast<microseconds>(now) +
-                      duration_cast<microseconds>(timeOut);
+    auto expireTime =
+        duration_cast<microseconds>(now) + duration_cast<microseconds>(timeOut);
 
-    //Set the time
+    // Set the time
     int rc = sd_event_source_set_time(event, expireTime.count());
     if (DBUS_RC_TO_ERR(rc))
-        fprintf(stderr, "Unable to set timer handler: %i %s\n", rc, strerror(rc));
+        fprintf(stderr, "Unable to set timer handler: %i %s\n", rc,
+                strerror(rc));
 
     return rc;
 }
 
-
 void DbusWatcher::hostStateHandler(sdbusplus::message::message& msg)
 {
     std::map<std::string, sdbusplus::message::variant<std::string>> properties;
@@ -136,11 +133,15 @@
 
     bool needFlush = false;
     const auto itc = conds_.find(interface);
-    if (itc != conds_.end()) {
+    if (itc != conds_.end())
+    {
         const auto itp = properties.find(itc->second.property);
-        if (itp != properties.end()) {
-            const auto& propVal = sdbusplus::message::variant_ns::get<std::string>(itp->second);
-            needFlush = itc->second.values.find(propVal) != itc->second.values.end();
+        if (itp != properties.end())
+        {
+            const auto& propVal =
+                sdbusplus::message::variant_ns::get<std::string>(itp->second);
+            needFlush =
+                itc->second.values.find(propVal) != itc->second.values.end();
         }
     }
 
@@ -148,16 +149,16 @@
         logManager_.flush();
 }
 
-
-int DbusWatcher::ioCallback(sd_event_source* /*event*/, int /*fd*/, uint32_t /*revents*/, void* data)
+int DbusWatcher::ioCallback(sd_event_source* /*event*/, int /*fd*/,
+                            uint32_t /*revents*/, void* data)
 {
     DbusWatcher* instance = static_cast<DbusWatcher*>(data);
     instance->logManager_.handleHostLog();
     return 0;
 }
 
-
-int DbusWatcher::timerCallback(sd_event_source* event, uint64_t /*usec*/, void* data)
+int DbusWatcher::timerCallback(sd_event_source* event, uint64_t /*usec*/,
+                               void* data)
 {
     DbusWatcher* instance = static_cast<DbusWatcher*>(data);
     instance->logManager_.flush();
diff --git a/src/dbus_watch.hpp b/src/dbus_watch.hpp
index 1f5201f..6a284b4 100644
--- a/src/dbus_watch.hpp
+++ b/src/dbus_watch.hpp
@@ -22,20 +22,17 @@
 
 #include "log_manager.hpp"
 
-#include <set>
 #include <map>
-#include <string>
-
 #include <sdbusplus/bus/match.hpp>
-
-
+#include <set>
+#include <string>
 
 /** @class DbusServer
  *  @brief D-Bus service by host logger.
  */
 class DbusWatcher
 {
-public:
+  public:
     /** @brief Constructor.
      *
      *  @param[in] logManager - log manager
@@ -49,7 +46,7 @@
      */
     int initialize();
 
-private:
+  private:
     /** @brief Register D-Bus event handler. */
     void registerEventHandler();
 
@@ -73,19 +70,21 @@
      */
     void hostStateHandler(sdbusplus::message::message& msg);
 
-    /** @brief D-Bus IO callback used to handle incoming data on the opened file.
-     *         See sd_event_io_handler_t for details.
+    /** @brief D-Bus IO callback used to handle incoming data on the opened
+     * file. See sd_event_io_handler_t for details.
      */
-    static int ioCallback(sd_event_source* event, int fd, uint32_t revents, void* data);
+    static int ioCallback(sd_event_source* event, int fd, uint32_t revents,
+                          void* data);
 
     /** @brief D-Bus timer callback used to flush log store.
      *         See sd_event_add_time for details.
      */
     static int timerCallback(sd_event_source* event, uint64_t usec, void* data);
 
-private:
+  private:
     /** @struct FlushCondition
-     *  @brief Describes flush conditions for log manager based on host state event.
+     *  @brief Describes flush conditions for log manager based on host state
+     * event.
      */
     struct FlushCondition
     {
@@ -97,7 +96,7 @@
         std::unique_ptr<sdbusplus::bus::match_t> match;
     };
 
-private:
+  private:
     /** @brief Log manager instance. */
     LogManager& logManager_;
 
diff --git a/src/log_manager.cpp b/src/log_manager.cpp
index b78b7e8..506e586 100644
--- a/src/log_manager.cpp
+++ b/src/log_manager.cpp
@@ -18,68 +18,75 @@
  * limitations under the License.
  */
 
-#include "config.hpp"
 #include "log_manager.hpp"
 
-#include <set>
-#include <vector>
-#include <cstring>
-#include <unistd.h>
+#include "config.hpp"
+
 #include <dirent.h>
+#include <sys/ioctl.h>
 #include <sys/socket.h>
-#include <sys/un.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <sys/ioctl.h>
+#include <sys/un.h>
+#include <unistd.h>
+
+#include <cstring>
+#include <set>
+#include <vector>
 
 // Path to the Unix Domain socket file used to read host's logs
-#define HOSTLOG_SOCKET_PATH     "\0obmc-console"
+#define HOSTLOG_SOCKET_PATH "\0obmc-console"
 // Number of connection attempts
 #define HOSTLOG_SOCKET_ATTEMPTS 60
 // Pause between connection attempts in seconds
-#define HOSTLOG_SOCKET_PAUSE    1
+#define HOSTLOG_SOCKET_PAUSE 1
 // Max buffer size to read from socket
-#define MAX_SOCKET_BUFFER_SIZE  512
+#define MAX_SOCKET_BUFFER_SIZE 512
 
-
-LogManager::LogManager()
-: fd_(-1)
+LogManager::LogManager() : fd_(-1)
 {
 }
 
-
 LogManager::~LogManager()
 {
     closeHostLog();
 }
 
-
 int LogManager::openHostLog()
 {
     int rc;
 
-    do {
+    do
+    {
         // Create socket
         fd_ = socket(AF_UNIX, SOCK_STREAM, 0);
-        if (fd_ == -1) {
+        if (fd_ == -1)
+        {
             rc = errno;
-            fprintf(stderr, "Unable to create socket: error [%i] %s\n", rc, strerror(rc));
+            fprintf(stderr, "Unable to create socket: error [%i] %s\n", rc,
+                    strerror(rc));
             break;
         }
 
         // Set non-blocking mode for socket
         int opt = 1;
         rc = ioctl(fd_, FIONBIO, &opt);
-        if (rc != 0) {
+        if (rc != 0)
+        {
             rc = errno;
-            fprintf(stderr, "Unable to set non-blocking mode for log socket: error [%i] %s\n", rc, strerror(rc));
+            fprintf(stderr,
+                    "Unable to set non-blocking mode for log socket: error "
+                    "[%i] %s\n",
+                    rc, strerror(rc));
             break;
         }
 
-        sockaddr_un sa = { 0 };
+        sockaddr_un sa = {0};
         sa.sun_family = AF_UNIX;
-        constexpr int min_path = sizeof(HOSTLOG_SOCKET_PATH) < sizeof(sa.sun_path) ?
-                                 sizeof(HOSTLOG_SOCKET_PATH) : sizeof(sa.sun_path);
+        constexpr int min_path =
+            sizeof(HOSTLOG_SOCKET_PATH) < sizeof(sa.sun_path)
+                ? sizeof(HOSTLOG_SOCKET_PATH)
+                : sizeof(sa.sun_path);
         memcpy(&sa.sun_path, HOSTLOG_SOCKET_PATH, min_path);
 
         // Connect to host's log stream via socket.
@@ -87,16 +94,21 @@
         // we have a dependency on it written in the systemd unit file, but
         // we can't guarantee that the socket is initialized at the moment.
         rc = -1;
-        for (int attempt = 0; rc != 0 && attempt < HOSTLOG_SOCKET_ATTEMPTS; ++attempt) {
-            rc = connect(fd_, reinterpret_cast<const sockaddr*>(&sa), sizeof(sa));
+        for (int attempt = 0; rc != 0 && attempt < HOSTLOG_SOCKET_ATTEMPTS;
+             ++attempt)
+        {
+            rc = connect(fd_, reinterpret_cast<const sockaddr*>(&sa),
+                         sizeof(sa));
             sleep(HOSTLOG_SOCKET_PAUSE);
         }
-        if (rc < 0) {
+        if (rc < 0)
+        {
             rc = errno;
-            fprintf(stderr, "Unable to connect to host log socket: error [%i] %s\n", rc, strerror(rc));
+            fprintf(stderr,
+                    "Unable to connect to host log socket: error [%i] %s\n", rc,
+                    strerror(rc));
         }
-    }
-    while (false);
+    } while (false);
 
     if (rc != 0)
         closeHostLog();
@@ -104,22 +116,20 @@
     return rc;
 }
 
-
 void LogManager::closeHostLog()
 {
-    if (fd_ != -1) {
+    if (fd_ != -1)
+    {
         ::close(fd_);
         fd_ = -1;
     }
 }
 
-
 int LogManager::getHostLogFd() const
 {
     return fd_;
 }
 
-
 int LogManager::handleHostLog()
 {
     int rc = 0;
@@ -127,7 +137,8 @@
     size_t readLen = MAX_SOCKET_BUFFER_SIZE;
 
     // Read all existing data from log stream
-    while (rc == 0 && readLen != 0) {
+    while (rc == 0 && readLen != 0)
+    {
         rc = readHostLog(&buff[0], buff.size(), readLen);
         if (rc == 0 && readLen != 0)
             storage_.parse(&buff[0], readLen);
@@ -136,7 +147,6 @@
     return rc;
 }
 
-
 int LogManager::flush()
 {
     int rc;
@@ -160,39 +170,47 @@
     return 0;
 }
 
-
-int LogManager::readHostLog(char* buffer, size_t bufferLen, size_t& readLen) const
+int LogManager::readHostLog(char* buffer, size_t bufferLen,
+                            size_t& readLen) const
 {
     int rc = 0;
 
     const ssize_t rsz = ::read(fd_, buffer, bufferLen);
     if (rsz >= 0)
         readLen = static_cast<size_t>(rsz);
-    else {
+    else
+    {
         readLen = 0;
-        if (errno != EAGAIN && errno != EWOULDBLOCK) {
+        if (errno != EAGAIN && errno != EWOULDBLOCK)
+        {
             rc = errno;
-            fprintf(stderr, "Unable to read host log: error [%i] %s\n", rc, strerror(rc));
+            fprintf(stderr, "Unable to read host log: error [%i] %s\n", rc,
+                    strerror(rc));
         }
     }
 
     return rc;
 }
 
-
 std::string LogManager::prepareLogPath() const
 {
     // Create path for logs
-    if (::access(loggerConfig.path, F_OK) != 0) {
+    if (::access(loggerConfig.path, F_OK) != 0)
+    {
         const std::string logPath(loggerConfig.path);
         const size_t len = logPath.length();
         size_t pos = 0;
-        while (pos < len - 1) {
+        while (pos < len - 1)
+        {
             pos = logPath.find('/', pos + 1);
             const std::string createPath = logPath.substr(0, pos);
-            if (::mkdir(createPath.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0 && errno != EEXIST) {
+            if (::mkdir(createPath.c_str(),
+                        S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0 &&
+                errno != EEXIST)
+            {
                 const int rc = errno;
-                fprintf(stderr, "Unable to create dir %s: error [%i] %s\n", createPath.c_str(), rc, strerror(rc));
+                fprintf(stderr, "Unable to create dir %s: error [%i] %s\n",
+                        createPath.c_str(), rc, strerror(rc));
                 return std::string();
             }
         }
@@ -201,17 +219,16 @@
     // Construct log file name
     time_t ts;
     time(&ts);
-    tm lt = { 0 };
+    tm lt = {0};
     localtime_r(&ts, &lt);
     char fileName[64];
     snprintf(fileName, sizeof(fileName), "/host_%i%02i%02i_%02i%02i%02i.log.gz",
-            lt.tm_year + 1900, lt.tm_mon + 1, lt.tm_mday,
-            lt.tm_hour, lt.tm_min, lt.tm_sec);
+             lt.tm_year + 1900, lt.tm_mon + 1, lt.tm_mday, lt.tm_hour,
+             lt.tm_min, lt.tm_sec);
 
     return std::string(loggerConfig.path) + fileName;
 }
 
-
 int LogManager::rotateLogFiles() const
 {
     if (loggerConfig.rotationLimit == 0)
@@ -222,13 +239,16 @@
     // Get file list to std::set
     std::set<std::string> logFiles;
     DIR* dh = opendir(loggerConfig.path);
-    if (!dh) {
+    if (!dh)
+    {
         rc = errno;
-        fprintf(stderr, "Unable to open directory %s: error [%i] %s\n", loggerConfig.path, rc, strerror(rc));
+        fprintf(stderr, "Unable to open directory %s: error [%i] %s\n",
+                loggerConfig.path, rc, strerror(rc));
         return rc;
     }
-    dirent *dir;
-    while ((dir = readdir(dh))) {
+    dirent* dir;
+    while ((dir = readdir(dh)))
+    {
         if (dir->d_type != DT_DIR)
             logFiles.insert(dir->d_name);
     }
@@ -238,14 +258,18 @@
     // The sorted array of names (std::set) will contain the oldest file on the
     // top.
     // Remove oldest files.
-    int filesToRemove = static_cast<int>(logFiles.size()) - loggerConfig.rotationLimit;
-    while (rc == 0 && --filesToRemove >= 0) {
+    int filesToRemove =
+        static_cast<int>(logFiles.size()) - loggerConfig.rotationLimit;
+    while (rc == 0 && --filesToRemove >= 0)
+    {
         std::string fileToRemove = loggerConfig.path;
         fileToRemove += '/';
         fileToRemove += *logFiles.begin();
-        if (::unlink(fileToRemove.c_str()) == -1) {
+        if (::unlink(fileToRemove.c_str()) == -1)
+        {
             rc = errno;
-            fprintf(stderr, "Unable to delete file %s: error [%i] %s\n", fileToRemove.c_str(), rc, strerror(rc));
+            fprintf(stderr, "Unable to delete file %s: error [%i] %s\n",
+                    fileToRemove.c_str(), rc, strerror(rc));
         }
         logFiles.erase(fileToRemove);
     }
diff --git a/src/log_manager.hpp b/src/log_manager.hpp
index 5dac0f9..3513dac 100644
--- a/src/log_manager.hpp
+++ b/src/log_manager.hpp
@@ -22,14 +22,13 @@
 
 #include "log_storage.hpp"
 
-
 /** @class LogManager
  *  @brief Log manager.
  *         All functions within this class are not thread-safe.
  */
 class LogManager
 {
-public:
+  public:
     /** @brief Constructor. */
     LogManager();
 
@@ -43,11 +42,12 @@
     int openHostLog();
 
     /** @brief Close the host's log stream.
-    */
+     */
     void closeHostLog();
 
     /** @brief Get file descriptor by host's log stream.
-     *         Descriptor can be used to register it in an external polling manager.
+     *         Descriptor can be used to register it in an external polling
+     * manager.
      *
      *  @return file descriptor (actually it is an opened socket)
      */
@@ -66,7 +66,7 @@
      */
     int flush();
 
-private:
+  private:
     /** @brief Read incoming data from host's log stream.
      *
      *  @param[out] buffer - buffer to write incoming data
@@ -98,7 +98,7 @@
      */
     int rotateLogFiles() const;
 
-private:
+  private:
     /** @brief Log storage. */
     LogStorage storage_;
     /** @brief File descriptor of the input log stream. */
diff --git a/src/log_storage.cpp b/src/log_storage.cpp
index 1ada1c3..96b0b12 100644
--- a/src/log_storage.cpp
+++ b/src/log_storage.cpp
@@ -18,28 +18,27 @@
  * limitations under the License.
  */
 
-#include "config.hpp"
 #include "log_storage.hpp"
 
-#include <sys/stat.h>
+#include "config.hpp"
+
 #include <fcntl.h>
-#include <unistd.h>
 #include <string.h>
+#include <sys/stat.h>
+#include <unistd.h>
 
-
-LogStorage::LogStorage()
-: last_complete_(true)
+LogStorage::LogStorage() : last_complete_(true)
 {
 }
 
-
 void LogStorage::parse(const char* data, size_t len)
 {
     // Split log stream to separate messages.
     // Stream may not be ended with EOL, so we handle this situation by
     // last_complete_ flag.
     size_t pos = 0;
-    while (pos < len) {
+    while (pos < len)
+    {
         // Search for EOL ('\n')
         size_t eol = pos;
         while (eol < len && data[eol] != '\n')
@@ -61,17 +60,19 @@
     }
 }
 
-
 void LogStorage::append(const char* msg, size_t len)
 {
-    if (!last_complete_) {
+    if (!last_complete_)
+    {
         // The last message is incomplete, add msg as part of it
-        if (!messages_.empty()) {
+        if (!messages_.empty())
+        {
             Message& last_msg = *messages_.rbegin();
             last_msg.text.append(msg, len);
         }
     }
-    else {
+    else
+    {
         Message new_msg;
         time(&new_msg.timeStamp);
         new_msg.text.assign(msg, len);
@@ -80,47 +81,46 @@
     }
 }
 
-
 void LogStorage::clear()
 {
     messages_.clear();
     last_complete_ = true;
 }
 
-
 bool LogStorage::empty() const
 {
     return messages_.empty();
 }
 
-
 int LogStorage::write(const char* fileName) const
 {
     int rc = 0;
 
-    if (empty()) {
+    if (empty())
+    {
         printf("No messages to write\n");
         return 0;
     }
 
     const gzFile fd = gzopen(fileName, "w");
-    if (fd == Z_NULL) {
+    if (fd == Z_NULL)
+    {
         rc = errno;
-        fprintf(stderr, "Unable to open file %s: error [%i] %s\n",
-                fileName, rc, strerror(rc));
+        fprintf(stderr, "Unable to open file %s: error [%i] %s\n", fileName, rc,
+                strerror(rc));
         return rc;
     }
 
     // Write full datetime stamp as the first record
     const time_t& logStartTime = messages_.begin()->timeStamp;
-    tm localTime = { 0 };
+    tm localTime = {0};
     localtime_r(&logStartTime, &localTime);
     char msgText[64];
     snprintf(msgText, sizeof(msgText),
              ">>> Log collection started at %02i.%02i.%i %02i:%02i:%02i",
              localTime.tm_mday, localTime.tm_mon + 1, localTime.tm_year + 1900,
              localTime.tm_hour, localTime.tm_min, localTime.tm_sec);
-    const Message startMsg = { logStartTime, msgText };
+    const Message startMsg = {logStartTime, msgText};
     rc |= write(fd, startMsg);
 
     // Write messages
@@ -134,20 +134,18 @@
     return rc;
 }
 
-
 int LogStorage::write(gzFile fd, const Message& msg) const
 {
     // Convert timestamp to local time
-    tm localTime = { 0 };
+    tm localTime = {0};
     localtime_r(&msg.timeStamp, &localTime);
 
     // Write message to the file
-    const int rc = gzprintf(fd, "[ %02i:%02i:%02i ]: %s\n",
-                            localTime.tm_hour,
-                            localTime.tm_min,
-                            localTime.tm_sec,
-                            msg.text.c_str());
-    if (rc <= 0) {
+    const int rc =
+        gzprintf(fd, "[ %02i:%02i:%02i ]: %s\n", localTime.tm_hour,
+                 localTime.tm_min, localTime.tm_sec, msg.text.c_str());
+    if (rc <= 0)
+    {
         fprintf(stderr, "Unable to write file: error [%i]\n", -rc);
         return EIO;
     }
@@ -155,19 +153,22 @@
     return 0;
 }
 
-
 void LogStorage::shrink()
 {
-    if (loggerConfig.storageSizeLimit) {
-        while (messages_.size() > static_cast<size_t>(loggerConfig.storageSizeLimit))
+    if (loggerConfig.storageSizeLimit)
+    {
+        while (messages_.size() >
+               static_cast<size_t>(loggerConfig.storageSizeLimit))
             messages_.pop_front();
     }
-    if (loggerConfig.storageTimeLimit) {
+    if (loggerConfig.storageTimeLimit)
+    {
         // Get time for N hours ago
         time_t oldestTimeStamp;
         time(&oldestTimeStamp);
         oldestTimeStamp -= loggerConfig.storageTimeLimit * 60 * 60;
-        while (!messages_.empty() && messages_.begin()->timeStamp < oldestTimeStamp)
+        while (!messages_.empty() &&
+               messages_.begin()->timeStamp < oldestTimeStamp)
             messages_.pop_front();
     }
 }
diff --git a/src/log_storage.hpp b/src/log_storage.hpp
index b2a6271..550afd9 100644
--- a/src/log_storage.hpp
+++ b/src/log_storage.hpp
@@ -20,11 +20,11 @@
 
 #pragma once
 
+#include <zlib.h>
+
 #include <ctime>
 #include <list>
 #include <string>
-#include <zlib.h>
-
 
 /** @class LogStorage
  *  @brief Log storage implementation.
@@ -32,7 +32,7 @@
  */
 class LogStorage
 {
-public:
+  public:
     /** @brief Constructor. */
     LogStorage();
 
@@ -60,7 +60,7 @@
      */
     int write(const char* fileName) const;
 
-private:
+  private:
     /** @struct Message
      *  @brief Represent log message (single line from host log).
      */
@@ -91,7 +91,7 @@
     /** @brief Shrink storage by removing oldest messages. */
     void shrink();
 
-private:
+  private:
     /** @brief List of messages. */
     std::list<Message> messages_;
     /** @brief Flag to indicate that the last message is incomplete. */
diff --git a/src/main.cpp b/src/main.cpp
index 7f58ef0..89b4f58 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -22,21 +22,19 @@
 #include "dbus_server.hpp"
 #include "dbus_watch.hpp"
 #include "log_manager.hpp"
+
 #include <getopt.h>
+
+#include <climits>
 #include <cstdio>
 #include <cstdlib>
-#include <climits>
-
 
 // Global logger configuration instance
-Config loggerConfig = {
-    .path = LOG_OUTPUT_PATH,
-    .storageSizeLimit = LOG_STORAGE_SIZE_LIMIT,
-    .storageTimeLimit = LOG_STORAGE_TIME_LIMIT,
-    .flushPeriod = LOG_FLUSH_PERIOD,
-    .rotationLimit = LOG_ROTATION_LIMIT
-};
-
+Config loggerConfig = {.path = LOG_OUTPUT_PATH,
+                       .storageSizeLimit = LOG_STORAGE_SIZE_LIMIT,
+                       .storageTimeLimit = LOG_STORAGE_TIME_LIMIT,
+                       .flushPeriod = LOG_FLUSH_PERIOD,
+                       .rotationLimit = LOG_ROTATION_LIMIT};
 
 /** @brief Print title with version info. */
 static void printTitle()
@@ -44,7 +42,6 @@
     printf("Host logger service " PACKAGE_VERSION ".\n");
 }
 
-
 /** @brief Print help usage info.
  *
  *  @param[in] app - application's file name
@@ -54,29 +51,29 @@
     printTitle();
     printf("Copyright (c) 2018 YADRO.\n");
     printf("Usage: %s [options]\n", app);
-    printf("Options (defaults are specified in brackets):\n"
-           "  -p, --path=PATH   Path used to store logs [%s]\n"
-           "Intermediate storage buffer capacity setup:\n"
-           "  -s, --szlimit=N   Store up to N last messages [%i], 0=unlimited\n"
-           "  -t, --tmlimit=N   Store messages for last N hours [%i], 0=unlimited\n"
-           "Flush storage buffer policy:\n"
-           "  -f, --flush=N     Flush logs every N hours [%i]\n"
-           "                    If this option is set to 0 flush will be called at\n"
-           "                    every host state change event from D-Bus.\n"
-           "Log files rotation policy:\n"
-           "  -r, --rotate=N    Store up to N files in the log directory [%i],\n"
-           "                    0=unlimited\n"
-           "Common options:\n"
-           "  -v, --version     Print version and exit\n"
-           "  -h, --help        Print this help and exit\n",
-           loggerConfig.path,
-           loggerConfig.storageSizeLimit,
-           loggerConfig.storageTimeLimit,
-           loggerConfig.flushPeriod,
-           loggerConfig.rotationLimit);
+    printf(
+        "Options (defaults are specified in brackets):\n"
+        "  -p, --path=PATH   Path used to store logs [%s]\n"
+        "Intermediate storage buffer capacity setup:\n"
+        "  -s, --szlimit=N   Store up to N last messages [%i], 0=unlimited\n"
+        "  -t, --tmlimit=N   Store messages for last N hours [%i], "
+        "0=unlimited\n"
+        "Flush storage buffer policy:\n"
+        "  -f, --flush=N     Flush logs every N hours [%i]\n"
+        "                    If this option is set to 0 flush will be called "
+        "at\n"
+        "                    every host state change event from D-Bus.\n"
+        "Log files rotation policy:\n"
+        "  -r, --rotate=N    Store up to N files in the log directory [%i],\n"
+        "                    0=unlimited\n"
+        "Common options:\n"
+        "  -v, --version     Print version and exit\n"
+        "  -h, --help        Print this help and exit\n",
+        loggerConfig.path, loggerConfig.storageSizeLimit,
+        loggerConfig.storageTimeLimit, loggerConfig.flushPeriod,
+        loggerConfig.rotationLimit);
 }
 
-
 /** @brief Get numeric positive value from string argument.
  *
  *  @param[in] param - parameter name
@@ -88,19 +85,20 @@
 {
     char* ep = nullptr;
     const unsigned long val = strtoul(arg, &ep, 0);
-    if (val > INT_MAX || !ep || ep == arg || *ep != 0) {
-        fprintf(stderr, "Invalid %s param: %s, expected 0<=N<=%i\n",
-                param, arg, INT_MAX);
+    if (val > INT_MAX || !ep || ep == arg || *ep != 0)
+    {
+        fprintf(stderr, "Invalid %s param: %s, expected 0<=N<=%i\n", param, arg,
+                INT_MAX);
         return -1;
     }
     return static_cast<int>(val);
 }
 
-
 /** @brief Application entry point. */
-int main(int argc, char *argv[])
+int main(int argc, char* argv[])
 {
     int opt_val;
+    // clang-format off
     const struct option opts[] = {
         { "path",    required_argument, 0, 'p' },
         { "szlimit", required_argument, 0, 's' },
@@ -111,34 +109,45 @@
         { "help",    no_argument,       0, 'h' },
         { 0,         0,                 0,  0  }
     };
+    // clang-format on
 
     opterr = 0;
-    while ((opt_val = getopt_long(argc, argv, "p:s:t:f:r:vh", opts, NULL)) != -1) {
-        switch (opt_val) {
+    while ((opt_val = getopt_long(argc, argv, "p:s:t:f:r:vh", opts, NULL)) !=
+           -1)
+    {
+        switch (opt_val)
+        {
             case 'p':
                 loggerConfig.path = optarg;
-                if (*loggerConfig.path != '/') {
-                    fprintf(stderr, "Invalid directory: %s, expected absolute path\n", loggerConfig.path);
+                if (*loggerConfig.path != '/')
+                {
+                    fprintf(stderr,
+                            "Invalid directory: %s, expected absolute path\n",
+                            loggerConfig.path);
                     return EXIT_FAILURE;
                 }
                 break;
             case 's':
-                loggerConfig.storageSizeLimit = getNumericArg(opts[optind - 1].name, optarg);
+                loggerConfig.storageSizeLimit =
+                    getNumericArg(opts[optind - 1].name, optarg);
                 if (loggerConfig.storageSizeLimit < 0)
                     return EXIT_FAILURE;
                 break;
             case 't':
-                loggerConfig.storageTimeLimit = getNumericArg(opts[optind - 1].name, optarg);
+                loggerConfig.storageTimeLimit =
+                    getNumericArg(opts[optind - 1].name, optarg);
                 if (loggerConfig.storageTimeLimit < 0)
                     return EXIT_FAILURE;
                 break;
             case 'f':
-                loggerConfig.flushPeriod = getNumericArg(opts[optind - 1].name, optarg);
+                loggerConfig.flushPeriod =
+                    getNumericArg(opts[optind - 1].name, optarg);
                 if (loggerConfig.flushPeriod < 0)
                     return EXIT_FAILURE;
                 break;
             case 'r':
-                loggerConfig.rotationLimit = getNumericArg(opts[optind - 1].name, optarg);
+                loggerConfig.rotationLimit =
+                    getNumericArg(opts[optind - 1].name, optarg);
                 if (loggerConfig.rotationLimit < 0)
                     return EXIT_FAILURE;
                 break;
@@ -166,7 +175,8 @@
     sdbusplus::bus::bus bus = sdbusplus::bus::new_default();
     sd_event* event = nullptr;
     rc = sd_event_default(&event);
-    if (rc < 0) {
+    if (rc < 0)
+    {
         fprintf(stderr, "Error occurred during the sd_event_default: %i\n", rc);
         return EXIT_FAILURE;
     }
