Piero V.

C++ Logger

Ultimamente non stavo più andando avanti con progetti di programmazione, ma, riprendendo, ho sentito la necessità di fare un buon sistema di logging basato sugli stream di C++.

In passato avevo già affrontato l’argomento, ma questa è stata una sfida per vedere se riuscivo a fare tutto da capo e da solo. Ce l’ho fatta, così ho deciso di pubblicare qui i risultati.

Come requisiti ho tenuto in mente la versatilità e la sicurezza per l’uso con i thread.

La versatilità l’ho ottenuta mediante la divisione per modulo (per esempio networking, audio etc…) e livello (errore, informazione…). A coordinare tutto c’è il Log Manager, una classe che coordina i vari log. È un singleton (ottenuto tramite la mia classe allegata), e ritorna degli stream, uno per ogni coppia modulo-livello (che insieme fanno il LogId), assicurandosi che queste istanze siano uniche. Inoltre dispone di una funzione per mandare direttamente in output una stringa, dove in più si può specificare anche il file e la linea, magari usando le macro __FILE__ e __LINE__.

Ho pensato come vari output lo standard output e error, in più un file e un’eventuale consolle interna al programma, configurabili per ogni log, con una questa priorità: LogId > Modulo > Livello > Configurazione globale.

Come dipendenze ha gli smart pointer e i mutex/recursive mutex di Boost. Comunque se preferite e potete, C++11 ha integrato tutti questi componenti nella libreria standard, quindi potete usarli da là, ma sinceramente non ho provato a farlo.

Mancano, volendo, una funzione per impostare la configurazione “grezza” tramite gli enum e l’operatore OR e un controllo nei metodi overflow, xputn e sync della classe LogStreamBuf che ritornino subito se l’output è disabilitato, senza fare movimenti di memoria.

Ho fatto un paio di test anche con dei thread e non ho avuto problemi.

Non mi metto a scrivere tutte le funzioni perché mi pare siano già abbastanza spiegate nell’header 😉 .

Rilascio il materiale sotto il pubblico dominio.

Download: cpp_logger.tar.gz

OgreStream

Update 13 ottobre 2012: vedere a fine articolo.

Basandomi sul lavoro di Edd, ho scritto un bridge per leggere i file degli archivi di Ogre con gli stream di C++.

Ciò comporta che potete riempire archivi zip, archivi deflate o anche un vostro formato proprietario e passarli direttamente a librerie compatibili con gli stream, quindi, per esempio TinyXML.

La classe si chiama OgreStream, e come parametri vuole un Ogre::DataStreamPtr, che viene ritornato da una classe di archivi e poi ci sarebbero come parametri opzionali la grandezza del buffer da leggere ogni volta e i caratteri da spostare. Comunque non c’è bisogno di personalizzarli.

Ho implementato anche i meccanismi di seeking.

Prima del 13 ottobre 2012 la funzione readsome non andava, perché è legata all’implementazione dello stream e al metodo showmanyc, che ho implementato successivamente.

Troverete tutte le informazioni utili nel file.