local skynet = require "skynet" local queue = require "skynet.queue" local bson = require "bson" local socketdriver = require "skynet.socketdriver" local serverId = tonumber(skynet.getenv("servId")) require "shared.init" require "skynet.manager" local table_insert = table.insert local pairs = pairs local ipairs = ipairs local string_format = string.format local CMD, cs = {} local log_fd, connecting = nil , false local socket_message = {} -- read skynet_socket.h for these macro -- SKYNET_SOCKET_TYPE_DATA = 1 socket_message[1] = function(id, size, data) skynet.error(string.format("LOG SOCKET: data: ", skynet.tostring(data, size))) socketdriver.drop(data, size) end -- SKYNET_SOCKET_TYPE_CONNECT = 2 socket_message[2] = function(id, _ , addr) skynet.error("LOG SOCKET: connect: ", addr) connecting = false end -- SKYNET_SOCKET_TYPE_CLOSE = 3 socket_message[3] = function(id) skynet.error("LOG SOCKET: closed") connecting = false end -- SKYNET_SOCKET_TYPE_ERROR = 5 socket_message[5] = function(id, _, err) skynet.error("LOG SOCKET: error: ", err) connecting = false end skynet.register_protocol { name = "socket", id = skynet.PTYPE_SOCKET, -- PTYPE_SOCKET = 6 unpack = socketdriver.unpack, dispatch = function (_, _, t, ...) if socket_message[t] then socket_message[t](...) end end } -- 日志 index 不包含 日期的 index_suffix local IndexNoDate = { online = true, } -- 不走 role log 的日志都要自行注意 mapping 设置【重要】 -- index_suffix index 后缀 默认为 common function CMD.log(logType, doc, index_suffix) index_suffix = index_suffix or "common" if index_suffix == "common" then doc["@type"] = logType else if logType ~= index_suffix then -- 定制后缀 不一定有type 不相等时才有type doc["@type"] = logType end end local now = skynet.timex() doc["timestamp"] = now doc["@timestamp"] = os.date("%Y-%m-%d %H:%M:%S", now) doc["server"] = serverId -- 自己加好 index if IndexNoDate[index_suffix] then doc["@index"] = string.format("gamelog-%s", index_suffix) else doc["@index"] = string.format("gamelog-%s-%s", os.date("%Y%m%d", now), index_suffix) end if not socketdriver.send(log_fd, json.encode(doc) .. "\n") then if not connecting then CMD.open() -- 连一下试试 end end end function CMD.open() log_fd = socketdriver.connect("127.0.0.1", 5170) connecting = true end local function __init__() skynet.dispatch("lua", function (session, address, command, ...) local f = CMD[command] if command == "open" then skynet.ret(skynet.pack(f(...))) else local logType, doc, index_suffix = ... cs(function() f(logType, doc, index_suffix) end) end end) cs = queue() skynet.register(".LOGD") end skynet.start(__init__)