上一篇文章可以直接展示系统在运行过程中的日志,读取日志文件https://blog.csdn.net/wjl990316fddwjl/article/details/135553685
如何将得到的日志插入数据表中,进行更可观的展示?
1、创建表格并执行,可以看到数据库已经创建好了表格,在这里我们来将日志数据进行插入
cpp
//创建t_log日志表
string sql = "CREATE TABLE IF NOT EXISTS `t_log` (\
`id` INT AUTO_INCREMENT,\
`ip` VARCHAR(16),\
`log` VARCHAR(2048),\
`log_time` datetime,\
PRIMARY KEY(`id`))";
my->Query(sql.c_str());
2、写一个插入数据库的函数
cpp
//日志写入数据库
bool SaveLog(std::string log);
2.1、函数编写
cpp
bool XAgent::SaveLog(std::string log)
{
cout << log << endl;
XDATA data;
data["log"] = log.c_str();
//获取本机的ip地址
//遍历网卡
data["ip"] = local_ip.c_str();
//插入时间,用mysql now函数 @表示字段内容不加引号,@会自动去除
data["@log_time"] = "now()";
my->Insert(data, "t_log");
return true;
}
如何使用linux的ip而不是使用127.0.0.1呢?这个代码直接调用一下
cpp
//遍历网卡,获取本机的ip
static std::string GetLocalIP();
cpp
//获取本机地址
std::string XAgent::GetLocalIP()
{
char ip[16] = { 0 };
#ifndef _WIN32
ifaddrs* ifadd = 0;
if (getifaddrs(&ifadd) != 0)return "";
//遍历地址
ifaddrs* iter = ifadd;
while (iter!=NULL)
{
//ipv4
if(iter->ifa_addr->sa_family==AF_INET)
if (strcmp(iter->ifa_name, "lo") != 0)//去掉回环地址,去掉127.0.0.1
{
//转换整型ip为字符串
void* tmp = &((sockaddr_in*)iter->ifa_addr)->sin_addr;
inet_ntop(AF_INET, tmp, ip, INET_ADDRSTRLEN);
break;
}
iter = iter->ifa_next;
}
freeifaddrs(ifadd);
#endif // !_WIN32
return ip;
}
3、在这里直接将插入函数放进主循环里面,也就是上一篇的
cpp
void XAgent::Main()
{
// 读取最新日志
while (true)
{
// 将文件指针移动到上次读取的位置
fseek(fp, lastPosition, SEEK_SET);
// 读取新添加的内容
char buffer[1024];
while (fgets(buffer, sizeof(buffer), fp) != nullptr)
{
SaveLog(buffer);
}
// 更新 lastPosition 到文件末尾,以便下次读取新内容
lastPosition = ftell(fp);
// 等待一段时间再继续检查文件
this_thread::sleep_for(chrono::milliseconds(100));
}
}