1
This commit is contained in:
parent
3ceb978f38
commit
5d7153a5e5
133
f8/jsonlog.cc
Normal file
133
f8/jsonlog.cc
Normal file
@ -0,0 +1,133 @@
|
||||
#include <thread>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
|
||||
#include <a8/a8.h>
|
||||
|
||||
#include <f8/f8.h>
|
||||
#include <f8/jsonlog.h>
|
||||
|
||||
namespace f8
|
||||
{
|
||||
struct JsonLogMsgNode
|
||||
{
|
||||
a8::XObject* xobj = nullptr;
|
||||
JsonLogMsgNode* next = nullptr;
|
||||
};
|
||||
|
||||
struct JsonLogImpl
|
||||
{
|
||||
std::string log_filename;
|
||||
|
||||
std::thread* save_thread = nullptr;
|
||||
bool save_thread_shutdown = false;
|
||||
|
||||
std::mutex msg_mutex;
|
||||
JsonLogMsgNode* top_node = nullptr;
|
||||
JsonLogMsgNode* bot_node = nullptr;
|
||||
JsonLogMsgNode* work_node = nullptr;
|
||||
std::mutex *save_cond_mutex = nullptr;
|
||||
std::condition_variable *save_cond = nullptr;
|
||||
};
|
||||
|
||||
JsonLog::JsonLog()
|
||||
{
|
||||
impl_ = new JsonLogImpl();
|
||||
impl_->save_cond_mutex = new std::mutex();
|
||||
impl_->save_cond = new std::condition_variable();
|
||||
|
||||
impl_->top_node = nullptr;
|
||||
impl_->bot_node = nullptr;
|
||||
impl_->work_node = nullptr;
|
||||
}
|
||||
|
||||
JsonLog::~JsonLog()
|
||||
{
|
||||
delete impl_->save_cond_mutex;
|
||||
impl_->save_cond_mutex = nullptr;
|
||||
delete impl_->save_cond;
|
||||
impl_->save_cond = nullptr;
|
||||
delete impl_;
|
||||
impl_ = nullptr;
|
||||
}
|
||||
|
||||
void JsonLog::Init()
|
||||
{
|
||||
impl_->save_thread_shutdown = false;
|
||||
impl_->save_thread = new std::thread(&JsonLog::SaveToFileThreadProc, this);
|
||||
}
|
||||
|
||||
void JsonLog::UnInit()
|
||||
{
|
||||
impl_->save_thread_shutdown = true;
|
||||
impl_->save_thread->join();
|
||||
delete impl_->save_thread;
|
||||
impl_->save_thread = nullptr;
|
||||
}
|
||||
|
||||
void JsonLog::SetLogFileName(const std::string& filename)
|
||||
{
|
||||
impl_->log_filename = filename;
|
||||
}
|
||||
|
||||
void JsonLog::AddLog(a8::XObject* xobj)
|
||||
{
|
||||
JsonLogMsgNode *p = new JsonLogMsgNode();
|
||||
p->xobj = xobj;
|
||||
impl_->msg_mutex.lock();
|
||||
if (impl_->bot_node) {
|
||||
impl_->bot_node->next = p;
|
||||
impl_->bot_node = p;
|
||||
} else {
|
||||
impl_->top_node = p;
|
||||
impl_->bot_node = p;
|
||||
}
|
||||
impl_->msg_mutex.unlock();
|
||||
{
|
||||
std::unique_lock<std::mutex> lk(*impl_->save_cond_mutex);
|
||||
impl_->save_cond->notify_all();
|
||||
}
|
||||
}
|
||||
|
||||
void JsonLog::SaveToFileThreadProc()
|
||||
{
|
||||
while (!impl_->save_thread_shutdown) {
|
||||
if (!impl_->work_node && impl_->top_node) {
|
||||
impl_->msg_mutex.lock();
|
||||
impl_->work_node = impl_->top_node;
|
||||
impl_->top_node = nullptr;
|
||||
impl_->bot_node = nullptr;
|
||||
impl_->msg_mutex.unlock();
|
||||
}
|
||||
|
||||
if (impl_->work_node) {
|
||||
time_t nowtime = time(nullptr);
|
||||
struct tm tm_nowtime = {0};
|
||||
localtime_r(&nowtime, &tm_nowtime);
|
||||
|
||||
char szfilename[256];
|
||||
strftime(szfilename, a8::ArraySize(szfilename), impl_->log_filename.c_str(), &tm_nowtime);
|
||||
std::string filename((char*)szfilename);
|
||||
FILE *logfile = fopen(filename.c_str(), "a+");
|
||||
if (logfile) {
|
||||
while (impl_->work_node) {
|
||||
JsonLogMsgNode *nextnode = impl_->work_node->next;
|
||||
std::string logmsg;
|
||||
impl_->work_node->xobj->ToJsonStr(logmsg);
|
||||
logmsg.push_back('\n');
|
||||
fwrite(logmsg.c_str(), 1, logmsg.size(), logfile);
|
||||
delete impl_->work_node->xobj;
|
||||
delete impl_->work_node;
|
||||
impl_->work_node = nextnode;
|
||||
}
|
||||
fclose(logfile);
|
||||
}
|
||||
}
|
||||
{
|
||||
std::unique_lock<std::mutex> lk(*impl_->save_cond_mutex);
|
||||
impl_->save_cond->wait_for(lk, std::chrono::seconds(10));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
31
f8/jsonlog.h
Normal file
31
f8/jsonlog.h
Normal file
@ -0,0 +1,31 @@
|
||||
#pragma once
|
||||
|
||||
#include <a8/singleton.h>
|
||||
|
||||
namespace f8
|
||||
{
|
||||
|
||||
class JsonLog : public a8::Singleton<JsonLog>
|
||||
{
|
||||
private:
|
||||
JsonLog();
|
||||
friend class a8::Singleton<JsonLog>;
|
||||
|
||||
public:
|
||||
~JsonLog();
|
||||
|
||||
void Init();
|
||||
void UnInit();
|
||||
|
||||
void SetLogFileName(const std::string& filename);
|
||||
|
||||
void AddLog(a8::XObject* logobj);
|
||||
|
||||
private:
|
||||
void SaveToFileThreadProc();
|
||||
|
||||
private:
|
||||
struct JsonLogImpl* impl_ = nullptr;
|
||||
};
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user