diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 7db9e07..1be2620 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -34,6 +34,7 @@ class Handler extends ExceptionHandler */ public function report(Exception $e) { + \LogReport::write(\LogReport::anlyError($e->getMessage() , $e->getFile(), $e->getLine())); return parent::report($e); } diff --git a/app/Http/Controllers/OrderController.php b/app/Http/Controllers/OrderController.php index f22d652..47cfed8 100644 --- a/app/Http/Controllers/OrderController.php +++ b/app/Http/Controllers/OrderController.php @@ -10,6 +10,7 @@ use Cookie; use App\Http\Page; use App\Http\Controllers\PermController; use Illuminate\Support\Facades\Redis; +use App\Http\Error; function CheckActive($menus, &$arr, $url) { @@ -664,6 +665,7 @@ Class OrderController extends Controller $xlslist = exportExcel($xlsName, $xlsCell, $export); $this->$xlslist; } else { + errorLog(Error::E_NOT_EXISTS, '数据为空无法导出'); return redirect('/prompt')->with(['message'=>"数据为空无法导出!",'url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3,'status'=>false]); } } @@ -794,7 +796,10 @@ Class OrderController extends Controller $log['create_time'] = time(); $actionLog = DB::connection('order')->table('lie_order_action_log')->insert($log); - if (!$actionLog) return ['errcode'=>-1, 'errmsg'=>'添加操作记录失败']; + if (!$actionLog){ + errorLog(Error::E_ADD_FAILED, '添加操作记录失败'); + return ['errcode'=>Error::E_ADD_FAILED, 'errmsg'=>'添加操作记录失败']; + } $apiUrl = Config('website.api_domain'); $k1 = time(); @@ -861,7 +866,8 @@ Class OrderController extends Controller } if(!$collert['reason']){ - return array('errcode'=>101,'errmsg'=>'请填写删除原因'); + errorLog(Error::E_NOT_EXISTS, '请填写删除原因'); + return array('errcode'=>Error::E_NOT_EXISTS,'errmsg'=>'请填写删除原因'); } $url = Config('website.api_domain').'order/deleteGoods'; @@ -890,7 +896,8 @@ Class OrderController extends Controller $order_id = $request->input('order_id', ''); if (!$order_id) { - return array('errcode'=>1, 'errmsg'=>'订单参数有误!'); + errorLog(Error::E_PARAM, '订单参数有误'); + return array('errcode'=>Error::E_PARAM, 'errmsg'=>'订单参数有误!'); } // $order_info = DB::connection('order')->table('lie_order')->where('order_id', $order_id)->first(); @@ -953,7 +960,10 @@ Class OrderController extends Controller // 调价失败临时表状态更改 $order_temp = DB::connection('order')->table('lie_order_extend')->where(['order_id' => $order_id])->update(['status' => -1]); - if (!$order_temp) return array('errcode'=>-1, 'errmsg'=>'驳回失败'); + if (!$order_temp) { + errorLog(Error::E_UPDATE_FAILED, '驳回失败'); + return array('errcode'=>Error::E_UPDATE_FAILED, 'errmsg'=>'驳回失败'); + } // 操作记录 $log['order_id'] = $order_id; @@ -976,8 +986,10 @@ Class OrderController extends Controller $sale_id = $request->input('sale_id', ''); $operator_id = $request->user->userId; - if (empty($order_id) || empty($sale_id)) - return array('errcode'=>10003, 'errmsg'=>'参数不存在'); + if (empty($order_id) || empty($sale_id)) { + errorLog(Error::E_NOT_EXISTS, '参数不存在'); + return array('errcode'=>Error::E_NOT_EXISTS, 'errmsg'=>'参数不存在'); + } $url = Config('website.api_domain').'order/sendSales'; @@ -1039,6 +1051,7 @@ Class OrderController extends Controller //总共允许2次调价(以点击审核按钮次数来统计) if ($info['order_info']['adjust_count'] >= 2) { + errorLog(Error::E_FORBIDDEN, '该订单无法再进行调价操作'); return redirect('/prompt')->with(['message'=>"该订单无法再进行调价操作",'url' =>'/details/'.$id, 'jumpTime'=>3,'status'=>false]); } @@ -1050,6 +1063,7 @@ Class OrderController extends Controller $update = DB::connection('order')->table('lie_order')->where('order_id', $id)->update($data); if (!$update) { + errorLog(Error::E_UPDATE_FAILED, '调价操作更新数据失败'); return redirect('/prompt')->with(['message'=>"调价操作更新数据失败!",'url' =>'/details/'.$id, 'jumpTime'=>3,'status'=>false]); } @@ -1263,11 +1277,13 @@ Class OrderController extends Controller $operator_id = $request->user->userId; if (!$order_id) { - return array('errcode'=>-1,'errmsg'=>'订单不存在~'); + errorLog(Error::E_NOT_EXISTS, '订单不存在'); + return array('errcode'=>Error::E_NOT_EXISTS,'errmsg'=>'订单不存在~'); } if (!$cancel_reason) { - return array('errcode'=>-1,'errmsg'=>'取消订单的原因不可为空~'); + errorLog(Error::E_NOT_EXISTS, '取消订单的原因不可为空'); + return array('errcode'=>Error::E_NOT_EXISTS,'errmsg'=>'取消订单的原因不可为空~'); } $url = Config('website.api_domain').'order/cancelPay'; @@ -1315,7 +1331,8 @@ Class OrderController extends Controller if ($temp['err_code'] == 0) { return array('errcode'=>0,'errmsg'=>'操作成功'); } else { - return array('errcode'=>-1,'errmsg'=>'操作失败'); + errorLog(Error::E_UPDATE_FAILED, '操作失败'); + return array('errcode'=>Error::E_UPDATE_FAILED,'errmsg'=>'操作失败'); } } else { $payLog['is_paid'] = 2; @@ -1331,10 +1348,12 @@ Class OrderController extends Controller // 订单待付款状态可操作对账 if ($info['order_info']['order_pay_type'] == 1) { // 全款 if (!in_array($info['order_info']['status'], array(2, 4))) { + errorLog(Error::E_FORBIDDEN, '订单无法操作'); return redirect('/prompt')->with(['message'=>'订单无法操作','url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3,'status'=>false]); } } else if ($info['order_info']['order_pay_type'] == 2) { // 预付款 if (!in_array($info['order_info']['status'], array(2, 3, 4))) { + errorLog(Error::E_FORBIDDEN, '订单无法操作'); return redirect('/prompt')->with(['message'=>'订单无法操作','url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3,'status'=>false]); } } @@ -1360,6 +1379,7 @@ Class OrderController extends Controller if ($update['err_code'] == 0) { return array('errcode'=>0,'errmsg'=>'操作成功'); } else { + errorLog(Error::E_UPDATE_FAILED, '操作失败'); return array('errcode'=>-1,'errmsg'=>'操作失败'); } } @@ -1367,6 +1387,7 @@ Class OrderController extends Controller $info = $this->orderDetail($request, $id); if (!$info['order_address_info']) { + errorLog(Error::E_NOT_EXISTS, '订单地址不存在'); return redirect('/prompt')->with(['message'=>'订单地址不存在!', 'url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3, 'status'=>false]); } @@ -1394,6 +1415,7 @@ Class OrderController extends Controller if ($update['err_code'] == 0) { return array('errcode'=>0,'errmsg'=>'操作成功'); } else { + errorLog(Error::E_UPDATE_FAILED, '操作失败'); return array('errcode'=>-1,'errmsg'=>'操作失败'); } } @@ -1401,6 +1423,7 @@ Class OrderController extends Controller $info = $this->orderDetail($request, $id); if (!$info['order_invoice_info']) { + errorLog(Error::E_NOT_EXISTS, '发票不存在'); return redirect('/prompt')->with(['message'=>'发票不存在!','url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3,'status'=>false]); } @@ -1453,6 +1476,7 @@ Class OrderController extends Controller $operator_id = $request->user->userId; if (!$data['inv_shipping_no']) { + errorLog(Error::E_NOT_EXISTS, '发票物流单号不可为空'); return redirect('/prompt')->with(['message'=>'发票物流单号不可为空~','url' =>$_SERVER['HTTP_REFERER'], 'jumpTime'=>3,'status'=>false]); } @@ -1762,7 +1786,10 @@ Class OrderController extends Controller $delay_time = $request->input('delay_time', ''); } - if (empty($order_id) || empty($delay_time)) return ['errcode'=>10003, 'errmsg'=>'参数不存在']; + if (empty($order_id) || empty($delay_time)) { + errorLog(Error::E_NOT_EXISTS, '参数不存在'); + return ['errcode'=>Error::E_NOT_EXISTS, 'errmsg'=>'参数不存在']; + } $order = DB::connection('order')->table('lie_order')->where('order_id', '=', $order_id)->select('pay_time')->first(); @@ -1771,6 +1798,7 @@ Class OrderController extends Controller $update = DB::connection('order')->table('lie_order')->where('order_id', '=', $order_id)->update(['pay_time'=>$delay_time]); if (!$update) { + errorLog(Error::E_UPDATE_FAILED, '延长失败'); return ['errcode'=>0, 'errmsg'=>'延长失败']; } diff --git a/app/Http/Error.php b/app/Http/Error.php index 686207f..7c2e701 100644 --- a/app/Http/Error.php +++ b/app/Http/Error.php @@ -14,4 +14,7 @@ class Error const E_SERVER = -10008; // 服务错误 const E_NOT_EXISTS = -10009; // 不存在 const E_NO_ACCESS = -10010; // 无权访问 + + const E_ADD_FAILED = -10011; // 添加失败 + const E_UPDATE_FAILED = -10012; // 更新失败 }; diff --git a/app/Http/Function.php b/app/Http/Function.php index f58583c..398b936 100644 --- a/app/Http/Function.php +++ b/app/Http/Function.php @@ -183,3 +183,15 @@ return $ip[$type]; } + // 记录错误日志 + function errorLog($err_code, $err_msg) + { + $near_trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); + $backtrace = array_pop($near_trace); + + $file = !empty($near_trace[0]['file']) ? $near_trace[0]['file'] : ''; + $line = !empty($near_trace[0]['line']) ? $near_trace[0]['line'] : 0; + $method = !empty($backtrace['function']) ? $backtrace['function'] : ''; + + \LogReport::write(\LogReport::anlyError($err_msg, $file, $line, $err_code, $method)); + } \ No newline at end of file diff --git a/app/Http/Middleware/CheckLogin.php b/app/Http/Middleware/CheckLogin.php index d948dbe..75b09bd 100644 --- a/app/Http/Middleware/CheckLogin.php +++ b/app/Http/Middleware/CheckLogin.php @@ -28,8 +28,10 @@ class CheckLogin $login = Config::get('website.login'); if (!$userId || !$skey || (string)((int)$userId) != $userId || !preg_match('/^[a-zA-Z0-9]+$/', $skey)) { - if ($isApi) + if ($isApi) { + errorLog(Error::E_NOT_LOGIN, 'not login'); return Output::makeResult($request, Error::E_NOT_LOGIN, "not login"); + } return redirect($login['login'] . '?redirect=' . urlencode($request->url())); } @@ -43,8 +45,10 @@ class CheckLogin if ($rsp->getStatusCode() != 200) { Log::error("query {$login['check']} failed: code " . $rsp->getStatusCode()); - if ($isApi) + if ($isApi) { + errorLog(Error::E_SERVER, "login server error: status code = " . $rsp->getStatusCode()); return Output::makeResult($request, Error::E_SERVER, "login server error: status code = " . $rsp->getStatusCode()); + } abort(500); } @@ -71,6 +75,7 @@ class CheckLogin $access = json_decode($this->checkAccessApi($url, $data), true); if ($access['retcode'] != 0) { + errorLog(Error::E_NO_ACCESS, 'no access'); return view('no_access', ['bid'=>$access['data']['bid']]); // return Output::makeResult($request, Error::E_NO_ACCESS, 'You have not access to the Order System, please apply for the permission to PERM System!'); } diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php index 516a8cc..b270018 100644 --- a/bootstrap/autoload.php +++ b/bootstrap/autoload.php @@ -17,6 +17,7 @@ define('LARAVEL_START', microtime(true)); require __DIR__.'/../vendor/autoload.php'; require __DIR__.'/../app/Http/Function.php'; require __DIR__.'/../vendor/PHPExcel/PHPExcel.php'; +require __DIR__.'/../vendor/logreport/LogReport.php'; /* |-------------------------------------------------------------------------- diff --git a/vendor/logreport/LogReport.php b/vendor/logreport/LogReport.php new file mode 100644 index 0000000..61d02e9 --- /dev/null +++ b/vendor/logreport/LogReport.php @@ -0,0 +1,184 @@ +<?php +//日志目录位置 +defined('REPORT_LOG_PATH') or define('REPORT_LOG_PATH', dirname($_SERVER['DOCUMENT_ROOT']).'/storage/logs/LogReport/'); +//项目名 +defined('REPORT_APP_NAME') or define('REPORT_APP_NAME', 'order'); +//单日志文件大小限制 +defined('LOG_FILE_SIZE') or define('LOG_FILE_SIZE', 2097152); //2MB + +// 设定错误和异常处理 +error_reporting(0); + +LogReport::auto(); + +class LogReport +{ + static $handler = [ + 'finally_except' => ['Think\Think', 'appException'], + 'finally_error' => ['Think\Think', 'appError'], + ]; + + static $data = [ + 'msg' => '',// 错误信息 + 'msgCode' => '',// 自定义错误码 六位数字字符串 etc "100000" + 'ts' => '',// 10位整形 时间戳 + 'dateStr' => '',// 日期 2018-06-28 21:24:09 + 'app' => '',// 应用名称 + 'serverIp' => '',// 服务器ip + 'fileName' => '',// 文件名 + 'lineNo' => '',// 行数 + 'method' => '',// 函数名 + ]; + + /** + * 自动注册 + * @return [type] [description] + */ + static function auto() + { + if (defined('APP_PATH')) { + self::register(); + self::set(); + } else { + self::$handler = array_map(function($v){ + return []; + }, self::$handler); + } + } + + /** + * 注册致命错误 + * @return [type] [description] + */ + static function register() + { + register_shutdown_function('LogReport::fatalError'); + } + + /** + * 设置处理方法 + */ + static function set() + { + set_error_handler('LogReport::appError'); + set_exception_handler('LogReport::exception'); + } + + /** + * 错误数据格式 + * @param string|array $e 错误内容|'message','file','line','code','method' + * @param string $file 错误文件 + * @param string $line 错误行数 + * @param string $code 错误码 + * @param string $method 错误函数 + * @return [type] [description] + */ + static function anlyError($e, $file = null, $line = null, $code = null, $method = null) + { + if (!is_array($e)) { + $e = [ + 'message' => $e, + 'file' => !is_null($file) ? $file : '', + 'line' => !is_null($line) ? $line : '', + 'code' => !is_null($code) ? $code : '', + 'method' => !is_null($method) ? $method : '', + ]; + } + $data = self::$data; + $data['msg'] = !empty($e['message']) ? $e['message'] : ''; + $data['msgCode'] = str_pad($e['code'], 6, '0', STR_PAD_LEFT); + $data['ts'] = time(); + $data['dateStr'] = date('Y-m-d H:i:s'); + $data['app'] = REPORT_APP_NAME; + $data['serverIp'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0';; + $data['fileName'] = !empty($e['file']) ? $e['file'] : ''; + $data['lineNo'] = !empty($e['line']) ? $e['line'] : ''; + $data['method'] = !empty($e['method']) ? $e['method'] : ''; + return $data; + } + + /** + * 致命错误处理 + * @return [type] [description] + */ + static function fatalError() + { + if ($e = error_get_last()) { + switch ($e['type']) { + case E_ERROR: + case E_PARSE: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_USER_ERROR: + ob_end_clean(); + self::write(self::anlyError($e)); + break; + } + } + // exit(); + } + + /** + * 一般错误处理 + * @param [type] $errno [description] + * @param [type] $errstr [description] + * @param [type] $errfile [description] + * @param [type] $errline [description] + * @return [type] [description] + */ + static function appError($errno, $errstr, $errfile, $errline) + { + switch ($errno) { + case E_ERROR: + case E_PARSE: + case E_CORE_ERROR: + case E_COMPILE_ERROR: + case E_USER_ERROR: + self::write(self::anlyError($errstr , $errfile, $errline)); + break; + } + if (!empty(self::$handler['finally_error'])) { + call_user_func(self::$handler['finally_error'], $errno, $errstr, $errfile, $errline); + } + } + + /** + * 异常处理 + * @return [type] [description] + */ + static function exception($e) + { + self::write(self::anlyError($e->getMessage() , $e->getFile(), $e->getLine())); + if (!empty(self::$handler['finally_except'])) { + call_user_func(self::$handler['finally_except'], $e); + } + } + + /** + * 日志记录 + * @param string $log 日志内容 + * @return [type] [description] + */ + static function write($log) + { + if (is_array($log)) { + $log = json_encode($log); + } + if (empty($log)) { + return false; + } + + // 自动创建日志目录 + if (!is_dir(REPORT_LOG_PATH)) { + mkdir(REPORT_LOG_PATH, 0755, true); + } + $name = date('Ymd'); + $filename = REPORT_LOG_PATH.$name.'.log'; + //检测日志文件大小,超过配置大小则备份日志文件重新生成 + if (is_file($filename) && floor(LOG_FILE_SIZE) <= filesize($filename)) { + rename($filename, dirname($filename) . '/' . $name. '-' . time() . '.log'); + } + $log .= PHP_EOL; + return file_put_contents($filename, $log, FILE_APPEND); + } +} \ No newline at end of file