feat: add logging module for backend + frontend error reporting
Backend: - New Logger utility (app/utils/Logger.php) with category-based log files (connect/game/bet/error/frontend under runtime/log/) - Log WebSocket connect/close events (WsConnect, WsClose) - Log dealer auth success/failure (SpaceConnectService) - Log all game events: startBet, endBet, changeBoot, opening for all 7 game types - Log unhandled exceptions (ExceptionHandle) - Separate SQL/error logs via apart_level, enable realtime_write for Swoole - Add /log/report POST endpoint for frontend error ingestion Frontend: - New error-report.js with window.onerror + unhandledrejection auto-reporting - Added to all 12 dealer HTML templates - Bump VERSION_V to v10.1.0
This commit is contained in:
@@ -36,7 +36,13 @@ class ExceptionHandle extends Handle
|
||||
*/
|
||||
public function report(Throwable $exception): void
|
||||
{
|
||||
// 使用内置的方式记录异常日志
|
||||
if (!$this->isIgnoreReport($exception)) {
|
||||
\app\utils\Logger::error(\app\utils\Logger::CAT_ERROR, $exception->getMessage(), [
|
||||
'file' => $exception->getFile(),
|
||||
'line' => $exception->getLine(),
|
||||
'trace' => substr($exception->getTraceAsString(), 0, 2000),
|
||||
]);
|
||||
}
|
||||
parent::report($exception);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@
|
||||
//应用公共文件
|
||||
|
||||
// 版本号
|
||||
define('VERSION_V','?ver=v10.0.9');
|
||||
define('VERSION_V','?ver=v10.1.0');
|
||||
|
||||
// 强制加载中文语言包
|
||||
\think\facade\Lang::load(__DIR__ . '/lang/zh-cn.php');
|
||||
|
||||
@@ -292,6 +292,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_b.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -205,6 +205,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -490,6 +490,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_b_sb_scan_four.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -124,6 +124,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_dice.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -233,6 +233,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_b.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -174,6 +174,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -459,6 +459,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_dt_sb.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -345,6 +345,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -620,6 +620,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -620,6 +620,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_nn_sb.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -126,6 +126,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle_roulette.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -136,6 +136,7 @@
|
||||
<script type="text/javascript" src="/static/handle/js/jquery.cookie.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/layer-v3.1.1/layer.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/socket.io-1.4.4.js"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/error-report.js{$Think.VERSION_V}"></script>
|
||||
<script type="text/javascript" src="/static/handle/js/handle.js{$Think.VERSION_V}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -3,6 +3,7 @@ declare (strict_types = 1);
|
||||
|
||||
namespace app\listener;
|
||||
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\swoole\WebSocket;
|
||||
|
||||
@@ -55,6 +56,6 @@ class WsClose
|
||||
}
|
||||
$tableFd->del((string) $fd);
|
||||
$ws->leave(SocketSession::HOUSE_NAME);
|
||||
echo $fd.":退出\n";
|
||||
Logger::info(Logger::CAT_CONNECT, 'ws_close', ['fd' => $fd, 'mode' => $mode, 'table_id' => $fdInfo['table_id'] ?? '']);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ use app\services\connect\ScanConnectService;
|
||||
use app\services\connect\SpaceConnectService;
|
||||
use app\services\connect\UserConnectService;
|
||||
use app\services\connect\ManagerConnectService;
|
||||
use app\utils\Logger;
|
||||
use think\Request;
|
||||
|
||||
class WsConnect
|
||||
@@ -18,6 +19,11 @@ class WsConnect
|
||||
*/
|
||||
public function handle(Request $event){
|
||||
$connect = $event->get('connect');
|
||||
Logger::info(Logger::CAT_CONNECT, 'ws_connect', [
|
||||
'mode' => $connect,
|
||||
'table_id' => $event->get('table_id'),
|
||||
'account' => $event->get('account'),
|
||||
]);
|
||||
switch ($connect) {
|
||||
case 'space':
|
||||
SpaceConnectService::doSpaceConnect($event);
|
||||
|
||||
@@ -4,6 +4,7 @@ declare (strict_types = 1);
|
||||
namespace app\listener\space;
|
||||
|
||||
use app\models\process\Boot;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\swoole\WebSocket;
|
||||
|
||||
@@ -22,7 +23,9 @@ class ChangeBoot
|
||||
$modelRes = Boot::changeBoot($tableInfo);
|
||||
if ($modelRes['status'] == true){
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('changeBoot',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $modelRes['data']]);
|
||||
Logger::info(Logger::CAT_GAME, 'change_boot', ['table_id' => $tableInfo['id'], 'table_name' => $tableInfo['table_name']]);
|
||||
}else{
|
||||
Logger::warn(Logger::CAT_GAME, 'change_boot_fail', ['table_id' => $tableInfo['id'], 'msg' => $modelRes['msg']]);
|
||||
$ws->emit('changeBoot', ['status' => false, 'msg' => $modelRes['msg']]);
|
||||
}
|
||||
}else{
|
||||
|
||||
@@ -6,6 +6,7 @@ namespace app\services\connect;
|
||||
|
||||
use app\models\table\Table;
|
||||
use app\models\table\UserController;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\Request;
|
||||
|
||||
@@ -38,8 +39,8 @@ class SpaceConnectService
|
||||
$username = trim($event->get('account'));
|
||||
$userController = UserController::get(['id' => $userId, 'username' => $username, 'login_token' => $loginToken]);
|
||||
if (!$tableInfo || !$userController){
|
||||
Logger::warn(Logger::CAT_CONNECT, 'space_auth_fail', ['table_id' => $tableId, 'username' => $username, 'has_table' => !!$tableInfo, 'has_user' => !!$userController]);
|
||||
$ws->emit('onlineLogin',['status' => false, 'msg' => 'not_table_data']);
|
||||
//$ws->close();
|
||||
return;
|
||||
}
|
||||
$lastNumberTab = InitTableService::initTable($tableInfo);
|
||||
@@ -54,7 +55,9 @@ class SpaceConnectService
|
||||
$round['show_card'] = GetCardService::getCard($tableInfo,$lastNumberTab);
|
||||
$ws->emit('onlineLogin',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
SocketSession::saveSocketSession(['table_id' => $tableInfo['id'], 'table_name' => $tableInfo['table_name']],'space');
|
||||
Logger::info(Logger::CAT_CONNECT, 'space_login_ok', ['table_id' => $tableInfo['id'], 'table_name' => $tableInfo['table_name'], 'username' => $username]);
|
||||
}else{
|
||||
Logger::warn(Logger::CAT_CONNECT, 'space_init_fail', ['table_id' => $tableId, 'username' => $username]);
|
||||
$ws->emit('onlineLogin',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'link_server_fail']);
|
||||
//$ws->close();
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ use app\services\waybill\WaybillRemindService;
|
||||
use freedom\utils\CardPosition;
|
||||
use freedom\utils\RedisUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
use app\utils\Logger;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
/**
|
||||
@@ -32,6 +33,7 @@ class OpeningBaccaratService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_baccarat_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingBaccarat',['status' => false, 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -52,6 +54,7 @@ class OpeningBaccaratService
|
||||
);
|
||||
$ws->emit('openingBaccarat',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingBaccaratResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_baccarat', ['table_id' => $tableInfo['id'], 'opening' => $opening, 'pair' => $pair, 'luck_six' => $luck_six]);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo);
|
||||
//处理好路
|
||||
|
||||
@@ -10,6 +10,7 @@ use app\models\user\User;
|
||||
use app\services\connect\InitTableService;
|
||||
use freedom\utils\DiceUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
use app\utils\Logger;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
/**
|
||||
@@ -31,6 +32,7 @@ class OpeningDiceService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_dice_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingDice',['status' => false, 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -47,6 +49,7 @@ class OpeningDiceService
|
||||
);
|
||||
$ws->emit('openingDice',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingDiceResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_dice', ['table_id' => $tableInfo['id'], 'result' => $resultArray]);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo,$resultArray,$resultParse);
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ use freedom\utils\CardPosition;
|
||||
use freedom\utils\RedisUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\facade\Env;
|
||||
use app\utils\Logger;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
/**
|
||||
@@ -35,6 +36,7 @@ class OpeningDtService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_dt_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingDt',['status' => false, 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -52,6 +54,7 @@ class OpeningDtService
|
||||
);
|
||||
$ws->emit('openingDt',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingDtResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_dt', ['table_id' => $tableInfo['id'], 'opening' => $opening]);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo);
|
||||
//处理好路
|
||||
|
||||
@@ -11,6 +11,7 @@ use app\services\connect\InitTableService;
|
||||
use freedom\utils\CardPositionNn;
|
||||
use freedom\utils\RedisUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
use app\utils\Logger;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
class OpeningNnService
|
||||
@@ -26,6 +27,7 @@ class OpeningNnService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_nn_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingNn',['status' => false, 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -41,6 +43,7 @@ class OpeningNnService
|
||||
$round = array_merge($round,$data);
|
||||
$ws->emit('openingNn',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingNnResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_nn', ['table_id' => $tableInfo['id'], 'result_banker' => $data['result_banker'], 'win_p1' => $data['win_player_1'], 'win_p2' => $data['win_player_2'], 'win_p3' => $data['win_player_3']]);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo,$data);
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ use app\models\process\Boot;
|
||||
use app\models\process\NumberTab;
|
||||
use app\models\user\User;
|
||||
use app\services\connect\InitTableService;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\RouletteUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
use think\swoole\Websocket;
|
||||
@@ -31,6 +32,7 @@ class OpeningRouletteService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_roulette_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingRoulette',['status' => false,'table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -47,6 +49,7 @@ class OpeningRouletteService
|
||||
);
|
||||
$ws->emit('openingRoulette',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingRouletteResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_roulette', ['table_id' => $tableInfo['id'], 'result' => $round['result'] ?? '']);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo,$result,$resultParse);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ use app\services\connect\InitTableService;
|
||||
use freedom\utils\CardPositionTc;
|
||||
use freedom\utils\RedisUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
use app\utils\Logger;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
class OpeningTcService
|
||||
@@ -26,6 +27,7 @@ class OpeningTcService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_tc_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingTc',['status' => false, 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -41,6 +43,7 @@ class OpeningTcService
|
||||
$round = array_merge($round,$data);
|
||||
$ws->emit('openingTc',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingTcResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_tc', ['table_id' => $tableInfo['id'], 'result_banker' => $data['result_banker'], 'win_p1' => $data['win_player_1'], 'win_p2' => $data['win_player_2'], 'win_p3' => $data['win_player_3']]);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo,$data);
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ use app\models\user\User;
|
||||
use app\services\connect\InitTableService;
|
||||
use freedom\utils\SocketSession;
|
||||
use freedom\utils\ToningUtil;
|
||||
use app\utils\Logger;
|
||||
use think\swoole\Websocket;
|
||||
|
||||
/**
|
||||
@@ -31,6 +32,7 @@ class OpeningToningService
|
||||
//判断结果并推送结果
|
||||
$res = self::doOpening($event,$tableInfo);
|
||||
if ($res['status'] == false){
|
||||
Logger::warn(Logger::CAT_GAME, 'opening_toning_fail', ['table_id' => $tableInfo['id'], 'msg' => $res['msg']]);
|
||||
$ws->emit('openingToning',['status' => false, 'msg' => $res['msg']]);
|
||||
return;
|
||||
}
|
||||
@@ -46,6 +48,7 @@ class OpeningToningService
|
||||
);
|
||||
$ws->emit('openingToning',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
$ws->to(SocketSession::HOUSE_NAME)->emit('openingToningResult',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]);
|
||||
Logger::info(Logger::CAT_GAME, 'opening_toning', ['table_id' => $tableInfo['id'], 'result' => $result]);
|
||||
//处理注单
|
||||
self::doBet($ws,$tableInfo,$lastNumberTabInfo);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ namespace app\services\process;
|
||||
|
||||
use app\models\process\NumberTab;
|
||||
use app\services\connect\InitTableService;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\RedisUtil;
|
||||
use freedom\utils\SocketSession;
|
||||
|
||||
@@ -41,7 +42,9 @@ class EndBetService
|
||||
'number_tab_status' => InitTableService::numberTabStatus($numberTabInfo)
|
||||
]
|
||||
]);
|
||||
Logger::info(Logger::CAT_GAME, 'end_bet', ['table_id' => $tableInfo['id'], 'nt_id' => $numberTabId]);
|
||||
}else{
|
||||
Logger::warn(Logger::CAT_GAME, 'end_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $modelRes['msg']]);
|
||||
$ws->emit('endBet', ['status' => false, 'msg' => $modelRes['msg']]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ namespace app\services\process;
|
||||
|
||||
use app\models\process\NumberTab;
|
||||
use app\services\connect\InitTableService;
|
||||
use app\utils\Logger;
|
||||
use freedom\utils\SocketSession;
|
||||
|
||||
/**
|
||||
@@ -44,7 +45,9 @@ class StartBetService
|
||||
$ws->emit('startBet', $responseData);
|
||||
//启动倒计时(该处以后会废弃掉)
|
||||
CountdownService::countdown($numberTabId,$tableInfo,$modelRes['data']);
|
||||
Logger::info(Logger::CAT_GAME, 'start_bet', ['table_id' => $tableInfo['id'], 'table_name' => $tableInfo['table_name'], 'nt_id' => $numberTabId]);
|
||||
}else{
|
||||
Logger::warn(Logger::CAT_GAME, 'start_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $modelRes['msg']]);
|
||||
$ws->emit('startBet', ['status' => false, 'msg' => $modelRes['msg']]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
namespace app\utils;
|
||||
|
||||
class Logger
|
||||
{
|
||||
const CAT_CONNECT = 'connect';
|
||||
const CAT_GAME = 'game';
|
||||
const CAT_BET = 'bet';
|
||||
const CAT_ERROR = 'error';
|
||||
const CAT_FRONTEND = 'frontend';
|
||||
|
||||
public static function log(string $category, string $level, string $message, array $context = []): void
|
||||
{
|
||||
$date = date('Y-m-d');
|
||||
$time = date('Y-m-d H:i:s');
|
||||
$dir = runtime_path() . 'log' . DIRECTORY_SEPARATOR . $category;
|
||||
if (!is_dir($dir)) {
|
||||
mkdir($dir, 0755, true);
|
||||
}
|
||||
$file = $dir . DIRECTORY_SEPARATOR . $date . '.log';
|
||||
$contextStr = $context ? ' ' . json_encode($context, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : '';
|
||||
$line = "[{$time}][{$level}] {$message}{$contextStr}" . PHP_EOL;
|
||||
file_put_contents($file, $line, FILE_APPEND | LOCK_EX);
|
||||
}
|
||||
|
||||
public static function info(string $category, string $message, array $context = []): void
|
||||
{
|
||||
self::log($category, 'INFO', $message, $context);
|
||||
}
|
||||
|
||||
public static function warn(string $category, string $message, array $context = []): void
|
||||
{
|
||||
self::log($category, 'WARN', $message, $context);
|
||||
}
|
||||
|
||||
public static function error(string $category, string $message, array $context = []): void
|
||||
{
|
||||
self::log($category, 'ERROR', $message, $context);
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -25,9 +25,9 @@ return [
|
||||
// 单文件日志写入
|
||||
'single' => false,
|
||||
// 独立日志级别
|
||||
'apart_level' => [],
|
||||
'apart_level' => ['error', 'sql'],
|
||||
// 最大日志文件数量
|
||||
'max_files' => 0,
|
||||
'max_files' => 30,
|
||||
// 使用JSON格式记录
|
||||
'json' => false,
|
||||
// 日志处理
|
||||
@@ -37,7 +37,7 @@ return [
|
||||
// 日志输出格式化
|
||||
'format' => '[%s][%s] %s',
|
||||
// 是否实时写入
|
||||
'realtime_write' => false,
|
||||
'realtime_write' => true,
|
||||
],
|
||||
// 其它日志通道配置
|
||||
],
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
(function() {
|
||||
var reportUrl = '/log/report';
|
||||
var queue = [];
|
||||
var sending = false;
|
||||
|
||||
function send(data) {
|
||||
if (queue.length >= 10) return;
|
||||
data.source = 'handle';
|
||||
data.time = new Date().toISOString();
|
||||
data.url = location.href;
|
||||
queue.push(data);
|
||||
flush();
|
||||
}
|
||||
|
||||
function flush() {
|
||||
if (sending || queue.length === 0) return;
|
||||
sending = true;
|
||||
var item = queue.shift();
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open('POST', reportUrl);
|
||||
xhr.setRequestHeader('Content-Type', 'application/json');
|
||||
xhr.onloadend = function() { sending = false; flush(); };
|
||||
xhr.onerror = function() { sending = false; };
|
||||
xhr.timeout = 3000;
|
||||
xhr.send(JSON.stringify(item));
|
||||
}
|
||||
|
||||
window.onerror = function(message, source, lineno, colno, error) {
|
||||
send({
|
||||
type: 'error',
|
||||
message: String(message),
|
||||
stack: error && error.stack ? error.stack.substring(0, 2000) : '',
|
||||
file: source,
|
||||
line: lineno,
|
||||
col: colno
|
||||
});
|
||||
};
|
||||
|
||||
window.addEventListener('unhandledrejection', function(event) {
|
||||
var reason = event.reason;
|
||||
send({
|
||||
type: 'unhandledrejection',
|
||||
message: reason && reason.message ? reason.message : String(reason),
|
||||
stack: reason && reason.stack ? reason.stack.substring(0, 2000) : ''
|
||||
});
|
||||
});
|
||||
})();
|
||||
@@ -15,3 +15,19 @@ Route::get('think', function () {
|
||||
});
|
||||
|
||||
Route::get('hello/:name', 'index/hello');
|
||||
|
||||
Route::post('log/report', function () {
|
||||
$data = request()->post();
|
||||
\app\utils\Logger::error(\app\utils\Logger::CAT_FRONTEND, $data['message'] ?? 'unknown', [
|
||||
'source' => $data['source'] ?? 'unknown',
|
||||
'type' => $data['type'] ?? 'error',
|
||||
'stack' => isset($data['stack']) ? substr($data['stack'], 0, 2000) : '',
|
||||
'file' => $data['file'] ?? '',
|
||||
'url' => $data['url'] ?? '',
|
||||
'line' => $data['line'] ?? '',
|
||||
'col' => $data['col'] ?? '',
|
||||
'ua' => request()->header('user-agent', ''),
|
||||
'ip' => request()->ip(),
|
||||
]);
|
||||
return json(['status' => 1]);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user