目录
前言
通过异步日志的实现可以知道,日志消息并不是生成后立刻就会写出,而是先存放在前端缓冲区currentBuffer或者前端缓冲区队列buffers中,每过一段时间才会将缓冲区中的日志消息写到日志文件中。那么这就会有问题了:如果程序在中途core dump了,那么在缓冲区中还未来得及写出的日志消息该如何找回呢?
core dump的原因有多种,现在来构造这样的场景:主线程开启日志线程,写入100万条日志,那么会调用100万次append函数,在前端调用第50000次append函数的时候,让程序执行abort(),如下所示:
int cnt = 0;
void AsyncLogging::append(const char* logline, int len)
{
if(cnt++ == 50000)abort();
muduo::MutexLockGuard lock(mutex_);
if (currentBuffer_->avail() > len)
...
}
muduo::AsyncLogging* g_asyncLog = NULL;
void asyncOutput(const char* msg, int len)
{
g_asyncLog->append(msg, len);
}
int main(int argc, char* argv[])
{
muduo::AsyncLogging log("test", 10000000);
log.start(); //开启日志线程
g_asyncLog = &log;
int msgcnt = 0;
muduo::Logger::setOutput(asyncOutput);//设置日志输出函数
for(int i=0;i<1000000;i++) //写入100万条日志消息
LOG_INFO << "Hello 0123456789" << " abcdefghijklmnopqrstuvwxyz "
<< ++msgcnt;
}
这样一来,当程序调用了50000次append函数,就会自动abort,也就引发了core dump。
下面就来看看,如何在这种情况下,去找回还未来得及写出到日志文件中的日志消息。
生成core文件
要寻找还未写出的日志消息,需要用到core dump时生成的core文件,但是在默认情况下是不生成的,因此需要先开启