laravel 日志(laravel日志采集到sls)

Laravel 日志(laravel日志采集到sls)

在现代Web应用开发中,日志管理是确保应用稳定运行的重要环节。Laravel 框架提供了强大的日志功能,但默认的日志存储方式可能无法满足生产环境的需求。为了更好地管理和分析日志,我们可以将Laravel日志采集到阿里云的SLS(日志服务)中。介绍如何实现这一目标,并提供多种解决方案。

1. 解决方案

介绍两种方法将Laravel日志采集到阿里云SLS:

  1. 使用自定义日志驱动:通过创建自定义日志驱动,将日志直接发送到SLS。
  2. 使用中间件:在请求处理过程中,通过中间件将日志发送到SLS。

2. 使用自定义日志驱动

2.1 创建自定义日志驱动

我们需要创建一个自定义的日志驱动,该驱动将日志数据发送到SLS。以下是具体步骤:

  1. 安装阿里云SLS SDK
    bash
    composer require aliyuncs/aliyun-log-php-sdk

  2. 创建自定义日志驱动类
    app/Logging 目录下创建 SlsHandler.php 文件:
    “`php
    <?php

    namespace 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]);
    }
    

    }
    “`

  3. 注册自定义日志驱动
    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'),
    ],
    

    ],
    “`

  4. 配置环境变量
    .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。以下是具体步骤:

  1. 创建中间件
    bash
    php artisan make:middleware SendLogToSls

  2. 编辑中间件
    app/Http/Middleware/SendLogToSls.php 文件中编辑中间件逻辑:
    “`php
    <?php

    namespace 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;
    }
    

    }
    “`

  3. 注册中间件
    app/Http/Kernel.php 中注册中间件:
    “`php
    protected $middlewareGroups = [
    ‘web’ => [
    // 其他中间件
    AppHttpMiddlewareSendLogToSls::class,
    ],

    'api' => [
        // 其他中间件
        AppHttpMiddlewareSendLogToSls::class,
    ],
    

    ];
    “`

4. 总结

两种将Laravel日志采集到阿里云SLS的方法:使用自定义日志驱动和使用中间件。这两种方法各有优缺点,选择哪种方法取决于具体的应用场景和需求。通过这些方法,可以更好地管理和分析应用日志,提高系统的可维护性和稳定性。

Image

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/66206.html<

(0)
运维的头像运维
上一篇2025-02-02 23:06
下一篇 2025-02-02 23:06

相关推荐

  • 如何在CentOS环境中修改MySQL的root密码?

    在CentOS环境中,修改MySQL的root密码可以通过以下步骤完成:1. 登录到MySQL命令行工具:mysql -u root -p。2. 使用当前密码进入MySQL后,执行以下SQL命令来更改密码:ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘new_password’;。3. 刷新权限:FLUSH PRIVILEGES;。4. 退出并重新登录以验证新密码是否生效。

    2025-02-02
    0
  • laravel的表单验证;layui表单验证

    laravel的表单验证;layui表单验证 在Web开发中,表单验证是确保数据完整性和安全性的关键步骤。介绍如何在Laravel和Layui框架中实现表单验证,帮助开发者高效地解…

    2025-02-02
    0
  • laravel跳转(laravel跳转到外部链接)

    Laravel跳转到外部链接 在Laravel中,有时候我们需要将用户重定向到外部链接,比如支付网关、社交媒体页面等。介绍几种实现这一功能的方法,并提供详细的代码示例。 1. 使用…

    2025-02-02
    0
  • laravel5.4_None

    Laravel5.4_None 在开发基于Laravel框架的Web应用时,开发者可能会遇到各种问题。探讨一个特定的问题——None异常,并提供多种解决方法。此问题通常出现在尝试访…

    2025-02-02
    0
  • laravel根目录_laravel 命令

    Laravel根目录_laravel 命令 在使用Laravel框架进行开发时,我们经常需要在项目的根目录下执行各种Artisan命令来完成项目初始化、数据库迁移、缓存清理等操作。…

    2025-02-02
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注