我正在使用Linux环境下的C项目,我正在寻找一种向日志文件添加错误的有效方法。 我尝试使用Syslog进行以下初始化:
setlogmask(LOG_UPTO(7));
openlog(name, LOG_CONS | LOG_NDELAY | LOG_PID, LOG_USER);
但它看起来效果太慢了。我需要它才能快速工作.. 有人可以帮忙吗?也许系统日志不是正确的方法。
答案 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
获取日志?