当前位置: 移动技术网 > IT编程>开发语言>PHP > tp5框架使用composer实现日志记录功能示例

tp5框架使用composer实现日志记录功能示例

2019年05月29日  | 移动技术网IT编程  | 我要评论

鼻护士,飞马,海贼王漫画720

本文实例讲述了tp5框架使用composer实现日志记录功能。分享给大家供大家参考,具体如下:

tp5实现日志记录

1.安装 psr/log

composer 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.com/php-fig/fig-standards/blob/master/accepted/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 component 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 occurrences 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 component 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 occurrences 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";
  }
}

小结:

composer很好很强大!

这里是接口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入门教程》、《thinkphp模板操作技巧总结》、《thinkphp常用方法总结》、《codeigniter入门教程》、《ci(codeigniter)框架进阶教程》、《zend framework框架入门教程》及《php模板技术总结》。

希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网