@related: id privacy.fr fai isp log.fr live

#ifndef LOGMANAGER_H
#define LOGMANAGER_H
 
#include <string>
#include <fstream>
#include <sstream>
#include <list>
#include <pthread.h>
 
class LogManager
{
    public:
 
        class UnregisterLogThread
        {
            public:
 
                UnregisterLogThread();
 
                virtual ~UnregisterLogThread();
 
            private:
 
                UnregisterLogThread(const UnregisterLogThread &);
 
                UnregisterLogThread & operator=(const UnregisterLogThread &);
        };
 
        static void clean();
 
        static void init(const std::string & LogFilename, const int & Capacity);
 
        static void print(const std::string & Message);
 
        static void indent();
 
        static void unindent();
 
        static void removeLogThread();
 
        static void setVersion(const std::string & Version);
 
    private:
 
        struct LogThread
        {
            int tid;
            struct timeval previousTime;
            std::string indentPrefix;
        };
 
        class GuardMutex
        {
            public:
 
                GuardMutex(pthread_mutex_t & Mutex);
 
               virtual  ~GuardMutex();
 
            private:
 
                GuardMutex(const GuardMutex &);
 
                GuardMutex & operator=(const GuardMutex &);
 
                pthread_mutex_t & _mutex;
        };
 
        LogManager();
 
        LogManager(const LogManager &);
 
        static void _cleanTS();
 
        static void _initTS(const std::string & LogFilename, const int & Capacity);
 
        static void _printTS(std::string Message);
 
        static void _indentTS();
 
        static void _unindentTS();
 
        static void _removeLogThreadTS();
 
        static void _print2(std::string Message);
 
        static void _setCurrentLogThread();
 
        static void _writeHeader();
 
        static std::ofstream _fileLog;
        static unsigned int _lineNbr;
        static unsigned int _capacity;
        static std::string _logFilename;
        static bool _initialized;
        static std::stringstream _tmp;
        static std::list<struct LogManager::LogThread> _logThreadSet;
        static struct timeval _previousTime;
        static pthread_mutex_t _mutex;
        static struct timeval _currentTime;
        static struct timeval _deltaPreviousTime;
        static struct timeval _deltaThreadPreviousTime;
        static std::string _version;
};
 
std::ostream & operator<<(std::ostream & tmpOss, struct timeval & tv);
 
#define TRACE(Message) \
    { \
        std::stringstream trace_sstream; \
        trace_sstream << __PRETTY_FUNCTION__ << " " << __FILE__ << ":" << __LINE__ << " " << Message; \
        LogManager::print(trace_sstream.str()); \
    }
 
#endif
#include <iostream>
#include <iomanip>
#include <sys/time.h>
#include <linux/unistd.h>
 
#include "LogManager.h"
 
unsigned int LogManager::_lineNbr = 0;
unsigned int LogManager::_capacity = 0;
std::ofstream LogManager::_fileLog;
bool LogManager::_initialized = false;
std::string LogManager::_logFilename = "";
std::stringstream LogManager::_tmp;
std::list<struct LogManager::LogThread> LogManager::_logThreadSet;
struct timeval LogManager::_previousTime = {0,0};
pthread_mutex_t LogManager::_mutex = PTHREAD_MUTEX_INITIALIZER;
struct timeval LogManager::_currentTime = {0,0};
struct timeval LogManager::_deltaPreviousTime = {0,0};
struct timeval LogManager::_deltaThreadPreviousTime = {0,0};
std::string LogManager::_version = "version";
 
std::ostream & operator<<(std::ostream & tmpOss, struct timeval & tv)
{
    tmpOss << tv.tv_sec << "." << std::setfill('0') << std::setw(6) << tv.tv_usec;
    return(tmpOss);
}
 
LogManager::UnregisterLogThread::UnregisterLogThread()
{
}
 
LogManager::UnregisterLogThread::~UnregisterLogThread()
{
    LogManager::removeLogThread();
}
 
LogManager::GuardMutex::GuardMutex(pthread_mutex_t & Mutex):
    _mutex(Mutex)
{
    pthread_mutex_lock(&_mutex);
}
 
LogManager::GuardMutex::~GuardMutex()
{
    pthread_mutex_unlock(&_mutex);
}
 
void LogManager::clean()
{
    GuardMutex GuardMutex(_mutex);
    LogManager::_cleanTS();
}
 
void LogManager::init(const std::string & LogFilename, const int & Capacity)
{
    GuardMutex GuardMutex(_mutex);
    LogManager::_initTS(LogFilename, Capacity);
}
 
void LogManager::print(const std::string & Message)
{
    GuardMutex GuardMutex(_mutex);
    gettimeofday(&_currentTime, NULL);
    _setCurrentLogThread();
    timersub(&_currentTime, &_previousTime, &_deltaPreviousTime);
    timersub(&_currentTime, &(_logThreadSet.begin()->previousTime), &_deltaThreadPreviousTime);
    LogManager::_printTS(Message);
    _previousTime = _currentTime;
    _logThreadSet.begin()->previousTime = _currentTime;
}
 
void LogManager::indent()
{
    GuardMutex GuardMutex(_mutex);
    _setCurrentLogThread();
    LogManager::_indentTS();
}
 
void LogManager::unindent()
{
    GuardMutex GuardMutex(_mutex);
    LogManager::_unindentTS();
}
 
void LogManager::removeLogThread()
{
    GuardMutex GuardMutex(_mutex);
    LogManager::_removeLogThreadTS();
}
 
void LogManager::setVersion(const std::string & Version)
{
    _version = Version;
}
 
void LogManager::_cleanTS()
{
    if (_initialized)
    {
        _fileLog.close();
        _fileLog.clear();
        unlink((_logFilename + ".bkp").c_str());
        _fileLog.open(_logFilename.c_str(), std::ios_base::trunc);
        _writeHeader();
    }
}
 
void LogManager::_initTS(const std::string & LogFilename, const int & Capacity)
{
    _capacity = Capacity;
    if (!_initialized)
    {
        _fileLog.open(LogFilename.c_str(), std::ios_base::trunc);
        if (_fileLog.good())
        {
            _writeHeader();
            _logFilename = LogFilename;
            unlink((_logFilename + ".bkp").c_str());
            _print2(_tmp.str());
            _initialized = true;
        }
    }
    else
    {
        if (LogFilename != _logFilename)
        {
            _fileLog.close();
            _fileLog.clear();
            _fileLog.open(LogFilename.c_str(), std::ios_base::app);
            if (_fileLog.good())
            {
                _fileLog.close();
                _fileLog.clear();
                rename(_logFilename.c_str(), LogFilename.c_str());
                rename((_logFilename + ".bkp").c_str(), (LogFilename + ".bkp").c_str());
                _fileLog.open(LogFilename.c_str(), std::ios_base::app);
                _logFilename = LogFilename;
            }
            else
            {
                _fileLog.clear();
                _fileLog.open(_logFilename.c_str(), std::ios_base::app);
            }
        }
    }
}
 
void LogManager::_printTS(std::string Message)
{
    std::stringstream buffer1;
    buffer1 << _lineNbr++ << " " << (_logThreadSet.begin())->indentPrefix << (_logThreadSet.begin())->tid << " " << _currentTime <<
    " " << _deltaThreadPreviousTime << " " << _deltaPreviousTime << " ";
    size_t pos = 0;
    _indentTS();
    while ((pos = Message.find("\n", pos)) != std::string::npos)
    {
        std::stringstream buffer2;
        buffer2 << _lineNbr++ << " " << (_logThreadSet.begin())->indentPrefix;
        ++pos;
        Message.insert(pos, buffer2.str());
    }
    _unindentTS();
    buffer1 << Message << std::endl;
    if (_initialized)
    {
        _print2(buffer1.str());
    }
    else
    {
        _tmp << buffer1.str();
    }
}
 
void LogManager::_indentTS()
{
    (_logThreadSet.begin())->indentPrefix += std::string("\t");
}
 
void LogManager::_unindentTS()
{
    int tid = syscall(__NR_gettid);
    std::list<struct LogManager::LogThread>::iterator currentLogThread;
    for (currentLogThread=_logThreadSet.begin(); currentLogThread!=_logThreadSet.end(); ++currentLogThread)
    {
        if (currentLogThread->tid == tid)
        {
            currentLogThread->indentPrefix.erase(0,1);
            break;
        }
    }
}
 
void LogManager::_removeLogThreadTS()
{
    int tid = syscall(__NR_gettid);
    std::list<struct LogManager::LogThread>::iterator currentLogThread;
    for (currentLogThread=_logThreadSet.begin(); currentLogThread!=_logThreadSet.end(); ++currentLogThread)
    {
        if (currentLogThread->tid == tid)
        {
            _logThreadSet.erase(currentLogThread);
            break;
        }
    }
}
 
void LogManager::_print2(std::string Message)
{
    if (Message.size() + _fileLog.tellp() > (_capacity/2))
    {
        if (Message.size() <= (_capacity/2))
        {
            _fileLog.close();
            _fileLog.clear();
            std::ifstream fileSrc(_logFilename.c_str());
            std::ofstream fileDst((_logFilename + ".bkp").c_str(), std::ios_base::trunc);
            fileDst << fileSrc.rdbuf();
            _fileLog.open(_logFilename.c_str(), std::ios_base::trunc);
            _writeHeader();
        }
        else
        {
            std::stringstream tmp;
            tmp << "Message lost (too long) ! msgSz(" << Message.size() << ") capacity/2(" << _capacity/2 << ")" << std::endl;
            if (tmp.str().size() <= (_capacity/2))
            {
                _print2(tmp.str());
            }
            else
            {
                std::cerr << tmp.str() << std::endl;
            }
            return;
        }
    }
    _fileLog << Message;
    _fileLog.flush();
}
 
void LogManager::_setCurrentLogThread()
{
    if (_logThreadSet.empty())
    {
        _previousTime = _currentTime;
        _deltaPreviousTime = _currentTime;
        _deltaThreadPreviousTime = _currentTime;
    }
    int tid = syscall(__NR_gettid);
    std::list<struct LogManager::LogThread>::iterator currentLogThread;
    for (currentLogThread=_logThreadSet.begin(); currentLogThread!=_logThreadSet.end(); ++currentLogThread)
    {
        if (currentLogThread->tid == tid)
        {
            _logThreadSet.push_front(*currentLogThread);
            _logThreadSet.erase(currentLogThread);
            break;
        }
    }
    if (currentLogThread == _logThreadSet.end())
    {
        struct LogThread logThread;
        logThread.tid = tid;
        logThread.previousTime = _currentTime;
        logThread.indentPrefix = "";
        _logThreadSet.push_front(logThread);
    }
}
 
void LogManager::_writeHeader()
{
    _fileLog << _version << std::endl;
    _fileLog << "log_line_number thread_id time(s.us) delta_time_with_last_msg_from_same_thread(s.us) delta_time_with_last_msg_from_any_thread(s.us) function_name src_file src_line msg" << std::endl;
    _fileLog.flush();
}
#ifndef LOGSCOPE_H
#define LOGSCOPE_H
 
#include <string>
#include <sstream>
 
class LogScope
{
    public:
 
        LogScope(std::string Message);
 
        ~LogScope();
};
 
#define TRACE_SCOPE(Message) \
    std::stringstream trace_sstream; \
    trace_sstream << __PRETTY_FUNCTION__ << " " << __FILE__ << " " << __LINE__ << " " << Message; \
    LogScope logScope(trace_sstream.str());
 
#endif
#include "LogScope.h"
#include "LogManager.h"
 
LogScope::LogScope(std::string Message)
{
    LogManager::print(Message);
    LogManager::indent();
}
 
LogScope::~LogScope()
{
    LogManager::unindent();
}
#!/bin/bash
 
color_set=(
'\E[31m'
'\E[34m'
)
 
tmp_file="$(mktemp -t ${0##*/}.XXXXXXXXXX)"
cat "${@}" > "${tmp_file}"
 
head -2 "${tmp_file}"
sed -i '1,2d' "${tmp_file}"
 
tid_set=($(awk '{print $2}' "${tmp_file}"))
 
idx1=0
idx2=1
tid1=-1
while read ligne
do
    if [ "${tid_set[idx1]}" -ne 0 2>/dev/null ] || 
       [ "${tid_set[idx1]}" -eq 0 2>/dev/null ] && 
       [ "${tid1}" != "${tid_set[idx1]}" ]
    then
        ((idx2=++idx2%2))
        echo -en "${color_set[idx2]}"
        tid1="${tid_set[idx1]}"
    fi
    echo "${ligne}"
    ((++idx1))
done < "${tmp_file}"
echo -e '\E[0m'
 
rm -f "${tmp_file}"
Application v1.2 2009/04/??
log_line_number thread_id time(s.us) delta_time_with_last_msg_from_same_thread(s.us) delta_time_with_last_msg_from_any_thread(s.us) function_name src_file src_line msg
0 12757 1239022156.769629 0.000000 0.000000 int main(int, char**) src/main.cpp 154
1       12757 1239022156.915337 0.145708 0.145708 static const QString& ConfigBox::getApplicationHome() src/configbox.cpp 17
2       12757 1239022156.916039 0.000702 0.000702 int main(int, char**) src/main.cpp 176 License status :
3               Evaluation, expires on 26.04.2009.
4       12757 1239022156.923098 0.007059 0.007059 ConfigBox::ConfigBox() src/configbox.cpp 26
5               12757 1239022157.162456 0.239358 0.239358 void ConfigBox::readSettings() src/configbox.cpp 257
6               12757 1239022157.166141 0.003685 0.003685 void ConfigBox::writeSettings() src/configbox.cpp 239
7       12757 1239022157.166321 0.000180 0.000180 soapStatus::soapStatus() src/status_thr.cpp 10
8               12757 1239022157.166358 0.000037 0.000037 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
9               12757 1239022157.166360 0.000002 0.000002 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
10      12757 1239022157.166423 0.000063 0.000063 projectManager::projectManager() src/projectManager.cpp 12
11              12757 1239022157.166459 0.000036 0.000036 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
12              12757 1239022157.166810 0.000351 0.000351 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
13              12757 1239022157.166862 0.000052 0.000052 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
14              12757 1239022157.166904 0.000042 0.000042 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
15              12757 1239022157.166945 0.000041 0.000041 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
16              12757 1239022157.167029 0.000084 0.000084 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
17      12757 1239022157.167089 0.000060 0.000060 k7encoder::k7encoder() src/k7encoder.cpp 21
18              12757 1239022157.211220 0.044131 0.044131 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
19              12757 1239022157.211292 0.000072 0.000072 static const QSettings& ConfigBox::getSettings() src/configbox.cpp 11
20              12757 1239022157.212910 0.001618 0.001618 void k7encoder::createActions() src/k7encoder.cpp 69
21 12758 1239022157.219646 0.000000 0.006736 virtual void soapStatus::run() src/status_thr.cpp 24
22      12757 1239022157.249270 0.036360 0.029624 void k7encoder::setStatus(QString) src/k7encoder.cpp 115
23      12758 1239022159.222108 2.002462 1.972838 void soapStatus::getStatus(QString&) src/status_thr.cpp 50

misc

20090105 : L'alerte orange

Je vous invite a changer vos mots de passe sur le site d orange / wanadoo car il y a une faille actuellement :

Peut etre l'occasion de tester un autre FAI ? ie http://fdn.fr

nion.modprobe.de_bimg_101101.jpg

log.txt · Last modified: 2012/11/04 21:02 (external edit)
 
Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki