Laravel 日志(laravel日志采集到sls)
在现代Web应用开发中,日志管理是确保应用稳定运行的重要环节。Laravel 框架提供了强大的日志功能,但默认的日志存储方式可能无法满足生产环境的需求。为了更好地管理和分析日志,我们可以将Laravel日志采集到阿里云的SLS(日志服务)中。介绍如何实现这一目标,并提供多种解决方案。
1. 解决方案
介绍两种方法将Laravel日志采集到阿里云SLS:
- 使用自定义日志驱动:通过创建自定义日志驱动,将日志直接发送到SLS。
- 使用中间件:在请求处理过程中,通过中间件将日志发送到SLS。
2. 使用自定义日志驱动
2.1 创建自定义日志驱动
我们需要创建一个自定义的日志驱动,该驱动将日志数据发送到SLS。以下是具体步骤:
安装阿里云SLS SDK:
bash
composer require aliyuncs/aliyun-log-php-sdk创建自定义日志驱动类:
在app/Logging
目录下创建SlsHandler.php
文件:
“`php
<?phpnamespace AppLogging;
use MonologHandlerAbstractProcessingHandler;
use AliyunLogClient;
use AliyunLogModelsShardCursorType;
use AliyunLogModelsLogItem;class SlsHandler extends AbstractProcessingHandler
{
protected $client;
protected $project;
protected $logstore;public function __construct($endpoint, $accessKeyId, $accessKeySecret, $project, $logstore) { parent::__construct(); $this->client = new Client($endpoint, $accessKeyId, $accessKeySecret); $this->project = $project; $this->logstore = $logstore; } protected function write(array $record) { $logItem = new LogItem(); $logItem->setTime(time()); $logItem->PushBack('level', $record['level_name']); $logItem->PushBack('message', $record['message']); $logItem->PushBack('context', json_encode($record['context'])); $this->client->PostLog($this->project, $this->logstore, [$logItem]); }
}
“`注册自定义日志驱动:
在config/logging.php
中添加自定义日志驱动配置:
“`php
‘channels’ => [
‘stack’ => [
‘driver’ => ‘stack’,
‘channels’ => [‘single’, ‘sls’],
],'sls' => [ 'driver' => 'custom', 'via' => AppLoggingSlsHandler::class, 'endpoint' => env('ALIYUN_SLS_ENDPOINT'), 'accessKeyId' => env('ALIYUN_SLS_ACCESS_KEY_ID'), 'accessKeySecret' => env('ALIYUN_SLS_ACCESS_KEY_SECRET'), 'project' => env('ALIYUN_SLS_PROJECT'), 'logstore' => env('ALIYUN_SLS_LOGSTORE'), ],
],
“`配置环境变量:
在.env
文件中添加以下配置:env
ALIYUN_SLS_ENDPOINT=your_endpoint
ALIYUN_SLS_ACCESS_KEY_ID=your_access_key_id
ALIYUN_SLS_ACCESS_KEY_SECRET=your_access_key_secret
ALIYUN_SLS_PROJECT=your_project
ALIYUN_SLS_LOGSTORE=your_logstore
3. 使用中间件
3.1 创建中间件
另一种方法是在请求处理过程中通过中间件将日志发送到SLS。以下是具体步骤:
创建中间件:
bash
php artisan make:middleware SendLogToSls编辑中间件:
在app/Http/Middleware/SendLogToSls.php
文件中编辑中间件逻辑:
“`php
<?phpnamespace AppHttpMiddleware;
use Closure;
use AliyunLogClient;
use AliyunLogModelsShardCursorType;
use AliyunLogModelsLogItem;class SendLogToSls
{
protected $client;
protected $project;
protected $logstore;public function __construct() { $this->client = new Client( config('logging.channels.sls.endpoint'), config('logging.channels.sls.accessKeyId'), config('logging.channels.sls.accessKeySecret') ); $this->project = config('logging.channels.sls.project'); $this->logstore = config('logging.channels.sls.logstore'); } public function handle($request, Closure $next) { $response = $next($request); $logItem = new LogItem(); $logItem->setTime(time()); $logItem->PushBack('method', $request->method()); $logItem->PushBack('url', $request->url()); $logItem->PushBack('ip', $request->ip()); $logItem->PushBack('status', $response->getStatusCode()); $this->client->PostLog($this->project, $this->logstore, [$logItem]); return $response; }
}
“`注册中间件:
在app/Http/Kernel.php
中注册中间件:
“`php
protected $middlewareGroups = [
‘web’ => [
// 其他中间件
AppHttpMiddlewareSendLogToSls::class,
],'api' => [ // 其他中间件 AppHttpMiddlewareSendLogToSls::class, ],
];
“`
4. 总结
两种将Laravel日志采集到阿里云SLS的方法:使用自定义日志驱动和使用中间件。这两种方法各有优缺点,选择哪种方法取决于具体的应用场景和需求。通过这些方法,可以更好地管理和分析应用日志,提高系统的可维护性和稳定性。
文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/66206.html<