如何将日志事件从Laravel发送到Loggly



我想将我的Laravel 5.1应用程序中的Monolog日志发送到Loggly.com在线日志管理服务。来自所有可能的环境,包括当地的发展。

我发现了一些过时的库和复杂的方法。所以我最终得到了一个非常简单的解决方案。实际上,Laravel Monolog Handler已经有了开箱即用的Loggly Handler。

将配置信息添加到config/services.hp:

'loggly' => array(
    'key'   => 'ENTER_YOUR_LOGGLY_TOKEN_HERE',
    'tag'   => 'ProjectName_' .strtolower(env('APP_ENV')),
),

然后在bootstrap/app.php中添加Monolog处理程序,然后返回$app:

/*
|--------------------------------------------------------------------------
| Setup Loggly Handler
|--------------------------------------------------------------------------
*/
$app->configureMonologUsing(function($monolog) {
    $handler = new      MonologHandlerLogglyHandler(config('services.loggly.key'),MonologLogger::DEBUG);
    $handler->setTag(config('services.loggly.tag'));
    $monolog->pushHandler($handler);
});

哇!您正在Loggly仪表板中获取Monolog日志。


更新:(感谢@thitami)

基于laravel.com/docs/5.6/升级

配置MonologUsing方法如果您使用configureMonologUsing方法为应用程序自定义Monolog实例,那么现在应该创建一个自定义日志通道。有关如何创建自定义通道的更多信息,请查看完整的日志记录文档。

通过稍微调整mladen janjetovic的代码,我能够管理Laravel的默认本地日志行为,并同时推送Loggly。在Laravel 5.3 上测试

config/services.hp:

'loggly' => [
    'key'   => 'ENTER_YOUR_LOGGLY_TOKEN_HERE',
    'tag'   => 'ProjectName_' .strtolower(env('APP_ENV')),
],

bootstrap/app.php:

/*
|--------------------------------------------------------------------------
| Push to Loggly, and save locally.
|--------------------------------------------------------------------------
*/
$app->configureMonologUsing(function($monolog) use ($app) {
    $log = $app->make(IlluminateLogWriter::class);
    $logglyHandler = new MonologHandlerLogglyHandler(config('services.loggly.key'));
    $logglyHandler->setTag(config('services.loggly.tag'));
    if (config('app.env') == 'production') 
    {
        // Push to Loggly and save local if in production 
        $log->getMonolog()->pushHandler($logglyHandler);
        $log->useFiles(storage_path('/logs/laravel.log'));
    }
    else
    {
        // Otherwise, save only locally
        $log->useFiles(storage_path('/logs/laravel.log'));
    }
});

使用Laravel 8,我的配置很少。

只需为Loggly使用内置的monolog处理程序。

编辑app/config/logging.php

use MonologHandlerLogglyHandler;
'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['single', 'loggly'],
            'ignore_exceptions' => false,
        ],
        'loggly' => [
            'driver' => 'monolog',
            'level' => env('LOG_LEVEL', 'debug'),
            'handler' => LogglyHandler::class,
            'with' => [
                'token' => env('LOGGLY_TOKEN'),
            ],
        ],
   ]

对于更高级的日志记录(对于我的情况,我需要设置标记,因为它在内置处理程序的构造函数中丢失了

将内置处理程序复制到供应商文件夹中可以找到的位置(例如:vendor/monolog/monolog/src/monolog/Handler/LogglyHandler.php)到您选择的应用程序文件夹中(例如:app/Loging/CustomLogglyHandler php)

修改构造函数以设置标记,并且您需要更改一些导入,因为我们使用不同的名称空间。

// app/Logging/CustomLogglyHandler.php
namespace AppLogging;
use MonologHandlerAbstractProcessingHandler;
use MonologHandlerMissingExtensionException;
use MonologLogger;
use MonologFormatterFormatterInterface;
use MonologFormatterLogglyFormatter;
use function array_key_exists;
use CurlHandle;
use MonologHandlerCurlUtil as CurlUtil;
  public function __construct(string $token, array|string $tag = [], $level = Logger::DEBUG, bool $bubble = true)
  {
    if (!extension_loaded('curl')) {
      throw new MissingExtensionException('The curl extension is needed to use the LogglyHandler');
    }
    $this->token = $token;
    if (is_array($tag)) {
      $this->tag = $tag;
    } else {
      $this->tag = [$tag];
    }
    parent::__construct($level, $bubble);
  }

// config/logging.php

'loggly' => [
        'driver' => 'monolog',
        'level' => env('LOG_LEVEL', 'debug'),
        'handler' => CustomLogglyHandler::class,
        'with' => [
             'token' => env('LOGGLY_TOKEN'),
             'tag'   => strtolower(env('APP_NAME', 'Laravel')) . '_' . strtolower(env('APP_ENV', 'production'))
            ],
        ],

或者,您可以使用Monolog Cascade来完成此操作。

Monolog Cascade是一个Monolog扩展,允许您从一个配置文件中设置和配置多个记录器和处理程序

下面是使用Loggly的Monolog Cascade的示例配置文件。这将记录到您的stdOut和Loggly:

---
handlers:
    console:
        class: MonologHandlerStreamHandler
        level: DEBUG
        stream: php://stdout
    error_loggly_handler:
        class: MonologHandlerLogglyHandler
        level: ERROR
        token: xxxx-xxxx-xxxxxxxx
        tags: [cascade, waterfall]
loggers:
    my_logger:
        handlers: [console, error_loggly_handler]

如果你感兴趣,这里有一篇关于Cascade=>的博客文章https://medium.com/orchard-technology/enhancing-monolog-699efff1051d


【免责声明】:我是Monolog Cascade的主要贡献者。

扩展Hassan的贡献(作为回答发布,因为我仍然没有足够的声誉来发布评论)。

如果您需要在本地使用每日日志,您可以使用以下代码:

$logFile = 'laravel'.'.txt';
$log->useDailyFiles(storage_path().'/logs/'.$logFile);

当然,日志文件的名称完全是任意的。在本例中,格式如下:

laravel-YYYY-MM-DD.txt

编辑:升级到5.4后,这条线路不再工作:

$log = $app->make(IlluminateLogWriter::class);

作为一种变通方法,您可以手动创建Writer实例,注入configureMonologUsing闭包中可用的$monlog:

$log = new IlluminateLogWriter($monolog);

相关内容

  • 没有找到相关文章

最新更新