记录C中的错误

时间:2011-11-24 08:17:27

标签: c linux logging syslog

我正在使用Linux环境下的C项目,我正在寻找一种向日志文件添加错误的有效方法。 我尝试使用Syslog进行以下初始化:

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

但它看起来效果太慢了。我需要它才能快速工作.. 有人可以帮忙吗?也许系统日志不是正确的方法。

4 个答案:

答案 0 :(得分:3)

使用syslog失去一些灵活性的一种可能性是让你的程序使用普通的I / O工具(可能仔细使用刷新)编写错误日志本身。

答案 1 :(得分:0)

您可以编写自定义轻量级记录器,也可以编写第三方开源记录器......

例如第三部分C ++ logger [http://logging.apache.org/log4cxx/]

这里有一个简单的[buggy]自定义记录器[来自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");

警告:这是一个带有一些错误的“玩具”记录器,只是让您对自定义记录器有所了解......不要直接在实际应用程序中使用..

答案 2 :(得分:0)

每次写入后,您的syslog守护程序可能正在执行同步。另一种方法可能是按照其他人的建议直接记录到文件中。

答案 3 :(得分:-1)

如何使用printk(KERNEL "..."),并使用dmesg获取日志?

相关问题