laravel 8 如何自定义日志文件名、自定义目录
laravel自带的Log::info日志功能有限,只能单个文件记录或者按照日期记录。但是在实际开发过程中,经常需要按功能或者特定需求来记录日志。为了方便,我们可以使用Logger自定义封装一些日志功能。
laravel自带的Log::info日志功能有限,只能单个文件记录或者按照日期记录。但是在实际开发过程中,经常需要按功能或者特定需求来记录日志。为了方便,我们可以使用Logger自定义封装一些日志功能。
<?php
/**
* laravel的日志类不够用,根据项目日志习惯二次封装Monolog日志类
*/
namespace App\Utils;
use Illuminate\Support\Facades\DB;
use Monolog\Formatter\LineFormatter;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class Logs
{
// 文件记录类型 1:文件目录/日期/文件名 2:所有日志一个文件夹
public function __construct()
{
}
/**
* @param $message
* @param array $data
* @param string $filename
* @param string $isDate 是否按月份分文件夹
*/
private static function _save($message, $data = [], $filename = 'log', $isDate = false)
{
$log = new Logger('mylog');
if (PHP_SAPI == 'cli') {
// 命令行访问脚本的,加一个cli标识和用户浏览器访问的区分开
$filename .= '_cli';
}
$filename = $filename . '.log';
if ($isDate) {
// 是否要按日显示
$path = storage_path('logs/' . date('Ymd'));
} else {
$path = storage_path('logs/');
}
// 有时候运维没给号权限,容易导致写入日志失败
self::mkDirs($path);
$path = $path . '/' . $filename;
if (!is_array($data)) {
$message .= " " . $data;
$data = [];
}
$microtime = microtime();
$message = '[' . substr($microtime, 0, 8) . '] ' . $message;// 记录毫秒时间
// finally, create a formatter
$formatter = new LineFormatter("[%datetime%] %message% %context%\n", "Y-m-d H:i:s");
$stream = new StreamHandler($path, Logger::INFO);
$stream->setFormatter($formatter);
$log->pushHandler($stream);
$log->info($message, $data);
}
public static function info($message, $data = [], $filename = 'info', $isDate = false)
{
self::_save($message, $data, $filename, $isDate);
}
public static function debug($message, $data = [], $filename = 'debug')
{
self::_save($message, $data, $filename, false);
}
/**
* @param $message
* @param array $data
* @param string $filename
*/
public static function error($message, $data = [], $filename = 'error')
{
// 错误日志不会太多,按单文件记录可以了,默认$isDate=false
self::_save($message, $data, $filename, false);
}
/**
* 给日志文件夹权限
* @param $dir
* @param int $mode
* @return bool
*/
public static function mkDirs($dir, $mode = 0777)
{
if (is_dir($dir) || @mkdir($dir, $mode)) {
return TRUE;
}
if (!self::mkdirs(dirname($dir), $mode)) {
return FALSE;
}
return @mkdir($dir, $mode);
}
public static function sql($file_name = 'sql', $is_date = false)
{
DB::listen(function ($sql) use ($file_name, $is_date) {
foreach ($sql->bindings as $i => $binding) {
if ($binding instanceof \DateTime) {
$sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
} else {
if (is_string($binding)) {
$sql->bindings[$i] = "'$binding'";
}
}
}
$query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);
$query = vsprintf($query, $sql->bindings);
Logs::info('sql:', $query, $file_name, $is_date);
});
}
}
控制器调用
use App\Utils\Logs;
// 按日 按文件名
Logs::info('A 数组',['a','b'],'order',true);
// 按文件名
Logs::info('A 数组',['a','b'],'order');
// 只有字符串
Logs::info('B 字符串');
// 记录下面的执行sql
Logs::sql();
// 输出:
// [2021-04-15 11:50:37] [0.627499] sql:select * from `user` where `mobile` = '' limit 1 []
生成的日志文件
以上这篇laravel 8 如何自定义日志文件名、自定义目录就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持芦苇派。
原创文章,作者:ECHO陈文,如若转载,请注明出处:https://www.luweipai.cn/php/1683178568/