diff --git a/redfish-core/include/event_service_manager.hpp b/redfish-core/include/event_service_manager.hpp
index c2d6d38..c48db09 100644
--- a/redfish-core/include/event_service_manager.hpp
+++ b/redfish-core/include/event_service_manager.hpp
@@ -47,9 +47,13 @@
     "/var/lib/bmcweb/eventservice_config.json";
 
 #ifndef BMCWEB_ENABLE_REDFISH_DBUS_LOG_ENTRIES
-constexpr const char* redfishEventLogFile = "/var/log/redfish";
-constexpr const uint32_t inotifyFileAction = IN_MODIFY;
 std::shared_ptr<boost::asio::posix::stream_descriptor> inotifyConn = nullptr;
+static constexpr const char* redfishEventLogDir = "/var/log";
+static constexpr const char* redfishEventLogFile = "/var/log/redfish";
+static constexpr const size_t iEventSize = sizeof(inotify_event);
+static int inotifyFd = -1;
+static int dirWatchDesc = -1;
+static int fileWatchDesc = -1;
 
 // <ID, timestamp, RedfishLogId, registryPrefix, MessageId, MessageArgs>
 using EventLogObjectsType =
@@ -967,17 +971,74 @@
                     return;
                 }
                 std::size_t index = 0;
-                while ((index + sizeof(inotify_event)) <= bytesTransferred)
+                while ((index + iEventSize) <= bytesTransferred)
                 {
                     struct inotify_event event;
-                    std::memcpy(&event, &readBuffer[index],
-                                sizeof(inotify_event));
-                    if (event.mask == inotifyFileAction)
+                    std::memcpy(&event, &readBuffer[index], iEventSize);
+                    if (event.wd == dirWatchDesc)
                     {
-                        EventServiceManager::getInstance()
-                            .readEventLogsFromFile();
+                        if ((event.len == 0) ||
+                            (index + iEventSize + event.len > bytesTransferred))
+                        {
+                            index += (iEventSize + event.len);
+                            continue;
+                        }
+
+                        std::string fileName(&readBuffer[index + iEventSize],
+                                             event.len);
+                        if (std::strcmp(fileName.c_str(), "redfish") != 0)
+                        {
+                            index += (iEventSize + event.len);
+                            continue;
+                        }
+
+                        BMCWEB_LOG_DEBUG
+                            << "Redfish log file created/deleted. event.name: "
+                            << fileName;
+                        if (event.mask == IN_CREATE)
+                        {
+                            if (fileWatchDesc != -1)
+                            {
+                                BMCWEB_LOG_DEBUG
+                                    << "Redfish log file is already on "
+                                       "inotify_add_watch.";
+                                return;
+                            }
+
+                            fileWatchDesc = inotify_add_watch(
+                                inotifyFd, redfishEventLogFile, IN_MODIFY);
+                            if (fileWatchDesc == -1)
+                            {
+                                BMCWEB_LOG_ERROR
+                                    << "inotify_add_watch failed for "
+                                       "redfish log file.";
+                                return;
+                            }
+
+                            EventServiceManager::getInstance()
+                                .cacheLastEventTimestamp();
+                            EventServiceManager::getInstance()
+                                .readEventLogsFromFile();
+                        }
+                        else if ((event.mask == IN_DELETE) ||
+                                 (event.mask == IN_MOVED_TO))
+                        {
+                            if (fileWatchDesc != -1)
+                            {
+                                inotify_rm_watch(inotifyFd, fileWatchDesc);
+                                fileWatchDesc = -1;
+                            }
+                        }
                     }
-                    index += (sizeof(inotify_event) + event.len);
+                    else if (event.wd == fileWatchDesc)
+                    {
+                        if (event.mask == IN_MODIFY)
+                        {
+                            EventServiceManager::getInstance()
+                                .readEventLogsFromFile();
+                        }
+                    }
+                    index += (iEventSize + event.len);
                 }
 
                 watchRedfishEventLogFile();
@@ -988,22 +1049,37 @@
     {
         inotifyConn =
             std::make_shared<boost::asio::posix::stream_descriptor>(ioc);
-        int fd = inotify_init1(IN_NONBLOCK);
-        if (fd == -1)
+        inotifyFd = inotify_init1(IN_NONBLOCK);
+        if (inotifyFd == -1)
         {
             BMCWEB_LOG_ERROR << "inotify_init1 failed.";
             return -1;
         }
-        auto wd = inotify_add_watch(fd, redfishEventLogFile, inotifyFileAction);
-        if (wd == -1)
+
+        // Add watch on directory to handle redfish event log file
+        // create/delete.
+        dirWatchDesc = inotify_add_watch(inotifyFd, redfishEventLogDir,
+                                         IN_CREATE | IN_MOVED_TO | IN_DELETE);
+        if (dirWatchDesc == -1)
         {
             BMCWEB_LOG_ERROR
-                << "inotify_add_watch failed for redfish log file.";
+                << "inotify_add_watch failed for event log directory.";
             return -1;
         }
 
+        // Watch redfish event log file for modifications.
+        fileWatchDesc =
+            inotify_add_watch(inotifyFd, redfishEventLogFile, IN_MODIFY);
+        if (fileWatchDesc == -1)
+        {
+            BMCWEB_LOG_ERROR
+                << "inotify_add_watch failed for redfish log file.";
+            // Don't return error if file not exist.
+            // Watch on directory will handle create/delete of file.
+        }
+
         // monitor redfish event log file
-        inotifyConn->assign(fd);
+        inotifyConn->assign(inotifyFd);
         watchRedfishEventLogFile();
 
         return 0;
