您的位置:首页 > 编程语言 > PHP开发

laravel5日志设置篇(1) - 记录开始和结束日志

2017-10-19 23:27 330 查看

想要实现的功能

记录Application的开始和结束日志
- 开始日志: URL请求或命令行记录
- 结束日志: 处理时间和内存使用峰值记录

例如:

[2017-10-19 23:06:00] local.INFO: -- Startup {"command":"php artisan list"}
[2017-10-19 23:06:00] local.INFO: -- Shutdown {"time":"36.955[ms]","memory":"10[mb]"}
[2017-10-19 23:11:37] local.INFO: -- Startup {"method":"GET","uri":"/v1/stocks"}
[2017-10-19 23:11:37] local.INFO: -- Shutdown {"time":"21.765[ms]","memory":"4096[kb]"}

环境

php 7.0.22
laravel 5.1.*

具体实现

日志采集类编写
Kernel类的bootstrappers属性里添加日志采集类
日志采集类
app\Bootstrap\ApplicationLog.php
<?php

namespace App\Bootstrap;

use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\Facades\Log;

/**
* 获取include时的时间
*/
if (!defined('APP_START_TIME')) {
define('APP_START_TIME', microtime(true));
}

/**
* 日志采集类
*
* @package app.Bootstrap
*/
class ApplicationLog
{
/**
* 警告阈值: 内存100M
*/
const THRESHOLD_WARNING_MEMORY = 100;

/**
* The application instance.
*
* @var \Illuminate\Contracts\Foundation\Application
*/
protected $app;

/**
* Bootstrap the given application.
*
* @param  \Illuminate\Contracts\Foundation\Application $app
* @return void
*/
public function bootstrap(Application $app)
{
$this->app = $app;

// 当是测试时,不采集日志
if (!$app->environment('testing')) {
// 追加记录结束日志
register_shutdown_function([$this, 'handleShutdownLog']);

// 开始日志
$this->startupLog();
}
}

/**
* 开始日志
*/
public function startupLog()
{
if ($this->app->runningInConsole()) {
$command = sprintf('php %s', implode(' ', (array)array_get($GLOBALS, 'argv')));
$params = compact('command');
} else {
$method = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$params = compact('method', 'uri');
}
app('log')->info('-- Startup', $params);
}

/**
* 结束日志
*
* @return void
*/
public function handleShutdownLog()
{
$time = $this->getProcessingTime();
$memory = $this->getPeekMemory();
if ($this->isOverUsingMemory(self::THRESHOLD_WARNING_MEMORY)) {
app('log')->warning('using a large amount of memory.', compact('memory'));
}
app('log')->info('-- Shutdown', compact('time', 'memory'));
}

/**
* 添加时间单位
*
* @param float $time
* @return string
*/
protected function formatTime($time)
{
if ($time < 1) {
return sprintf('%0.3f[ms]', $time * 1000);
} else if ($time < (1 / 1000)) {
return sprintf('%0.3f[μs]', $time * 1000 * 1000);
}
return sprintf('%0.3f[s]', $time);
}

/*
4000
*
* 添加内存单位
*
* @param float $value
* @return string
*/
protected function formatMemory($value)
{
if ($value < 1024 * 10) {
return sprintf('%s', $value);
} else if ($value < (1024 * 1024 * 10)) {
return sprintf('%s[kb]', round($value / 1024, 1));
} else {
return sprintf('%s[mb]', round($value / (1024 * 1024), 2));
}
}

/**
* @param int $threshold 阈值(MB)
* @return bool
*/
protected function isOverUsingMemory($threshold)
{
return round(memory_get_peak_usage(1) / 1024 / 1024) > $threshold;
}

/**
* 获取处理时间
*
* @return string
*/
protected function getProcessingTime()
{
return $this->formatTime(microtime(true) - APP_START_TIME);
}

/**
* 获取内存使用峰值
*
* @return float
*/
protected function getPeekMemory()
{
return $this->formatMemory(memory_get_peak_usage(true));
}

}
[b]Kernel类里追加日志采集模块Http Kernel
app\Http\Kernel.php

/**
* 从父类的$bootstrappers复制
*/
protected $bootstrappers = [
'Illuminate\Foundation\Bootstrap\DetectEnvironment',
'Illuminate\Foundation\Bootstrap\LoadConfiguration',
'Illuminate\Foundation\Bootstrap\ConfigureLogging',
'Illuminate\Foundation\Bootstrap\HandleExceptions',
'Illuminate\Foundation\Bootstrap\RegisterFacades',
'Illuminate\Foundation\Bootstrap\RegisterProviders',
'Illuminate\Foundation\Bootstrap\BootProviders',

//新增日志采集类
\App\Bootstrap\ApplicationLog::class,
];
Console Kernel
app\Console\Kernel.php

/**
* 从父类的$bootstrappers复制
*/
protected $bootstrappers = [
'Illuminate\Foundation\Bootstrap\DetectEnvironment',
'Illuminate\Foundation\Bootstrap\LoadConfiguration',
'Illuminate\Foundation\Bootstrap\ConfigureLogging',
'Illuminate\Foundation\Bootstrap\HandleExceptions',
'Illuminate\Foundation\Bootstrap\RegisterFacades',
'Illuminate\Foundation\Bootstrap\SetRequestForConsole',
'Illuminate\Foundation\Bootstrap\RegisterProviders',
'Illuminate\Foundation\Bootstrap\BootProviders',

//新增日志采集类
\App\Bootstrap\ApplicationLog::class,
];
以上就是所有配置,有兴趣的朋友可以试试

查看原文:https://www.huuinn.com/archives/330
更多技术干货:风匀坊
关注公众号:风匀坊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐