php框架怎样进行日志记录_php框架日志系统的配置方法
在php项目开发过程中,日志记录是排查问题、监控系统运行状态的重要手段。不同的php框架都内置了日志系统,也支持自定义日志配置,下面以常用的Laravel和ThinkPHP框架为例,介绍日志系统的配置与使用方法。
一、Laravel框架日志配置与使用
Laravel的日志系统基于Monolog库实现,默认提供了多种日志驱动,并且支持通过配置文件灵活调整日志行为。
1. 基础配置
Laravel的日志配置文件位于config/logging.php,我们可以在这里设置默认的日志驱动、日志通道等参数。以下是一个典型的基础配置示例:
<?php
return [
// 默认日志通道
'default' => env('LOG_CHANNEL', 'stack'),
// 日志通道配置
'channels' => [
// 堆栈通道,可以组合多个其他通道
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
// 单文件日志通道,将日志写入单个文件
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
// 按日期分割的日志通道,每天生成一个新的日志文件
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14, // 保留14天的日志文件
],
// 错误级别的日志单独通道
'error' => [
'driver' => 'single',
'path' => storage_path('logs/error.log'),
'level' => 'error',
],
],
];上面的配置中,我们设置了默认通道为stack,它组合了single通道,同时额外定义了daily和error两个通道,分别用于按日期分割日志和单独记录错误级别日志。
2. 日志写入使用
配置完成后,我们可以在业务代码中通过Log门面来写入日志,支持不同的日志级别:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Log;
class TestController extends Controller
{
public function testLog()
{
// 记录debug级别日志
Log::debug('这是一条debug级别的日志', ['user_id' => 1, 'action' => '登录']);
// 记录info级别日志
Log::info('用户执行了查询操作', ['query_params' => ['page' => 1, 'size' => 10]]);
// 记录warning级别日志
Log::warning('接口响应时间超过阈值', ['url' => '/api/user/list', 'cost_time' => 1200]);
// 记录error级别日志,会同时写入error通道和默认通道
Log::error('数据库查询失败', ['sql' => 'select * from users where id = 1', 'error' => '连接超时']);
// 使用指定通道写入日志
Log::channel('daily')->info('这是写入daily通道的日志');
Log::channel('error')->error('这是写入error通道的错误日志');
return '日志写入完成';
}
}日志会按照配置的路径和规则生成,比如默认的single通道日志会存在storage/logs/laravel.log中,daily通道会生成类似laravel-2024-05-20.log的按日期命名的文件。
二、ThinkPHP框架日志配置与使用
ThinkPHP同样内置了完善的日志系统,支持文件、Socket等多种驱动,配置方式也较为灵活。
1. 基础配置
ThinkPHP的日志配置可以在config/log.php中进行设置,以下是常用的配置示例:
<?php
return [
// 默认日志记录通道
'default' => 'file',
// 日志通道列表
'channels' => [
// 文件日志通道
'file' => [
'driver' => 'file',
// 日志保存目录
'path' => app()->getRootPath() . 'runtime/log/',
// 日志记录级别,为空则记录所有级别
'level' => [],
// 日志文件大小限制,超过后会自动生成新文件
'max_files' => 30,
// 是否按日期分目录存储
'apart_day' => true,
// 日志格式
'format' => '[%s][%s] %s',
],
// 单独的错误日志通道
'error' => [
'driver' => 'file',
'path' => app()->getRootPath() . 'runtime/log/error/',
'level' => ['error', 'critical', 'alert', 'emergency'],
'apart_day' => true,
],
],
];上面的配置中,默认使用文件驱动记录日志,开启了按日期分目录存储,同时单独设置了error通道,只记录错误及以上级别的日志,方便后续排查严重问题。
2. 日志写入使用
ThinkPHP中可以通过Log类来写入日志,也支持在配置中设置自动记录的日志类型:
<?php
namespace app\controller;
use think\facade\Log;
class Test extends BaseController
{
public function testLog()
{
// 记录不同级别的日志
Log::debug('debug级别日志,记录调试信息');
Log::info('info级别日志,记录常规操作信息');
Log::notice('notice级别日志,记录需要注意的信息');
Log::warning('warning级别日志,记录警告信息');
Log::error('error级别日志,记录错误信息');
// 写入额外参数
Log::info('用户下单操作', ['user_id' => 10, 'order_id' => 20240520001]);
// 使用指定通道写入
Log::channel('error')->error('支付回调处理失败', ['order_id' => 20240520001, 'error_msg' => '签名校验不通过']);
// 关闭当前请求的日志写入,避免敏感信息被记录
Log::close();
return '日志写入完成';
}
}日志会按照配置的规则存储,比如开启了按日期分目录后,日志会存在runtime/log/2024-05-20/目录下,每个级别对应一个日志文件。
三、日志系统使用注意事项
- 生产环境建议将日志级别设置为
warning及以上,避免记录过多的debug和info日志占用磁盘空间,影响性能。 - 敏感信息(如用户密码、支付密钥等)不要写入日志,防止信息泄露。
- 可以定期清理过期的日志文件,避免磁盘空间被占满,也可以在配置中设置日志文件的最大保留数量。
- 如果是分布式部署的项目,可以考虑使用第三方日志服务(如ELK、Sentry等),将日志集中收集处理,方便统一查询和监控。
不同php框架的日志系统核心逻辑类似,都是基于配置文件定义日志规则,再通过提供的日志类写入对应日志,开发者可以根据项目需求灵活调整配置,满足不同的日志记录场景。