在互联网后台服务器中常需要记录互联网软件的流水日志,日志服务器和入库工具则是处理此类功能。
日志服务器会接受逻辑服务器发送的日志消息,将其写入本地日志文件。每隔一段时间,再由日志入库服务器将日志文件导入数据库。
1. 日志服务器
日志服务器接收其他服务器服务器发送的json格式日志消息,并写入到日志文件。
日志服务器不需要解析消息内容,定时批量写入日志文件。
日志文件包含日志描述文件和日志数据文件。
1.2. 日志消息
日志服务器接收其他服务器发来的消息,消息头跟一般消息一致,命令类型为服务器指定命令。
消息体为json格式,日志命令为独立命令,根据日志解析配置来填写。内容如下:
{
"log_cmd": 1,
"fields": {
"uid": 10000,
"guid": "10001",
"nickname": "张三",
"mac": "64-00-6A-05-3B-DD",
"ip": "192.168.10.124",
"login_type": "1",
"login_time": 1447816170,
"logout_time": 1447816270,
"logout_type": 1,
"online_time": 100,
"log_time": 1447816270
}
}
日志命令log_cmd为1,需要记录的字段在fields内。
1.3 日志描述文件
日志描述文件会记录数据记录的个数、文件的标识和版本,以及保留字段。日志文件头为以后的日志拓展和简要分析提供依据。日志描述文件的命名方式为*.fb。
日志文件头格式如下:
struct LogHeader
{
LogHeader()
{
memset(this, 0, sizeof(LogHeader));
}
//日志文件固定标识为: 'L', 'O', 'G', 0分别占uint32的一个字节
uint32 nIdent;
//日志文件格式版本号
uint32 nVersion;
//日志文件中存储的记录数量
uint32 nRecordCount;
//保留字节
char sReserves[20];
};
1.4 日志数据文件
日志数据文件存储日志数据记录,包含数据记录头和数据记录体。日志数据文件命名方式为*.fd。
日志数据记录存储格式如下:
数据记录头1 数据记录体1 数据记录头2 数据记录体2...
1.5 数据记录头
数据记录头包含本条日志的简要信息。消息内容变动时修改数据记录头的数据版本号。
可以一次写入多个日志消息到日志文件,以提高写入效率。在内存中以消息队列的方式来存储将要写文件的日志消息。
数据记录头格式:
struct LogDataHeader
{
uint16 nCmdType;//命令类型
uint16 nDataVersion;//数据版本号
uint16 nBodySize;//数据记录体大小
};
数据记录头初始化,例如:
struct LogDataHeader logDataHeader;
logDataHeader.nCmdType = 1;//日志表类型
logDataHeader.nDataVersion = 1;//数据版本号
logDataHeader.nBodySize = fieldsSize;//数据记录体大小,