diff --git a/app/services/bet/ToBetDiceService.php b/app/services/bet/ToBetDiceService.php index 45fc8bc..a0cd560 100644 --- a/app/services/bet/ToBetDiceService.php +++ b/app/services/bet/ToBetDiceService.php @@ -3,6 +3,7 @@ namespace app\services\bet; use app\models\bet\Bet; +use app\utils\Logger; use freedom\utils\DiceUtil; use freedom\utils\SocketSession; @@ -33,6 +34,7 @@ class ToBetDiceService{ $time = time(); $toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data); if ($toBetCheck['status'] == false){ + Logger::warn(Logger::CAT_BET, 'dice_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); SocketSession::resetRepeat($fd,'user','isToBet'); return; @@ -90,6 +92,7 @@ class ToBetDiceService{ $res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0); $numberTabAmount = string_to_array($numberTabInfo['dice_amount']); if($res){ + Logger::info(Logger::CAT_BET, 'dice_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']); $totalAmountArray = DiceUtil::amountInc($numberTabAmount, $data); $round = [ @@ -98,6 +101,7 @@ class ToBetDiceService{ ]; $ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]); }else{ + Logger::warn(Logger::CAT_BET, 'dice_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']); } SocketSession::resetRepeat($fd,'user','isToBet'); diff --git a/app/services/bet/ToBetDtService.php b/app/services/bet/ToBetDtService.php index d9ffa24..d4a3436 100644 --- a/app/services/bet/ToBetDtService.php +++ b/app/services/bet/ToBetDtService.php @@ -5,6 +5,7 @@ namespace app\services\bet; use app\models\bet\Bet; +use app\utils\Logger; use freedom\utils\SocketSession; /** @@ -32,6 +33,7 @@ class ToBetDtService $time = time(); $toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data); if ($toBetCheck['status'] == false){ + Logger::warn(Logger::CAT_BET, 'dt_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); SocketSession::resetRepeat($fd,'user','isToBet'); return; @@ -107,6 +109,7 @@ class ToBetDtService $res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0); if($res){ + Logger::info(Logger::CAT_BET, 'dt_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']); if($userInfo['bet_type'] == 2){ $tableManager = app('swoole.table.manager'); @@ -128,6 +131,7 @@ class ToBetDtService ); $ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]); }else{ + Logger::warn(Logger::CAT_BET, 'dt_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']); } SocketSession::resetRepeat($fd,'user','isToBet'); diff --git a/app/services/bet/ToBetNnService.php b/app/services/bet/ToBetNnService.php index 9bf30c2..87cba7b 100644 --- a/app/services/bet/ToBetNnService.php +++ b/app/services/bet/ToBetNnService.php @@ -4,6 +4,7 @@ namespace app\services\bet; use app\models\bet\Bet; +use app\utils\Logger; use freedom\utils\SocketSession; /** @@ -49,6 +50,7 @@ class ToBetNnService $time = time(); $toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data); if ($toBetCheck['status'] == false){ + Logger::warn(Logger::CAT_BET, 'nn_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); SocketSession::resetRepeat($fd,'user','isToBet'); return; @@ -181,9 +183,11 @@ class ToBetNnService $res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0); if($res){ + Logger::info(Logger::CAT_BET, 'nn_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']); // 待确定是否推送即时彩池,现不推送 }else{ + Logger::warn(Logger::CAT_BET, 'nn_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']); } SocketSession::resetRepeat($fd,'user','isToBet'); diff --git a/app/services/bet/ToBetRouletteService.php b/app/services/bet/ToBetRouletteService.php index 83e4a34..abfa308 100644 --- a/app/services/bet/ToBetRouletteService.php +++ b/app/services/bet/ToBetRouletteService.php @@ -3,6 +3,7 @@ namespace app\services\bet; use app\models\bet\Bet; +use app\utils\Logger; use freedom\utils\RouletteUtil; use freedom\utils\SocketSession; @@ -36,6 +37,7 @@ class ToBetRouletteService{ $time = time(); $toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data); if ($toBetCheck['status'] == false){ + Logger::warn(Logger::CAT_BET, 'roulette_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); SocketSession::resetRepeat($fd,'user','isToBet'); return; @@ -61,7 +63,9 @@ class ToBetRouletteService{ 'amount_item' => $data ]; $ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]); + Logger::info(Logger::CAT_BET, 'roulette_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); }else{ + Logger::warn(Logger::CAT_BET, 'roulette_bet_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']); } SocketSession::resetRepeat($fd,'user','isToBet'); diff --git a/app/services/bet/ToBetTcService.php b/app/services/bet/ToBetTcService.php index b1fbab4..f101426 100644 --- a/app/services/bet/ToBetTcService.php +++ b/app/services/bet/ToBetTcService.php @@ -4,6 +4,7 @@ namespace app\services\bet; use app\models\bet\Bet; +use app\utils\Logger; use freedom\utils\SocketSession; /** @@ -50,6 +51,7 @@ class ToBetTcService $time = time(); $toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data); if ($toBetCheck['status'] == false){ + Logger::warn(Logger::CAT_BET, 'tc_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); SocketSession::resetRepeat($fd,'user','isToBet'); return; @@ -182,9 +184,11 @@ class ToBetTcService $res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0); if($res){ + Logger::info(Logger::CAT_BET, 'tc_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']); // 待确定是否推送即时彩池,现不推送 }else{ + Logger::warn(Logger::CAT_BET, 'tc_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']); } SocketSession::resetRepeat($fd,'user','isToBet'); diff --git a/app/services/bet/ToBetToningService.php b/app/services/bet/ToBetToningService.php index e718612..e6263f1 100644 --- a/app/services/bet/ToBetToningService.php +++ b/app/services/bet/ToBetToningService.php @@ -4,6 +4,7 @@ namespace app\services\bet; use app\models\bet\Bet; +use app\utils\Logger; use freedom\utils\SocketSession; /** @@ -36,6 +37,7 @@ class ToBetToningService $time = time(); $toBetCheck = ToBetCommonService::toBetCheck($tableInfo,$event,$data); if ($toBetCheck['status'] == false){ + Logger::warn(Logger::CAT_BET, 'toning_bet_fail', ['table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => $toBetCheck['msg']]); SocketSession::resetRepeat($fd,'user','isToBet'); return; @@ -89,6 +91,7 @@ class ToBetToningService $res = Bet::toBet($tableInfo,$userInfo,$numberTabInfo,$prevBetInfo,$data,$seat_num,$betTotalAmount,$time,0); $numberTabAmount = string_to_array($numberTabInfo['toning_amount']); if($res){ + Logger::info(Logger::CAT_BET, 'toning_bet_success', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => true, 'table_id' => $tableInfo['id'], 'bet_amount_msg' => $betTotalAmount, 'money' => ($userInfo['money'] - $amount),'seat_num' => $seat_num, 'msg' => 'to_bet_success']); $round = array( 'toning_zero' => isset($numberTabAmount['toning_zero']) ? intval($numberTabAmount['toning_zero'] + $data['toning_zero']) : $data['toning_zero'], @@ -113,6 +116,7 @@ class ToBetToningService ); $ws->to(SocketSession::HOUSE_NAME)->emit('allBetAmount',['status' => true, 'table_id' => $tableInfo['id'], 'round' => $round]); }else{ + Logger::warn(Logger::CAT_BET, 'toning_bet_db_fail', ['user_id' => $userInfo['id'], 'table_id' => $tableInfo['id'], 'amount' => $amount]); $ws->emit('toBet',['status' => false, 'table_id' => $tableInfo['id'], 'msg' => 'to_bet_fail']); } SocketSession::resetRepeat($fd,'user','isToBet'); diff --git a/app/services/connect/InitTableService.php b/app/services/connect/InitTableService.php index 3775e12..60caf64 100644 --- a/app/services/connect/InitTableService.php +++ b/app/services/connect/InitTableService.php @@ -7,6 +7,7 @@ namespace app\services\connect; use app\models\process\Boot; use app\models\process\NumberTab; use app\models\process\Sumday; +use app\utils\Logger; /** * TODO 桌子状态服务 @@ -22,15 +23,24 @@ class InitTableService */ public static function initTable(array $tableInfo): array { - //查询日结 $lastSumday = Sumday::getByTableIdOrderByIdDesc($tableInfo); - if (!$lastSumday) $lastSumday = Sumday::addByTable($tableInfo); - //查询靴 + if (!$lastSumday) { + $lastSumday = Sumday::addByTable($tableInfo); + Logger::info(Logger::CAT_GAME, 'init_create_sumday', ['table_id' => $tableInfo['id']]); + } $lastBoot = Boot::getByTableIdOrderByIdDesc($tableInfo); - if (!$lastBoot) $lastBoot = Boot::addBySumday($lastSumday); - //查询铺 + if (!$lastBoot) { + $lastBoot = Boot::addBySumday($lastSumday); + Logger::info(Logger::CAT_GAME, 'init_create_boot', ['table_id' => $tableInfo['id'], 'sumday_id' => $lastSumday['id'] ?? '']); + } $lastNumberTab = NumberTab::getByBootIdOrderByIdDesc($lastBoot); - if (!$lastNumberTab) $lastNumberTab = NumberTab::addByBoot($lastBoot); + if (!$lastNumberTab) { + $lastNumberTab = NumberTab::addByBoot($lastBoot); + Logger::info(Logger::CAT_GAME, 'init_create_number_tab', ['table_id' => $tableInfo['id'], 'boot_id' => $lastBoot['id'] ?? '']); + } + if (!$lastNumberTab) { + Logger::error(Logger::CAT_GAME, 'init_table_fail', ['table_id' => $tableInfo['id'], 'table_name' => $tableInfo['table_name'] ?? '']); + } return $lastNumberTab; } diff --git a/log_cleanup.sh b/log_cleanup.sh new file mode 100644 index 0000000..c2df15a --- /dev/null +++ b/log_cleanup.sh @@ -0,0 +1,6 @@ +#!/bin/bash +# OG 日志清理 - 删除30天前的日志文件 +LOG_DIR="/www/wwwroot/Socket/runtime/log" +find "$LOG_DIR" -name "*.log" -type f -mtime +30 -delete 2>/dev/null +find "$LOG_DIR" -type d -empty -delete 2>/dev/null +echo "[$(date)] log cleanup done, current size: $(du -sh $LOG_DIR | cut -f1)" diff --git a/logview.sh b/logview.sh new file mode 100755 index 0000000..3555efa --- /dev/null +++ b/logview.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# OG 日志快速查看工具 +# 用法: ./logview.sh [分类] [选项] +# 分类: frontend | game | connect | bet | error | all +# 选项: -f 实时跟踪 | -t N 查看最后N行 | -g "关键词" 搜索 +# +# 示例: +# ./logview.sh frontend # 查看今天的前端错误 +# ./logview.sh game -f # 实时跟踪游戏事件 +# ./logview.sh game -g "table_id.*12" # 搜索805牛牛台 +# ./logview.sh connect -t 50 # 最近50条连接日志 +# ./logview.sh all -g "WARN\|ERROR" # 所有分类的警告和错误 +# ./logview.sh frontend -d 2026-05-13 # 查看指定日期 + +LOG_DIR="/www/wwwroot/Socket/runtime/log" +DATE=$(date +%Y-%m-%d) +CATEGORY=${1:-all} +shift 2>/dev/null + +MODE="tail" +LINES=30 +GREP="" +CUSTOM_DATE="" + +while [[ $# -gt 0 ]]; do + case $1 in + -f) MODE="follow"; shift ;; + -t) LINES=$2; shift 2 ;; + -g) GREP=$2; shift 2 ;; + -d) CUSTOM_DATE=$2; shift 2 ;; + *) shift ;; + esac +done + +[[ -n "$CUSTOM_DATE" ]] && DATE=$CUSTOM_DATE + +if [[ "$CATEGORY" == "all" ]]; then + CATS="frontend game connect bet error" +else + CATS=$CATEGORY +fi + +for cat in $CATS; do + FILE="$LOG_DIR/$cat/$DATE.log" + if [[ ! -f "$FILE" ]]; then + echo "[$cat] 无日志: $FILE" + continue + fi + + if [[ "$MODE" == "follow" ]]; then + echo "=== 实时跟踪 $cat ===" + tail -f "$FILE" + exit 0 + fi + + echo "=== $cat ($DATE) ===" + if [[ -n "$GREP" ]]; then + grep -i "$GREP" "$FILE" | tail -$LINES + else + tail -$LINES "$FILE" + fi + echo +done diff --git a/public/static/handle/js/error-report.js b/public/static/handle/js/error-report.js index 0a3998b..de717df 100644 --- a/public/static/handle/js/error-report.js +++ b/public/static/handle/js/error-report.js @@ -2,9 +2,24 @@ var reportUrl = '/log/report'; var queue = []; var sending = false; + var ignorePatterns = [ + 'play() request was interrupted', + 'The play() request was interrupted', + 'NotAllowedError', + 'AbortError' + ]; + + function shouldIgnore(msg) { + if (!msg) return false; + for (var i = 0; i < ignorePatterns.length; i++) { + if (msg.indexOf(ignorePatterns[i]) !== -1) return true; + } + return false; + } function send(data) { if (queue.length >= 10) return; + if (shouldIgnore(data.message)) return; data.source = 'handle'; data.time = new Date().toISOString(); data.url = location.href;