如何将日志事件从 Laravel 发送到 Loggly?
How to send Log event from Laravel to Loggly?
我想从我的 Laravel 5.1 应用程序发送 Monolog 日志到 Loggly.com 在线日志管理服务。来自所有可能的环境,包括本地开发。
我发现了一些过时的库和执行此操作的复杂方法。所以我最终得到了非常简单的解决方案。实际上,Laravel Monolog Handler 已经有开箱即用的 Loggly Handler。
将配置信息添加到 config/services。php:
'loggly' => array(
'key' => 'ENTER_YOUR_LOGGLY_TOKEN_HERE',
'tag' => 'ProjectName_' .strtolower(env('APP_ENV')),
),
在返回 $app 之前在 bootstrap/app.php 中添加 Monolog 处理程序:
/*
|--------------------------------------------------------------------------
| Setup Loggly Handler
|--------------------------------------------------------------------------
*/
$app->configureMonologUsing(function($monolog) {
$handler = new \Monolog\Handler\LogglyHandler(config('services.loggly.key'),\Monolog\Logger::DEBUG);
$handler->setTag(config('services.loggly.tag'));
$monolog->pushHandler($handler);
});
瞧!您正在 Loggly 仪表板中获取您的 Monolog 日志。
更新:(感谢@thitami)
基于laravel.com/docs/5.6/升级
The configureMonologUsing Method
If you were using the configureMonologUsing method to customize the Monolog instance for your application, you should now create a custom Log channel. For more information on how to create custom channels, check out the full logging documentation.
通过稍微调整 mladen-janjetovic's 代码,我能够管理 Laravel 的默认本地日志行为,并同时推送到 Loggly。在 Laravel 5.3
上测试
config/services.php:
'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(Illuminate\Log\Writer::class);
$logglyHandler = new \Monolog\Handler\LogglyHandler(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'));
}
});
扩展 Hassan 的贡献(post 作为答案,因为我仍然没有足够的声誉 post 发表评论)。
如果您需要在本地使用每日日志,您可以使用以下代码:
$logFile = 'laravel'.'.txt';
$log->useDailyFiles(storage_path().'/logs/'.$logFile);
当然,日志文件名是完全任意的。在这个例子中,格式将是这样的:
laravel-YYYY-MM-DD.txt
编辑:
升级到 5.4 后,此行不再有效:
$log = $app->make(Illuminate\Log\Writer::class);
作为解决方法,您可以手动创建 Writer 实例,注入可从 configureMonologUsing
闭包获得的 $monolog:
$log = new Illuminate\Log\Writer($monolog);
或者,您可以使用 Monolog-Cascade 来执行此操作。
Monolog-Cascade is a Monolog extension that allows you to set up and configure multiple loggers and handlers from a single config file.
这是 Monolog-Cascade 使用 Loggly 的示例配置文件。这将记录到您的 stdOut 和 Loggly:
---
handlers:
console:
class: Monolog\Handler\StreamHandler
level: DEBUG
stream: php://stdout
error_loggly_handler:
class: Monolog\Handler\LogglyHandler
level: ERROR
token: xxxx-xxxx-xxxxxxxx
tags: [cascade, waterfall]
loggers:
my_logger:
handlers: [console, error_loggly_handler]
如果您有兴趣,这里是 Cascade 上的博客 post => https://medium.com/orchard-technology/enhancing-monolog-699efff1051d
[免责声明]:我是Monolog-Cascade的主要贡献者。
使用 Laravel 8.
的小配置让我的工作正常
只需使用 Loggly 的内置独白处理程序。
编辑您的 app/config/logging.php
use Monolog\Handler\LogglyHandler;
'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 文件夹中找到它
(例如:vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php)到您选择的应用程序文件夹(例如:app/Logging/CustomLogglyHandler.php ).
修改构造函数以设置标签,并且您需要更改一些导入,因为我们在不同的命名空间上。
// app/Logging/CustomLogglyHandler.php
namespace App\Logging;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Handler\MissingExtensionException;
use Monolog\Logger;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LogglyFormatter;
use function array_key_exists;
use CurlHandle;
use Monolog\Handler\Curl\Util 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'))
],
],
我想从我的 Laravel 5.1 应用程序发送 Monolog 日志到 Loggly.com 在线日志管理服务。来自所有可能的环境,包括本地开发。
我发现了一些过时的库和执行此操作的复杂方法。所以我最终得到了非常简单的解决方案。实际上,Laravel Monolog Handler 已经有开箱即用的 Loggly Handler。
将配置信息添加到 config/services。php:
'loggly' => array(
'key' => 'ENTER_YOUR_LOGGLY_TOKEN_HERE',
'tag' => 'ProjectName_' .strtolower(env('APP_ENV')),
),
在返回 $app 之前在 bootstrap/app.php 中添加 Monolog 处理程序:
/*
|--------------------------------------------------------------------------
| Setup Loggly Handler
|--------------------------------------------------------------------------
*/
$app->configureMonologUsing(function($monolog) {
$handler = new \Monolog\Handler\LogglyHandler(config('services.loggly.key'),\Monolog\Logger::DEBUG);
$handler->setTag(config('services.loggly.tag'));
$monolog->pushHandler($handler);
});
瞧!您正在 Loggly 仪表板中获取您的 Monolog 日志。
更新:(感谢@thitami)
基于laravel.com/docs/5.6/升级
The configureMonologUsing Method If you were using the configureMonologUsing method to customize the Monolog instance for your application, you should now create a custom Log channel. For more information on how to create custom channels, check out the full logging documentation.
通过稍微调整 mladen-janjetovic's 代码,我能够管理 Laravel 的默认本地日志行为,并同时推送到 Loggly。在 Laravel 5.3
上测试config/services.php:
'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(Illuminate\Log\Writer::class);
$logglyHandler = new \Monolog\Handler\LogglyHandler(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'));
}
});
扩展 Hassan 的贡献(post 作为答案,因为我仍然没有足够的声誉 post 发表评论)。
如果您需要在本地使用每日日志,您可以使用以下代码:
$logFile = 'laravel'.'.txt';
$log->useDailyFiles(storage_path().'/logs/'.$logFile);
当然,日志文件名是完全任意的。在这个例子中,格式将是这样的:
laravel-YYYY-MM-DD.txt
编辑: 升级到 5.4 后,此行不再有效:
$log = $app->make(Illuminate\Log\Writer::class);
作为解决方法,您可以手动创建 Writer 实例,注入可从 configureMonologUsing
闭包获得的 $monolog:
$log = new Illuminate\Log\Writer($monolog);
或者,您可以使用 Monolog-Cascade 来执行此操作。
Monolog-Cascade is a Monolog extension that allows you to set up and configure multiple loggers and handlers from a single config file.
这是 Monolog-Cascade 使用 Loggly 的示例配置文件。这将记录到您的 stdOut 和 Loggly:
---
handlers:
console:
class: Monolog\Handler\StreamHandler
level: DEBUG
stream: php://stdout
error_loggly_handler:
class: Monolog\Handler\LogglyHandler
level: ERROR
token: xxxx-xxxx-xxxxxxxx
tags: [cascade, waterfall]
loggers:
my_logger:
handlers: [console, error_loggly_handler]
如果您有兴趣,这里是 Cascade 上的博客 post => https://medium.com/orchard-technology/enhancing-monolog-699efff1051d
[免责声明]:我是Monolog-Cascade的主要贡献者。
使用 Laravel 8.
的小配置让我的工作正常只需使用 Loggly 的内置独白处理程序。
编辑您的 app/config/logging.php
use Monolog\Handler\LogglyHandler;
'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 文件夹中找到它 (例如:vendor/monolog/monolog/src/Monolog/Handler/LogglyHandler.php)到您选择的应用程序文件夹(例如:app/Logging/CustomLogglyHandler.php ).
修改构造函数以设置标签,并且您需要更改一些导入,因为我们在不同的命名空间上。
// app/Logging/CustomLogglyHandler.php
namespace App\Logging;
use Monolog\Handler\AbstractProcessingHandler;
use Monolog\Handler\MissingExtensionException;
use Monolog\Logger;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\LogglyFormatter;
use function array_key_exists;
use CurlHandle;
use Monolog\Handler\Curl\Util 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'))
],
],