fluent logger for laravel (with Monolog handler for Fluentd )
Framework | Library |
---|---|
Laravel / Lumen < v10 | ytake/laravel-fluent-logger: ^5 |
Laravel / Lumen >= v10 | ytake/laravel-fluent-logger: ^6 |
Require this package with Composer
$ composer require ytake/laravel-fluent-logger
or composer.json
"require": {
"ytake/laravel-fluent-logger": "^6.0"
},
Supported Auto-Discovery(^Laravel5.5)
your config/app.php
'providers' => [
\Ytake\LaravelFluent\LogServiceProvider::class,
]
$ php artisan vendor:publish
$ php artisan vendor:publish --tag=log
$ php artisan vendor:publish --provider="Ytake\LaravelFluent\LogServiceProvider"
use Ytake\LaravelFluent\LumenLogServiceProvider
bootstrap/app.php
$app->register(\Ytake\LaravelFluent\LumenLogServiceProvider::class);
Lumen will use your copy of the configuration file if you copy and paste one of the files into a config directory within your project root.
cp vendor/ytake/laravel-fluent-logger/src/config/fluent.php config/
edit config/fluent.php
return [
'host' => env('FLUENTD_HOST', '127.0.0.1'),
'port' => env('FLUENTD_PORT', 24224),
/** @see https://github.com/fluent/fluent-logger-php/blob/master/src/FluentLogger.php */
'options' => [],
/** @see https://github.com/fluent/fluent-logger-php/blob/master/src/PackerInterface.php */
// specified class name
'packer' => null,
// optionally override Ytake\LaravelFluent\FluentHandler class to customize behaviour
'handler' => null,
'processors' => [],
'tagFormat' => '{{channel}}.{{level_name}}',
];
added config/logging.php
return [
'channels' => [
'stack' => [
'driver' => 'stack',
// always added fluentd log handler
// 'channels' => ['single', 'fluent'],
// fluentd only
'channels' => ['fluent'],
],
'fluent' => [
'driver' => 'fluent',
'level' => 'debug',
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 7,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
],
];
or custom / use via
return [
'channels' => [
'custom' => [
'driver' => 'custom',
'via' => \Ytake\LaravelFluent\FluentLogManager::class,
],
]
];
## match tag=local.** (for laravel log develop)
<match local.**>
type stdout
</match>
example (production)
<match production.**>
type stdout
</match>
and more
<match lumen.**>
type stdout
</match>
The tag format can be configured to take variables from the LogEntry object. This will then be used to match tags in fluent.
{{channel}}
will be Laravel's current environment as configured in
APP_ENV
, NOT the logging channel from config/logging.php
{{level_name}}
will be the uppercase string version of the log level.
{{level}}
is the numeric value of the log level. Debug == 100, etc
You can also use variables that exist in LogEntry::$extra
. Given a message like
$l = new \Monolog\LogRecord(extra: ['foo' => 'bar']);
You could use a tag format of myapp.{{foo}}
to produce a tag of myapp.bar
.
You can add processors to the Monolog handlers by adding them to
the processors
array within the fluent.php
config.
config/fluent.php:
'processors' => [function (\Monolog\LogRecord $record) {
$record->extra['cloudwatch_log_group'] = 'test_group';
return $record;
}],
Alternatively, you can pass the class name of the processor. This helps keep your config compatible with config:cache
config/fluent.php:
'processors' => [CustomProcessor::class],
CustomProcessor.php:
class CustomProcessor
{
public function __invoke(\Monolog\LogRecord $record)
{
$record->extra['cloudwatch_log_group'] = 'test_group';
return $record;
}
}
The code for laravel-fluent-logger is distributed under the terms of the MIT license.