最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

tp5框架使用composer實(shí)現(xiàn)日志記錄功能示例

 更新時間:2019年01月10日 09:27:45   作者:TBHacker  
這篇文章主要介紹了tp5框架使用composer實(shí)現(xiàn)日志記錄功能,結(jié)合實(shí)例形式分析了thinkPHP5框架composer安裝及日志記錄相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了tp5框架使用composer實(shí)現(xiàn)日志記錄功能。分享給大家供大家參考,具體如下:

tp5實(shí)現(xiàn)日志記錄

1.安裝 psr/log

composer require psr/log

它的作用就是提供一套接口,實(shí)現(xiàn)正常的日志功能!

我們可以來細(xì)細(xì)的分析一下,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());
}

這是一套日志正常的接口,有層級,有消息,有具體的內(nèi)容。

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實(shí)現(xiàn)接口

<?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方法是我自己寫的!??!

我們需要把日志存儲到數(shù)據(jù)庫中!??!

這里我設(shè)計了一個log表,包含id、level、message、 context、ip、url、create_on等。

我創(chuàng)建了一個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'; // 默認(rèn)的表名是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;
  }
}

一切都準(zhǔn)備好了,可以在控制器中使用了!

<?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'] = "缺少參數(shù)id";
    $logger->info("有新消息");
  }
  public function _empty() {
    return "empty";
  }
}

小結(jié):

composer很好很強(qiáng)大!

這里是接口Interface的典型案例,定義接口,定義抽象類,定義具體類。

有了命名空間,可以很好的引用不同文件夾下的庫!

互相使用,能夠防止高內(nèi)聚!即便是耦合也相對比較獨(dú)立!

有了這個日志小工具,平時接口的一些報錯信息就能很好的捕捉了!

只要

use Psr\Log\Logger;

然后

$logger = new Logger();
$logger->info("info信息");

使用非常方便?。?!

附上獲取ip、獲取url的方法。

//獲取用戶真實(shí)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"];
}

更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《ThinkPHP入門教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門教程》及《PHP模板技術(shù)總結(jié)》。

希望本文所述對大家基于ThinkPHP框架的PHP程序設(shè)計有所幫助。

相關(guān)文章

  • PHP實(shí)現(xiàn)Redis單據(jù)鎖以及防止并發(fā)重復(fù)寫入

    PHP實(shí)現(xiàn)Redis單據(jù)鎖以及防止并發(fā)重復(fù)寫入

    本篇文章給大家分享了PHP實(shí)現(xiàn)Redis單據(jù)鎖以及如何防止并發(fā)重復(fù)寫入的方法,對此有需要的朋友參考學(xué)習(xí)下。
    2018-04-04
  • YII2框架中ActiveDataProvider與GridView的配合使用操作示例

    YII2框架中ActiveDataProvider與GridView的配合使用操作示例

    這篇文章主要介紹了YII2框架中ActiveDataProvider與GridView的配合使用操作,結(jié)合實(shí)例形式分析了YII2框架中ActiveDataProvider與GridView的功能及配合使用相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2020-03-03
  • easyui的tabs update正確用法分享

    easyui的tabs update正確用法分享

    jQuery EasyUI是一組基于jQuery的UI插件集合,而jQuery EasyUI的目標(biāo)就是幫助web開發(fā)者更輕松的打造出功能豐富并且美觀的UI界面。下面說一下tabs update的正確用法
    2014-03-03
  • Symfony2框架創(chuàng)建項目與模板設(shè)置實(shí)例詳解

    Symfony2框架創(chuàng)建項目與模板設(shè)置實(shí)例詳解

    這篇文章主要介紹了Symfony2框架創(chuàng)建項目與模板設(shè)置的方法,結(jié)合實(shí)例形式詳細(xì)分析了Symfony2框架的具體步驟與詳細(xì)實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2016-03-03
  • Zend Framework教程之MVC框架的Controller用法分析

    Zend Framework教程之MVC框架的Controller用法分析

    這篇文章主要介紹了Zend Framework教程之MVC框架的Controller用法,簡單分析了MVC框架的基本結(jié)構(gòu)與Controller控制器的簡單使用方法,需要的朋友可以參考下
    2016-03-03
  • php 使用html5實(shí)現(xiàn)多文件上傳實(shí)例

    php 使用html5實(shí)現(xiàn)多文件上傳實(shí)例

    在html沒有出來之前,要實(shí)現(xiàn)php多文件上傳比較麻煩,需要在form表單里面添加多個input file域。html5發(fā)布以后,我們可以使用input file的html5屬性multiple來實(shí)現(xiàn)多文件上傳,需要的朋友可以參考下
    2016-10-10
  • thinkphp5使用無限極分類

    thinkphp5使用無限極分類

    這篇文章主要為大家詳細(xì)介紹了thinkphp5使用無限極分類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • PHP 根據(jù)key 給二維數(shù)組分組

    PHP 根據(jù)key 給二維數(shù)組分組

    這篇文章主要介紹了PHP 根據(jù)key 給二維數(shù)組分組的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • Smarty環(huán)境配置與使用入門教程

    Smarty環(huán)境配置與使用入門教程

    這篇文章主要介紹了Smarty環(huán)境配置與使用方法,較為詳細(xì)的分析了Smarty環(huán)境的搭建與配置參數(shù)的功能含義,非常簡單易懂,需要的朋友可以參考下
    2016-05-05
  • 如何在Laravel5.8中正確地應(yīng)用Repository設(shè)計模式

    如何在Laravel5.8中正確地應(yīng)用Repository設(shè)計模式

    這篇文章主要介紹了如何在Laravel5.8中正確地應(yīng)用Repository設(shè)計模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評論

黔西县| 元谋县| 张掖市| 洛扎县| 朝阳区| 独山县| 鹤山市| 留坝县| 鄂托克前旗| 阳朔县| 临城县| 静安区| 靖宇县| 镇江市| 平乡县| 金塔县| 房产| 巴里| 抚顺县| 延庆县| 永胜县| 玉环县| 侯马市| 莫力| 育儿| 博白县| 灯塔市| 桐梓县| 高青县| 深圳市| 淮阳县| 东乡县| 吉安县| 乌拉特前旗| 吐鲁番市| 桃园县| 广安市| 梅河口市| 仙居县| 庆元县| 泽普县|