【问题标题】:Logging Errors in C在 C 中记录错误
【发布时间】:2012-01-05 10:31:27
【问题描述】:

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

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

但它似乎运行得太慢了。我需要它工作得非常快.. 有人可以帮忙吗?也许系统日志不是正确的方法。

【问题讨论】:

  • "slow" - 将进程运行时间减少 7 个订单..
  • 你在写大量的日志信息吗?
  • 打开慢还是登录慢?到底有多慢,有什么基准吗?
  • 您的 syslog 守护程序是否设置为进行远程日志记录?那样的话,可能是因为网络通信比较慢?

标签: c linux logging syslog


【解决方案1】:

失去使用 syslog 的一些灵活性的一种可能性是让您的程序使用普通的 I/O 工具自己编写错误日志(可能要小心使用刷新)。

【讨论】:

  • 你能举一些这样的例子吗?
  • 只是小心使用fprintf和朋友们。
【解决方案2】:

您可以编写一个自定义的轻量级记录器,也可以由第 3 方开源一个...

例如第 3 部分 C++ 记录器 [http://logging.apache.org/log4cxx/]

这里是简单的 [buggy] 自定义记录器 [摘自 C++ Time Saving Techniques For Dummies 书]

#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");

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

【讨论】:

    【解决方案3】:

    可能您的系统日志守护程序在每次写入后都会进行同步。另一种方法可能是按照其他人的建议直接记录到文件中。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 2013-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        相关资源
        最近更新 更多