Un modo migliore di registrare rispetto alle chiamate manuali a una funzione di registrazione?

5

Sto scrivendo un semplice web server in Haskell e sto mettendo un po 'di logging. Ho alcune chiamate a una funzione di registrazione in una catena di IO >>= . Sembra tutto un po 'manuale. C'è un modo migliore / più "Haskelish"?

log :: (Show a) => String -> a -> IO a
log label val = getCurrentTime >>= \time ->
                putStrLn ("[" ++ show time ++ "] [" ++ label ++ "] " ++ (take maxLogLength $ show val)) >>
                return val 

handle :: Socket -> IO ()
handle conn = recv conn incomingBufferSize >>=
              log "request" >>=
              log "path" . extractPath . unpack >>=
              response >>= log "response" >>=
              send conn >>
              close conn
    
posta Michal Charemza 11.03.2017 - 15:25
fonte

3 risposte

1

La programmazione orientata agli aspetti è il solito approccio a questo. In java si intercettano i metodi che si desidera registrare. Allo sviluppatore sembra che non stia accadendo nulla, ma ogni volta che il metodo viene chiamato viene registrato automaticamente.

Non sono sicuro che la lingua che stai utilizzando supporti AOP, ma sono sicuro che potrebbe esserci un modo per implementare un sistema simile.

    
risposta data 11.05.2017 - 11:52
fonte
1

La registrazione è un caso d'uso comune dato durante la presentazione del cosiddetto Free monadi , Freer monadi e / o Effetti estensibili .

In ogni caso, l'idea di base è semplice: piuttosto che fare eseguire direttamente le azioni del programma, il programma produce una struttura dati che descrive in modo astratto le azioni da eseguire. L'esecuzione effettiva di queste azioni è rinviata a un interprete che interpreta la struttura dei dati.

Ci sono almeno due modi in cui questo può essere applicato al logging. Il primo è specificando alcune serie di operazioni di registrazione esplicite. Questo non è molto diverso da ciò che si ha attualmente, attraverso, tranne che l'implementazione delle operazioni di registrazione può essere cambiata fornendo un interprete diverso. Ad esempio, è possibile modificare il punto in cui viene eseguito il log o persino eliminare la registrazione tutti insieme (ad esempio, implementare la registrazione come non operante).

Un altro modo per applicare questo è aggiungere la registrazione all'interpretazione di certe operazioni. Se fatto correttamente, la registrazione e l'interpretazione "effettiva" dell'operazione sono completamente ortogonali. Questo è analogo alla programmazione orientata agli aspetti, che consente di aggiungere codice aggiuntivo al codice principale.

    
risposta data 21.08.2017 - 22:38
fonte
0

In diverse lingue è possibile implementare le funzioni di registrazione come decoratori. Potrebbe valere la pena di indagare, ma nel processo mi sono imbattuto nel pacchetto hslogger (documentation ).

    
risposta data 12.03.2017 - 09:23
fonte

Leggi altre domande sui tag