|
本人喜欢看日志,可能经常开发服务器的原因,日志对于生产环境尤为重要,不要还停留在vardump
最近工作不是很忙,闲着就想弄下自己的网站,下面是搭建Ci4遇到的一些问题
1,原来web路径需要指到public目录下.
2,生产环境配置(默认环境)app/Config/Boot/production.php 页面显示错误信息
ini_set('display_errors', '1'); #1为显示,0为不显示。如果你的日志还未生效,但是又找不到错误原因,可以使用此方法,他会把错误显示到页面,但生产环境肯定是要关的,所以日志要弄出来
3,缓存日志目录需要给读写权限,日志目录就在这下面writable/logs
chown apache.apache -R writable //我的环境是apache用户调用的php
4,日志打印的时间有问题,时区不对 app/Config/App.php这个文件中
public $appTimezone = PRC; //设置中国时区
现在日志看着正常,其实还是挺难看,比起ci3 ci2差多了,可能是作者懒
我需要的日志是能显示我调用日志的函数还有行号,显然Ci4作者没弄,不能忍,改了,先给你们看看效果
代码:
10 public function file_list(){
15 log_message("debug","测试打印");
16 }
日志:
INFO - 10:59:23,Controller "App\Controllers\Files" loaded.
DEBUG - 10:59:23,file_list:15 --> 测试打印
现在很直观,file_list这个函数 15行打印了“测试打印”,上面的这个时间(10:59:23)可以设置 app/Config/Logger.php ,public $dateFormat = 'H:i:s';
改动很小,源码(./system/Common.php),作者好像留一个重写函数的文件(./app/Common.php),可以把你要重写的函数放里面,我没去弄,直接改了
697 function log_message(string $level, string $message, array $context = [])
698 {
699 // When running tests, we want to always ensure that the
700 // TestLogger is running, which provides utilities for
701 // for asserting that logs were called in the test code.
702 $debug_info = debug_backtrace();
703 $func = $debug_info[1]["function"];
704 $line = $debug_info[0]["line"];
705 if (ENVIRONMENT === 'testing')
706 {
707 $logger = new TestLogger(new Logger());
708
709 return $logger->log($level, $func.":".$line." --> ".$message, $context);
710 }
711
712 // @codeCoverageIgnoreStart
713 return Services::logger(true)
714 ->log($level, $func.":".$line." --> ".$message, $context);
715 // @codeCoverageIgnoreEnd
716 }
顺眼很多了,又码了一会代码
10 public function file_list(){
11 //$cache = \Config\Services::cache();
12 //$a = $cache->save('a',"1111");
13 //$a = $cache->get('a');
14 //log_message("debug","a = ".$a);
15 log_message("debug","测试打印");
16 $file = $this->request->getPost("file");
17 $id = $this->request->getPost("id");
18 $files_model = new FilesModel();
19 $list["id"] = $id;
20 $list["list"] = [];
21 $files_model->scan_dir("/home/ycx/coffer".$file,$list["list"],$file);
22 echo json_encode($list);
23 s}
开始调试,报错,
CRITICAL - 11:14:40,exceptionHandler:153 --> syntax error, unexpected '}'
#0 /home/ycx/web/ycxwoo/api/system/Router/Router.php(192): CodeIgniter\Router\Router->autoRoute()
#1 /home/ycx/web/ycxwoo/api/system/CodeIgniter.php(785): CodeIgniter\Router\Router->handle()
#2 /home/ycx/web/ycxwoo/api/system/CodeIgniter.php(358): CodeIgniter\CodeIgniter->tryToRouteIt()
#3 /home/ycx/web/ycxwoo/api/system/CodeIgniter.php(306): CodeIgniter\CodeIgniter->handleRequest()
#4 /home/ycx/web/ycxwoo/api/public/index.php(45): CodeIgniter\CodeIgniter->run()
#5 {main}
完全看不出来哪里错了,只知道 } 附近有问题,如果有几千行代码,一二十个文件我还不找疯,不能忍,改了
日志看出exceptionHandler这个函数 153 行调用了log_message打印日志
143 public function exceptionHandler(Throwable $exception)
144 {
145 $codes = $this->determineCodes($exception);
146 $statusCode = $codes[0];
147 $exitCode = $codes[1];
148
149 // Log it
150 if ($this->config->log === true && ! in_array($statusCode, $this->config->ignoreCodes))
151 {
152 log_message('critical',$exception->getMessage() . "\n{trace}", [
153 'trace' => $exception->getTraceAsString(),
154 ]);
155 }
这玩意$exception->getMessage()应该就是错误消息了,百度这个类型Throwable,
Throwable {
/* Methods */
abstract public getMessage ( void ) : string
abstract public getCode ( void ) : int
abstract public getFile ( void ) : string
abstract public getLine ( void ) : int
abstract public getTrace ( void ) : array
abstract public getTraceAsString ( void ) : string
abstract public getPrevious ( void ) : Throwable
abstract public __toString ( void ) : string
}
这不是有文件名和行号吗,作者就是懒 getFile ( void ) ,getLine ( void ) ,改了
143 public function exceptionHandler(Throwable $exception)
144 {
145 $codes = $this->determineCodes($exception);
146 $statusCode = $codes[0];
147 $exitCode = $codes[1];
148
149 // Log it
150 if ($this->config->log === true && ! in_array($statusCode, $this->config->ignoreCodes))
151 {
152 log_message('critical', $exception->getFile().":".$exception->getLine()." --> ".$exception->getMessage() . "\n{trace}", [
153 'trace' => $exception->getTraceAsString(),
154 ]);
155 }
再调试下
CRITICAL - 11:24:58,exceptionHandler:153 --> /home/ycx/app/Controllers/Files.php:23 --> syntax error, unexpected '}'
#0 /home/ycx/web/ycxwoo/api/system/Router/Router.php(192): CodeIgniter\Router\Router->autoRoute()
#1 /home/ycx/web/ycxwoo/api/system/CodeIgniter.php(785): CodeIgniter\Router\Router->handle()
#2 /home/ycx/web/ycxwoo/api/system/CodeIgniter.php(358): CodeIgniter\CodeIgniter->tryToRouteIt()
#3 /home/ycx/web/ycxwoo/api/system/CodeIgniter.php(306): CodeIgniter\CodeIgniter->handleRequest()
#4 /home/ycx/web/ycxwoo/api/public/index.php(45): CodeIgniter\CodeIgniter->run()
#5 {main}
不错,我很满意。
献给那些不会调试错误和看日志的朋友
|
|