   (elfeed-update-feed url)
   (elfeed-search-update :force))
 
+(defun elfeed-log (level fmt &rest objects)
+  (let ((log-buffer (get-buffer-create "*elfeed-log*")))
+    (with-current-buffer log-buffer
+      (goto-char (point-max))
+      (insert (format "[%s] [%s]: %s\n"
+                      (format-time-string "%Y-%m-%d %H:%M:%S")
+                      level
+                      (apply #'format fmt objects))))))
+
 ;;;###autoload
 (defun elfeed-update ()
   "Update all the feeds in `elfeed-feeds'."
   (interactive)
-  (message "Elfeed update: %s" (format-time-string "%B %e %Y %H:%M:%S %Z"))
+  (elfeed-log 'info "Elfeed update: %s" (format-time-string "%B %e %Y %H:%M:%S %Z"))
   (mapc #'elfeed-update-feed (elfeed--shuffle (elfeed-feed-list)))
   (elfeed-search-update :force)
   (elfeed-db-save))

    (prog1 (setf elfeed-feeds (cl-delete-duplicates full :test #'string=))
      (when (called-interactively-p 'any)
        (customize-save-variable 'elfeed-feeds elfeed-feeds)
        (message "%d feeds loaded from %s" (length feeds) file)))))

;;;###autoload
(defun elfeed-export-opml (file)

  (interactive)
  (let ((fails (mapcar #'url-queue-url elfeed-connections)))
    (when fails
      (elfeed-log 'warn "Elfeed aborted feeds: %s" (mapconcat #'identity fails " ")))
    (setf url-queue nil))
  (elfeed-search-update :force))

