Logo

dev-resources.site

for different kinds of informations.

Clojure Is Awesome!!! [PART 2]

Published at
12/15/2024
Categories
clojure
singleton
designpatterns
cleancode
Author
borba
Author
5 person written this
borba
open
Clojure Is Awesome!!! [PART 2]

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
)

Enter fullscreen mode Exit fullscreen mode
cleancode Article's
30 articles in total
Favicon
STOP Writing Dirty Code: Fix The Data Class Code Smell Now!
Favicon
Абстракции vs. привязка к технологии
Favicon
An Initiation to Domain-Driven Design
Favicon
7 Essential Design Patterns for JavaScript Developers: Boost Your Coding Mastery
Favicon
Orden en el Código .NET
Favicon
Movie X: A Developer’s Dive Into Flutter Project Organization
Favicon
3 Code Comment Mistakes You're Making Right Now
Favicon
From Chaos to Control
Favicon
Clean code
Favicon
Want to Learn Docker in Advance Way?
Favicon
3 very simple React patterns to immediately improve your codebase 🪄
Favicon
Refactoring 021 - Remove Dead Code
Favicon
Code Commenting Ethics: When Over-Documentation Hurts Development
Favicon
Clean Code: Managing Side Effects with Functional Programming
Favicon
Why Use Getters and Setters?!
Favicon
Clojure Is Awesome!!! [PART 4]
Favicon
Clojure Is Awesome!!! [PART 3]
Favicon
Python's Magic Methods
Favicon
Clojure Is Awesome!!! [PART 2]
Favicon
Why should I care about Quality? I'm a developer!
Favicon
Mastering Laravel Blade: @stack, @push, and @endpush
Favicon
How to write a good Clean code? - Tips for Developers with Examples
Favicon
Union and Intersection Types in TypeScript
Favicon
Arquitetura Viva: Moldando Sistemas para Mudanças
Favicon
Dependency Injection in ASP.NET Core with Extension Classes: A Comprehensive Guide
Favicon
Rails transactional callbacks beyond models
Favicon
Python Best Practices: Writing Clean and Maintainable Code
Favicon
Excited to Be Part of This Community! 🚀
Favicon
Single Responsibility Principle in Javascript
Favicon
Build Express APIs Faster than AI

Featured ones: