From the series 'I don't need to say anything... :)
(ns singleton) (defprotocol LoggerService "Protocol defining logging operations." (log-info [this message] "Logs an informational message.") (log-error [this message] "Logs an error message.") (log-debug [this message] "Logs a debug message.")) (defrecord FileLogger [log-file] LoggerService (log-info [_ message] (spit log-file (str (java.time.Instant/now) " [INFO]: " message "\n") :append true)) (log-error [_ message] (spit log-file (str (java.time.Instant/now) " [ERROR]: " message "\n") :append true)) (log-debug [_ message] (spit log-file (str (java.time.Instant/now) " [DEBUG]: " message "\n") :append true))) (defonce logger-instance (atom nil)) (defn get-logger "Returns the singleton instance of the LoggerService." [] (if-let [instance @logger-instance] instance (let [new-instance (->FileLogger "application.log")] (reset! logger-instance new-instance) new-instance))) (defn log-endpoint "A Pedestal handler that logs requests and responses." [request] (let [logger (get-logger)] (log-info logger (str "Received request: " (:uri request))) {:status 200 :body "Request logged successfully!"})) (require '[io.pedestal.http :as http]) (def service {:env :prod ::http/routes #{["/log" :get log-endpoint]} ::http/type :jetty ::http/port 8080}) (comment ;; Start the server (http/create-server service) ;; curl http://localhost:8080/log )
Top comments (0)