做一下基本關(guān)于Monolog的基本介紹:
Monolog是基于PHP的日志類(lèi)庫(kù)。
介紹就到這,言歸正傳
安裝
安裝最新版本:(composer 還沒(méi)安裝的~:https://www.phpcomposer.com/)
composer require monolog/monolog
要求PHP版本為5.3以上。
以上都是百度都可以進(jìn)行搜索的廢話,這里咱們只是進(jìn)行復(fù)制并且再?gòu)U話一遍~
接下來(lái)的是重點(diǎn):
<?php
/**
* Created by PhpStorm.
* User: j
* Date: 2019-01-09
* Time: 15:33
*/
namespace common\log;
use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;
class Log
{
private static $loggers;
/**
* 日志默認(rèn)保存路徑
* @var string
*/
private static $fileName = '/data/logs/monolog/';
/**
* 日志留存時(shí)間
* @var int
*/
private static $maxFiles = 31;
/**
* 日志等級(jí)
* @var int
*/
private static $level = Logger::DEBUG;
/**
* 文件讀寫(xiě)權(quán)限分配
* 0666 保證log日志文件可以被其他用戶/進(jìn)程讀寫(xiě)
* @var int
*/
private static $filePermission = 0666;
/**
* monolog日志
* @param $name
* @param $arguments
* @return mixed
*/
public static function __callStatic($name, $arguments)
{
$logger = self::createLogger($name);
$message = empty($arguments[0]) ? '' : $arguments[0];
$context = empty($arguments[1]) ? [] : $arguments[1];
$levelName = empty($arguments[2]) ? $name : $arguments[2];
$backtraceOffset = empty($arguments[3]) ? 0 : intval($arguments[3]);
$level = Logger::toMonologLevel($levelName);
if (!is_int($level)) $level = Logger::INFO;
// $backtrace數(shù)組第$idx元素是當(dāng)前行,第$idx+1元素表示上一層,另外function、class需再往上取一個(gè)層次
// PHP7 不會(huì)包含'call_user_func'與'call_user_func_array',需減少一層
if (version_compare(PCRE_VERSION, '7.0.0', '>=')) {
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
$idx = 0 + $backtraceOffset;
} else {
$backtrace = debug_backtrace();
$idx = 1 + $backtraceOffset;
}
$trace = basename($backtrace[$idx]['file']) . ":" . $backtrace[$idx]['line'];
if (!empty($backtrace[$idx + 1]['function'])) {
$trace .= '##';
$trace .= $backtrace[$idx + 1]['function'];
}
$message = sprintf('==> LOG: %s -- %s', $message, $trace);
return $logger->addRecord($level, $message, $context);
}
/**
* 創(chuàng)建日志
* @param $name
* @return mixed
*/
private static function createLogger($name)
{
if (empty(self::$loggers[$name])) {
// 根據(jù)業(yè)務(wù)域名與方法名進(jìn)行日志名稱(chēng)的確定
$category = $_SERVER['SERVER_NAME'];
// 日志文件目錄
$fileName = self::$fileName;
// 日志保存時(shí)間
$maxFiles = self::$maxFiles;
// 日志等級(jí)
$level = self::$level;
// 權(quán)限
$filePermission = self::$filePermission;
// 創(chuàng)建日志
$logger = new Logger($category);
// 日志文件相關(guān)操作
$handler = new RotatingFileHandler("{$fileName}{$name}.log", $maxFiles, $level, true, $filePermission);
// 日志格式
$formatter = new LineFormatter("%datetime% %channel%:%level_name% %message% %context% %extra%\n", "Y-m-d H:i:s", false, true);
$handler->setFormatter($formatter);
$logger->pushHandler($handler);
self::$loggers[$name] = $logger;
}
return self::$loggers[$name];
}
}
只要把該文件放在項(xiàng)目的目錄下,并且保證項(xiàng)目的路由沒(méi)問(wèn)題的時(shí)候,你就可以打印日志了。
打印有多簡(jiǎn)單呢,一行即可,還是可以隨著你的自定義命名,進(jìn)行服務(wù)器上的對(duì)應(yīng)文件寫(xiě)入~
/**
* 如何使用log日志
*/
public function actionUseLog()
{
// Log是靜態(tài)方法 引入use common\log\Log;即可以調(diào)用
// info是寫(xiě)入的方法名稱(chēng),這里可以自定義,可以是任何文件名稱(chēng),這里如果寫(xiě)入info 服務(wù)器看到的就是帶 info-2019-01-01.log 的文件
// 就是這么簡(jiǎn)單
// 使用的時(shí)候在服務(wù)器新建/data/logs/monolog/ 路徑的文件夾,并且給與0666以上讀寫(xiě)權(quán)限即可
Log::info('第一個(gè)字段是內(nèi)容',['KEY'=>'VALUE']);
}