成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > tp5框架使用composer實(shí)現(xiàn)日志記錄功能示例

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

熱門標(biāo)簽:兼職做地圖標(biāo)注好賺錢嗎 蘇州外呼系統(tǒng)有效果嗎 亳州企業(yè)外呼系統(tǒng) 400 電話 辦理 地圖標(biāo)注怎么做商戶驗(yàn)證 智能電銷語(yǔ)音機(jī)器人資訊 海南外呼系統(tǒng)方案 打開(kāi)百度地圖標(biāo)注 山東電銷卡外呼系統(tǒng)原理是什么

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

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

1.安裝 psr/log

composer require psr/log

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

我們可以來(lái)細(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());
}

這是一套日志正常的接口,有層級(jí),有消息,有具體的內(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';
}

定義一些錯(cuò)誤常量。

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

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

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

我創(chuàng)建了一個(gè)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 = "出錯(cuò)啦",$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的典型案例,定義接口,定義抽象類,定義具體類。

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

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

有了這個(gè)日志小工具,平時(shí)接口的一些報(bào)錯(cuò)信息就能很好的捕捉了!

只要

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é)》。

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

您可能感興趣的文章:
  • Laravel框架中composer自動(dòng)加載的實(shí)現(xiàn)分析
  • PHP管理依賴(dependency)關(guān)系工具 Composer的自動(dòng)加載(autoload)
  • Laravel 解決composer相關(guān)操作提示php相關(guān)異常的問(wèn)題
  • laravel 實(shí)現(xiàn)向公共模板中傳值 (view composer)
  • 淺談laravel 5.6 安裝 windows上使用composer的安裝過(guò)程
  • 使用composer 安裝 laravel框架的方法圖文詳解
  • 一次因composer錯(cuò)誤使用引發(fā)的問(wèn)題與解決
  • windows環(huán)境下使用Composer安裝ThinkPHP5
  • PHP創(chuàng)建自己的Composer包方法
  • 分析Composer實(shí)現(xiàn)自動(dòng)加載原理

標(biāo)簽:安康 溫州 萊蕪 金華 呼倫貝爾 綏化 清遠(yuǎn) 紹興

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《tp5框架使用composer實(shí)現(xiàn)日志記錄功能示例》,本文關(guān)鍵詞  tp5,框架,使用,composer,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《tp5框架使用composer實(shí)現(xiàn)日志記錄功能示例》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于tp5框架使用composer實(shí)現(xiàn)日志記錄功能示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    色偷偷久久人人79超碰人人澡| 亚洲免费人成在线视频观看| 55夜色66夜色国产精品视频| 五月天丁香综合久久国产| 亚洲第一页在线观看| 久久99精品国产一区二区三区| 国产在线观看一区| 一卡二卡三卡亚洲| 人偷久久久久久久偷女厕| 中文在线天堂网| 欧美综合一区| 国产激情偷乱视频一区二区三区| 国产一区欧美| 欧美影院一区二区| 日韩精品一区二区三区高清免费| 亚洲AV无码成人片在线观看| 亚洲精品国产福利| 亚洲欧美国产高清| 一级黄色免费毛片| 久久在线精品视频| 国产精品视频色| 都市激情在线视频| 国精品无码一区二区三区| 精品偷拍一区二区三区在线看| 中文幕一区二区三区久久蜜桃| 26uuuu精品一区二区| 欧美日韩免费高清一区色橹橹| 99精品视频免费在线观看| 朝桐光av在线| 久久久久久黄色| 国产成人精品www牛牛影视| 精品176极品一区| 日韩精品一区不卡| 爱情岛论坛亚洲品质自拍视频网站| 日韩a一级欧美一级| 毛片网站在线免费观看| 草莓视频一区| 国产主播一区| 精品一区二区三区不卡| 奇米影视777在线欧美电影观看| 久久99亚洲热视| 在线观看免费播放网址成人| 亚洲成人一区在线| 亚洲一区二区三区久久久| 成人小视频免费看| 欧美高清无遮挡| 久久久久国产一区| 四虎网站在线观看| 欧美激情手机在线视频| 毛片不卡一区二区| 福利片在线看| 亚洲mm色国产网站| 韩国美女久久| 亚洲精品99| 欧美日韩综合网| 亚洲成人网在线观看| 色777狠狠狠综合伊人| 麻豆久久久9性大片| 懂色av中文一区二区三区天美| 69日本xxxxxxxxx49| 久久www人成免费看片中文| 中国china体内裑精亚洲片| 激情综合中文娱乐网| 8x8x最新地址| 手机看片1024日韩| 第一区免费在线观看| 国产91|九色| 国产伦视频一区二区三区| 最近中文字幕在线6| 曰韩精品一区二区| 91超碰caoporn97人人| av大片免费在线观看| 欧美jizz18hd性欧美| 污污视频在线免费观看| 午夜偷拍福利视频| 国产精品久久久久久久一区探花| 欧美一区二区高清在线观看| 91网站免费观看| 裸体一区二区三区| 欧美1—12sexvideos| 成人黄色777网| 亚洲一区二区免费在线| 欧美另类高清视频在线| 国产精品腿扒开做爽爽爽挤奶网站| 91福利国产在线观看菠萝蜜| 久久理论电影| 婷婷免费在线观看| 国产精品大尺度| 国产精品99久久| 嫩模私拍啪啪| 精品日韩欧美在线| 中文字幕中文在线不卡住| 欧美不卡1区2区3区| 91免费版网站在线观看| 中文字幕av久久爽| 免费不卡av在线| 最近2019中文字幕大全第二页| 久久久成人影院| 伊人成人开心激情综合网| 色爽爽爽爽爽爽爽爽| 国产精品久久久久无码av色戒| 美女的诞生在线观看高清免费完整版中文| asian性开放少妇pics| 福利一区福利二区| 亚洲综合网狠久久| 大地资源第二页在线观看高清版| 91原创在线视频| 99精品在线观看视频| 国产专区一区二区| 国产原创精品| 九色国产在线观看| 国产精品久久久久久久久免费丝袜| 久久精品一区二区三区四区五区| 97av视频在线| 青娱乐免费在线视频| 日本高清www| 久久国产天堂福利天堂| 男女污污视频在线观看| 日本一区二区三区四区在线视频| 狠狠色一日本高清视频| 国产精品1024久久| 老司机深夜福利在线观看| 亚洲三级电影全部在线观看高清| 亚洲日本视频| 亚洲国产精品欧美一二99| 亚洲美女精品久久| 亚洲精品午夜在线观看| 中国字幕a在线看韩国电影| 亚洲精品免费av| 91欧美极品| 国产自产自拍视频在线观看| 色诱亚洲精品久久久久久| 日韩欧美亚洲另类| 欧美极品少妇全裸体| 中文字幕在线观看第二页| 一区二区国产在线观看| 日本一区二区在线观看视频| 99视频网站| 国产午夜福利精品| 国产精品人成电影| 色图欧美色图| 亚洲国产欧美日本视频| 91精选在线观看| 成熟亚洲日本毛茸茸凸凹| 视频一区二区三区入口| 成人高潮成人免费观看| 亚洲日本在线播放| 风间由美一二三区av片| 99视频在线免费观看| 91片黄在线观看喷潮| 五月婷婷丁香色| 中文字幕一区二区三区蜜月| 婷婷色中文字幕| 福利在线一区| 中文字幕电影在线| 国产精品视频第一区二区三区| 91精品国产色综合久久不卡98口| 伊人久久在线| 超碰在线观看免费| 欧美日韩性生活视频| 干b视频在线观看| 日韩视频免费观看高清| 伊人蜜桃色噜噜激情综合| 国产视频一区二区不卡| 91pony九色| 中日韩一区二区三区| 九九久久免费视频| 免费在线观看的毛片| 欧洲美女7788成人免费视频| 日韩一区二区三区中文字幕| 台湾亚洲精品一区二区tv| 国产主播精品在线| 四川一级毛毛片| 全色精品综合影院| 亚洲天天做日日做天天谢日日欢| ●精品国产综合乱码久久久久| 国产精品久久久久久免费观看| 成人夜晚看av| 欧美wwwsss9999| 国产一区二区在线观| 久久中文字幕无码| 免费成人结看片| 国产富婆一级全黄大片| 一区二区三区在线视频看| 日韩一区在线免费观看| 手机在线免费观看av| 一个人看的www日本高清视频| 日韩精品一区二区三区在线| 超级白嫩亚洲国产第一| 一区二区三区欧美成人| 精品久久久久久中文字幕| 人人妻人人澡人人爽人人精品| 激情视频在线观看免费| 欧美一区二区三区成人| 熟女人妇 成熟妇女系列视频| 妖精一区二区三区精品视频| 国产亚洲精品免费| 国产又粗又猛又爽| 亚洲乱亚洲乱妇| 日韩专区精品| 神马午夜伦理不卡| 在线中文字幕视频观看| 夜夜嗨av一区二区三区网页| 成人免费在线观看视频网站| 国产精品久久久久久一区二区| 日韩精品在线观看免费| 一本色道69色精品综合久久| 国内精品自线一区二区三区视频| 日韩成人av网址| 一区二区成人免费视频| www.亚洲人.com| 日本视频一区二区| 国精品人伦一区二区三区蜜桃| 欧美极品jizzhd欧美18| 欧美独立站高清久久| www.亚洲激情.com| 成人美女视频| 亚洲一区视频| 欧美色网址大全| 中日韩一级黄色片| 欧美××××黑人××性爽| 一级黄色录像视频| 92精品国产成人观看免费| 91农村精品一区二区在线| 天堂av在线| 欧美成人黄色小视频| 国产精品亚洲美女av网站| 久久久久久久久99| 中文字幕亚洲色图| 国产伦理久久久| 黄视频在线播放| 国产精品久久久久久久天堂| ,亚洲人成毛片在线播放| 国产精品熟妇一区二区三区四区| 香港久久久电影| 激情综合丁香五月| 蜜臀久久99精品久久久久久| 亚洲传媒在线| 亚洲自拍欧美另类| 欧美视频日韩视频| 国产欧美一区二区精品久久久| 国产精品影音先锋| 欧美日韩五月天| 日本一区二区三区在线免费观看| 国产精品久在线观看| 欧美激情不卡| 色偷偷亚洲第一成人综合网址| 伊人久久大香伊蕉在人线观看热v| 欧美专区在线播放| 超碰在线免费播放| 女人18毛片九区毛片在线| 美女一区网站| 99综合精品| 国产91在线精品| 国产又粗又硬又长又爽| 国内在线高清免费视频| 欧美理论电影在线精品| 91视频在线免费观看| 蜜臀久久精品久久久久| 国产精品久久久亚洲一区| 亚洲精品欧洲精品| free性欧美69巨大| 欧美日韩一区二区三区69堂| 日韩久久免费视频| 日本三级网站在线观看| 亚洲一区二区在线观看视频| 综合136福利视频在线| 热re99久久国产精品| 国产视频亚洲色图| av大片免费观看| 亚洲精选一区二区| 制服丝袜国产精品| 欧美在线播放一区| 天堂网一区二区三区| 久久精品久久久久久国产 免费| 欧美在线影院在线视频| 激情五月播播久久久精品| 成年在线播放小视频| 欧美肉大捧一进一出免费视频| 性欧美lx╳lx╳| 五月婷婷丁香花| 国产欧美激情视频| 日韩欧中文字幕| 缅甸午夜性猛交xxxx| 五月婷婷导航| 玖玖爱在线精品视频| 老汉av免费一区二区三区| 亚洲欧美日韩国产综合在线| 蜜臀在线免费观看| 男人的j进女人的j一区| 国产尤物视频在线观看| 成人国产精选| 久久久999成人| 久久久久无码精品国产sm果冻| 一本久道久久综合中文字幕| 性xxxx搡xxxxx搡欧美| 欧美成人三级| 国产成人在线免费看| 国语自产精品视频在线看一大j8| 亚洲va久久久噜噜噜久久| 一广人看www在线观看免费视频| 天天天天天操| 国产福利一区在线观看| 国产999精品视频| 国产一级片大全| 国产成人激情视频| 精品福利视频一区二区三区| 国产一二三四五| 91欧美一区二区| 99在线观看免费| 亚洲先锋成人| 男操女在线观看| 国产一区二区四区| 久久久欧美精品sm网站| 一本久道中文无码字幕av| wwww在线观看| 亚洲 欧洲 日韩| 国产欧美日韩另类视频免费观看| 成人精品在线观看| 在线观看天堂av| 欧美va亚洲va日韩∨a综合色| 国产va免费精品高清在线| 中日韩美女免费视频网址在线观看| 欧美一区二区视频在线观看2020| 樱花在线免费观看| www.天堂av.com| 亚洲综合在线视频| 色婷婷综合久久久中文字幕|