Регистрация ошибок в C - PullRequest
       10

Регистрация ошибок в C

1 голос
/ 24 ноября 2011

Я работаю над проектом на C в среде Linux и ищу эффективный способ добавления ошибок в файл журнала. Я пытался использовать Syslog со следующей инициализацией:

setlogmask(LOG_UPTO(7));
openlog(name, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_USER);

Но похоже, что он работает слишком медленно. Мне нужно, чтобы это работало очень быстро .. Может ли кто-нибудь помочь с этим? Может быть, системный журнал не правильный подход.

Ответы [ 4 ]

3 голосов
/ 24 ноября 2011

Одна из возможностей, которая теряет некоторую гибкость при использовании syslog, заключается в том, чтобы ваша программа сама записывала свой журнал ошибок, используя обычные средства ввода-вывода (возможно, с осторожным использованием очистки).

0 голосов
/ 06 декабря 2011

Возможно, ваш демон syslog выполняет синхронизацию после каждой записи. Альтернативой может быть вход в файл напрямую, как предложено другими.

0 голосов
/ 24 ноября 2011

Как насчет использования printk(KERNEL "...") и получения логов с помощью dmesg?

0 голосов
/ 24 ноября 2011

Вы можете написать собственный легкий регистратор или, возможно, сторонний open source ...

Например, 3-я часть C ++ logger [http://logging.apache.org/log4cxx/]

А вот простой [глючный] собственный регистратор [ Из книги C ++ Методы экономии времени для чайников]

#ifndef __SimpleLogger__
#define __SimpleLogger__


#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdarg.h>
#include <fstream>
using namespace std;


class SimpleLogger
{


public:
    SimpleLogger( void )
    {
        bOn = false;
        bForceFlush = false;
    }
    SimpleLogger( const char *strFileName )

    {
        sFileName = strFileName;
        bOn = false;
        bForceFlush = false;
    }
    SimpleLogger( const SimpleLogger& aCopy )
    {
        sFileName = aCopy.sFileName;
        bForceFlush = aCopy.bForceFlush;
        setOn( aCopy.bOn );
    }
    virtual ~SimpleLogger()
    {
        Flush();
        if ( bOn )
            file.close();
    }
    void setOn( bool flag )
    {
        bOn = flag;
        if ( bOn )
        {
            file.open( sFileName.c_str() ,fstream::in | fstream::out | fstream::app);
        }
    }
    bool getOn( void )
    {
        return bOn;
    }
    void setForceFlush( bool flag )
    {
        bForceFlush = flag;
    }
    bool getForceFlush( void )
    {
        return bForceFlush;
    }
    void setFileName ( const char
        *strFileName )
    {
        sFileName = strFileName;
    }
    string getFileName ( void )
    {
        return sFileName;
    }
    void Log( const char *strMessage )
    {
        sMessage += strMessage;
        sMessage += "\n";
        if ( bForceFlush )
            Flush();
    }
    void LogString( const char *fmt, ... )

    {
        char szBuffer[256];
        va_list marker;
        va_start( marker, fmt );     
        vsprintf(szBuffer, fmt, marker );
        sMessage += szBuffer;
        sMessage += "\n";
        if ( bForceFlush )
            Flush();

    }
    void Flush( void )
    {
        if ( bOn )
            file << sMessage << endl;
        sMessage = "";
    }


private:
    bool   bOn;
    bool   bForceFlush;
    string   sMessage;
    string   sFileName;
    ofstream  file;

};


#endif

Использование:

 SimpleLogger logger("MyLog.txt");
 logger.setForceFlush( true );
 logger.setOn(true);

 logger.Log("I am the buggy logger");

Предупреждение : Это«игрушечный» логгер с некоторыми ошибками, чтобы дать вам некоторое представление о кастомном логгере ... Не использовать напрямую в реальных приложениях ..

...