log
简介
- 一个通用的游戏日志存储解决方案
- 提供了文本文件,Mysql/Sqlite,Mongo,数数日志,Excel等日志存储媒介
使用场景
- 默认使用MongoDB来存储日志,直接包含pkg就可以使用,一般的游戏服框架都自带mongo
- 正规上线的游戏服请使用Talog来存储日志,以便上传到数数日志给运营查询分析
- 如果上线后需要输出一些方便自己查询的日志,请使用mysql来存储
- 小规模测试可以支持直接输出xlsx格式的日志,方便策划直接查询分析
使用特性
- 需要动态选择存储日志的媒介,可以通过自定义配置选择日志落地的方式
- 使用file_queue进行断点续传,保证日志平稳落地的同时不会在高并发的时候内存激增
- 提供通用日志头数据的更新接口
- 提供将数据库中的日志一键导出excel的接口
组件接口
函数原型 | 函数作用 |
---|---|
void start(bool buse_db = false, mixed log_dbs = nil, mixed log_xml = nil, mixed mongo_dbs = nil, mixed co_count = 4) | 该接口用来初始化日志相关信息 |
void end() | 该接口用来销毁日志相关信息 |
void update_head(string rid, map head_data) | 该接口用来更新不同玩家日志头的信息 |
void write(string cmd, string log_table, map log_data, map keys = ) | 该接口用来写入一条日志到指定设备中 |
void write_all(string log_table, map log_data, map keys = ) | 该接口用来写入一条日志到所有设备中 |
void excel(string log_table) | 该接口用来将写入数据库的日志导出成excel格式 |
void op(string func_name, string event_name, string account_id, map properties = , map keys = ) | 该接口用来设置数数日志的一些特殊编写功能 |
使用方法
- import pkg.log;
- 调用 log.start(bool buse_db = false, mixed log_dbs = nil, mixed log_xml = nil, mixed mongo_dbs = nil, mixed co_count = 4); 初始化日志
- 调用 log.update_head(string rid, map head_data); 更新日志通用头部信息,需要使用数据库
- 调用 log.write(string cmd, string log_table, map log_data, map keys = ); 写入单条日志,可以指定cmd为哪一种写入方式,即logexec目录下的各个文件名
- 调用 log.write_all(string log_table, map log_data, map keys = ); 写入单条日志,写入符合条件的全部载体
- 调用 log_ta.op(string func_name, string event_name, string account_id, map properties = , map keys = ); 可以对数数日志进行特殊格式的日志编写
- 调用 log.end(); 来释放日志资源
- 目前支持sqllite, mysql, file, mongodb, talog, excellog, alilog等多种写入方式
例子:
import gs.lang.*;
import gs.util.*;
import pkg.log;
import pkg.log.logexec.log_ta;
import common.mods.config;
void create()
{
}
void destruct()
{
log.end();
}
public void start()
{
log.start(true, config.get("log_dbs"), config.get("log_db_xml_files"), config.get("mongo"), config.get("log_msg_co_count"));
}
// 更新日志头
public void update_head(string rid, map head_data)
{
log.update_head(rid, head_data);
}
// 写日志
public void write(string cmd, string log_table, map log_data, map keys = {})
{
log.write(cmd, log_table, log_data, keys);
}
public void write_all(mixed cmds, string log_table, map log_data, map keys = {})
{
for (mixed cmd : cmds)
{
if (cmd == "all")
log.write_all(log_table, log_data, keys);
else
log.write(cmd, log_table, log_data, keys);
}
}
// talog操作
public void talog_op(string cmd, string event_name, string account_id, map properties = {}, map keys = {})
{
log_ta.op(cmd, event_name, account_id, properties, keys);
}
配置文件模板
基础配置
{
// log db 连接设置
"log_dbs": {
"native_ldb": {
"driver": "sqlite", //暂时替代"mysql",其他参数保留
"address": "127.0.0.1",
"user": "root",
"passwd": "M68SQL",
"db": "/doc/logdb",
"max_conn_count": 32,
},
},
// sql db描述文件设置
"log_db_xml_files" : [
"/etc/database.xml",
],
// 日志消息线程数
"log_msg_co_count" : 4,
}
mongo.json
{
"mongo" :
{
"cfg" : {"thread_num" : 2},
"mongo_dbs" :
[
{
"db" :
{
"name" : "mongo_log",
"db" : "mongo_log",
"host" : "localhost",
"port" : "27017",
"auth" : {},
},
"collections" :
{
"log_head" : {},
"login" : {},
"logout" : {},
},
},
]
}
}
database.xml
<?xml version="1.0" encoding="UTF-8" ?>
<databases name=>
<database name = native_ldb type = ddb>
<table name = log_head>
<primary field = id type = auto_increment extra_primary_keys="update_date" />
<key field = update_date type = timestamp />
<key field = rid type = string len = 32 />
<key field = server_id type = int len = 11 />
<key field = account type = string len = 256 />
<key field = account_id type = string len = 256 />
<key field = username type = string len = 32 />
<index name=index_update_date type = normal fields="update_date" />
<index name=index_rid type = normal fields="rid" />
</table>
<table name = login>
<primary field = id type = auto_increment extra_primary_keys="update_date" />
<key field = update_date type = timestamp />
<key field = log_id type = int len = 11 />
<key field = rid type = string len = 32 />
<key field = login_time type = int len = 11 />
<key field = p1 type = string len = 256 />
<key field = p2 type = string len = 256 />
<key field = p3 type = string len = 256 />
<key field = memo type = mixed />
<index name=index_update_date type = normal fields="update_date" />
<index name=index_log_id type = normal fields="log_id" />
<index name=index_rid type = normal fields="rid" />
</table>
<table name = logout>
<primary field = id type = auto_increment extra_primary_keys="update_date" />
<key field = update_date type = timestamp />
<key field = log_id type = int len = 11 />
<key field = rid type = string len = 32 />
<key field = logout_time type = int len = 11 />
<key field = p1 type = string len = 256 />
<key field = p2 type = string len = 256 />
<key field = p3 type = string len = 256 />
<key field = memo type = mixed />
<index name=index_update_date type = normal fields="update_date" />
<index name=index_log_id type = normal fields="log_id" />
<index name=index_rid type = normal fields="rid" />
</table>
</database>
</databases>