tp5框架使用composer实现日志记录功能示例
网络编程 2021-07-04 23:24www.168986.cn编程入门
这篇文章主要介绍了tp5框架使用poser实现日志记录功能,结合实例形式分析了thinkPHP5框架poser安装及日志记录相关操作技巧,需要的朋友可以参考下
本文实例讲述了tp5框架使用poser实现日志记录功能。分享给大家供大家参考,具体如下
tp5实现日志记录
1.安装 psr/log
poser require psr/log
它的作用就是提供一套接口,实现正常的日志功能!
我们可以来细细的分析一下,LoggerInterface.php
<?php namespace Psr\Log; / Describes a logger instance. The message MUST be a string or object implementing __toString(). The message MAY contain placeholders in the form: {foo} where foo will be replaced by the context data in key "foo". The context array can contain arbitrary data. The only assumption that can be made by implementors is that if an Exception instance is given to produce a stack trace, it MUST be in a key named "exception". See https://github./php-fig/fig-standards/blob/master/aepted/PSR-3-logger-interface.md for the full interface specification. / interface LoggerInterface { / System is unusable. @param string $message @param array $context @return void / public function emergency($message, array $context = array()); / Action must be taken immediately. Example: Entire website down, database unavailable, etc. This should trigger the SMS alerts and wake you up. @param string $message @param array $context @return void / public function alert($message, array $context = array()); / Critical conditions. Example: Application ponent unavailable, unexpected exception. @param string $message @param array $context @return void / public function critical($message, array $context = array()); / Runtime errors that do not require immediate action but should typically be logged and monitored. @param string $message @param array $context @return void / public function error($message, array $context = array()); / Exceptional ourrences that are not errors. Example: Use of deprecated APIs, poor use of an API, undesirable things that are not necessarily wrong. @param string $message @param array $context @return void / public function warning($message, array $context = array()); / Normal but significant events. @param string $message @param array $context @return void / public function notice($message, array $context = array()); / Interesting events. Example: User logs in, SQL logs. @param string $message @param array $context @return void / public function info($message, array $context = array()); / Detailed debug information. @param string $message @param array $context @return void / public function debug($message, array $context = array()); / Logs with an arbitrary level. @param mixed $level @param string $message @param array $context @return void / public function log($level, $message, array $context = array()); }
这是一套日志正常的接口,有层级,有消息,有具体的内容。
LogLevel.php
<?php namespace Psr\Log; / Describes log levels. / class LogLevel { const EMERGENCY = 'emergency'; const ALERT = 'alert'; const CRITICAL = 'critical'; const ERROR = 'error'; const WARNING = 'warning'; const NOTICE = 'notice'; const INFO = 'info'; const DEBUG = 'debug'; }
定义一些错误常量。
AbstractLogger.php实现接口
<?php namespace Psr\Log; / This is a simple Logger implementation that other Loggers can inherit from. It simply delegates all log-level-specific methods to the `log` method to reduce boilerplate code that a simple Logger that does the same thing with messages regardless of the error level has to implement. / abstract class AbstractLogger implements LoggerInterface { / System is unusable. @param string $message @param array $context @return void / public function emergency($message, array $context = array()) { $this->log(LogLevel::EMERGENCY, $message, $context); } / Action must be taken immediately. Example: Entire website down, database unavailable, etc. This should trigger the SMS alerts and wake you up. @param string $message @param array $context @return void / public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } / Critical conditions. Example: Application ponent unavailable, unexpected exception. @param string $message @param array $context @return void / public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } / Runtime errors that do not require immediate action but should typically be logged and monitored. @param string $message @param array $context @return void / public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } / Exceptional ourrences that are not errors. Example: Use of deprecated APIs, poor use of an API, undesirable things that are not necessarily wrong. @param string $message @param array $context @return void / public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } / Normal but significant events. @param string $message @param array $context @return void / public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } / Interesting events. Example: User logs in, SQL logs. @param string $message @param array $context @return void / public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } / Detailed debug information. @param string $message @param array $context @return void / public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } }
Logger.php继承AbstractLogger.php
<?php namespace Psr\Log; use app\index\model\LogModel; / This Logger can be used to avoid conditional log calls. Logging should always be optional, and if no logger is provided to your library creating a NullLogger instance to have something to throw logs at is a good way to avoid littering your code with `if ($this->logger) { }` blocks. / class Logger extends AbstractLogger { / Logs with an arbitrary level. @param mixed $level @param string $message @param array $context @return void / public function log($level, $message, array $context = array()) { // noop $logModel = new LogModel(); $logModel->add($level,$message,json_encode($context)); echo $logModel->id; } }
这里面的log方法是我自己写的!!!
我们需要把日志存储到数据库中!!!
这里我设计了一个log表,包含id、level、message、 context、ip、url、create_on等。
我创建了一个LogModel.php
<?php / @author: jim @date: 2017/11/16 / namespace app\index\model; use think\Model; / Class LogModel @package app\index\model 继承Model之后,就可以使用继承它的属性和方法 / class LogModel extends Model { protected $pk = 'id'; // 配置主键 protected $table = 'log'; // 默认的表名是log_model public function add($level = "error",$message = "出错啦",$context = "") { $this->data([ 'level' => $level, 'message' => $message, 'context' => $context, 'ip' => getIp(), 'url' => getUrl(), 'create_on' => date('Y-m-d H:i:s',time()) ]); $this->save(); return $this->id; } }
一切都准备好了,可以在控制器中使用了!
<?php namespace app\index\controller; use think\Controller; use Psr\Log\Logger; class Index extends Controller { public function index() { $logger = new Logger(); $context = array(); $context['err'] = "缺少参数id"; $logger->info("有新消息"); } public function _empty() { return "empty"; } }
小结
poser很好很强大!
这里是接口Interface的典型案例,定义接口,定义抽象类,定义具体类。
有了命名空间,可以很好的引用不同文件夹下的库!
互相使用,能够防止高内聚!即便是耦合也相对比较独立!
有了这个日志小工具,平时接口的一些报错信息就能很好的捕捉了!
只要
use Psr\Log\Logger;
然后
$logger = new Logger(); $logger->info("info信息");
使用非常方便!!!
附上获取ip、获取url的方法。
//获取用户真实IP function getIp() { if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) $ip = getenv("HTTP_CLIENT_IP"); else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown")) $ip = getenv("HTTP_X_FORWARDED_FOR"); else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) $ip = getenv("REMOTE_ADDR"); else if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown")) $ip = $_SERVER['REMOTE_ADDR']; else $ip = "unknown"; return ($ip); } // 获取url function getUrl() { return 'http://'.$_SERVER['SERVER_NAME'].':'.$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"]; }
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》、《》、《》及《》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程