LogStream

dodano 06/09/2009

rootCode \

Strumień wyjścia dla logów z możliwością określenia wielu niezależnych punktów wyjścia w C++.

Klasa LogSream jest strumieniem wyjściowym dla wszelkich logów generowanych przez aplikację, posiadający wszystkie zalety strumieni biblioteki standardowej języka C++.

Ponadto będąc prostym obserwatorem, umożliwia rejestrację dowolnej liczby strumieni wyjściowych jako miejsca przeznaczenia logów. Przy czym dane napływające do strumienia dispatchera (obiektu klasy LogStream) są rozsyłane do poszczególnych strumieni, zależnie od ustalonego poziomu logowania dla danego strumienia. Dzięki czemu możemy do pliku logować wiadomości wszystkich poziomów, a na cerr sygnalizować wystąpienie tylko najbardziej krytycznych sytuacji.

Potrzebowałem w pewnym projekcie łatwej obsługi logowania wszelkich informacji, z prostotą jaką udostępniają strumienie, głównie przez operator <<, ale z możliwością określenia wielu miejsc przeznaczenia. Wymagania te zdyskredytowały standardowe wyjście logów clog.

Po kilku próbach implementacji i przeszukiwań sieci trafiłem na dobry pomysł, czego powodem było trafienie na usenecie na wątek "using iostream library how do I display output to console as well as write to a file" na grupie comp.lang.c++.

Możliwości

Jednym z głównych zalet strumienia LogStream jest możliwość rejestracji dowolnej ilości strumieni wyjściowych ze specyfikacja poziomu logowania oraz łatwe wysłanie danych do strumienia z pomocą operatora <<.

Kolejną zaleta jest sposób określania poziomu logowania, który dokonujemy za pomocą manipulatorów strumienia.

Example

Przykład wykorzystania klasy LogStream, który powinien rozwiać wszelkie nieporozumienia i niejasności ;)

std::ofstream file_log("c:\\test.log");
std::ofstream file_error("c:\\test.err");

log::LogStream logs;
logs.attach(std::cout, log::ALL);
logs.attach(file_log, log::ALL);
logs.attach(file_error, log::ERROR);

try {

    logs << log::NORMAL << "Standard message; just sent to the 'log' stream" << log::endl;
    logs << "Another routine message" << std::endl;

    logs << log::ERROR << "A nasty error occurred..." << std::endl;

    logs << log::TRACE << "Tracing message..." << log::endl;

    throw std::runtime_error("Blah blah");

} catch (std::exception& e) {

    logs << log::EXCEPTION << "A catastrophic error occurred: " << e.what() << std::endl;

}

Można zauważyć małą nieścisłość, używamy manipulatora endl z przestrzeni nazw std i log, jest to bez znaczenia, którego użyjemy, ponieważ log::endl jest "aliasem" na std::endl.

Licencja

Klasa LogStream licencjonowana jest na zasadach licencji MIT.

Download

LogStream.zip [3.86 KB] pobrano 87 razy
dodano 06/09/2009
źródła klasy z przykładem użycia

Uwaga

W planach pozostało jeszcze wiele dodatkowych możliwości i ułatwień, ale brak czasu robi swoje ;)

Przydatne byłoby proste makro lub funkcja inline do łatwego "wysyłania" komunikatów debugowych i kilka metod z możliwościami podobnymi do funkcji printf().

Może także jakiś predefiniowany obiekt strumienia/pliku?

Linki

aktualizacja 07/09/2009