GithubHelp home page GithubHelp logo

logger's Introduction

Laravel log driver for elasticsearch

Installation

$ composer require betterde/logger
$ php artisan vendor:publish --tag=betterde.logger

Config

You can modify config in config/logger.php.

Now we can add the channel of channels in config/logging.php file.

use Betterde\Logger\ElasticsearchLogger;

'channels' => [
    'elastic' => [
        'driver' => 'custom',
        'via' => ElasticsearchLogger::class,
    ],
],

Add the \Betterde\Logger\Http\Middleware\BulkCollectionLog middleware to App\Http\Kernel.php file.

/**
 * The application's global HTTP middleware stack.
 *
 * These middleware are run during every request to your application.
 *
 * @var array
 */
protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \Betterde\Logger\Http\Middleware\BulkCollectionLog::class
];

Now define the environment variable in .env file like this:

LOG_CHANNEL=elastic
ELASTICSEARCH_HOST=localhost
ELASTICSEARCH_PORT=9200
ELASTICSEARCH_SCHEME=http
ELASTICSEARCH_USER=
ELASTICSEARCH_PASS=

Finally, I hope this is helpful.

Sponsors

jetbrains

logger's People

Contributors

hiramrx avatar jinrenjie avatar lsrz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

logger's Issues

和 laravel 深度集成的话,可以考虑默认配置中 extra 如下进行设置


    /*
     * Handler options
     */
    'options' => [
        'index' => 'monolog_'.env('APP_ENV'), // Elastic index name
        'type' => '_doc',    // Elastic document type
        'ignore_error' => false,     // Suppress Elasticsearch exceptions
    ],


    /*
     * Log extra filed
     * @see \Illuminate\Foundation\Application::version() 查看 laravel 版本号
     */
    'extra' => [
        'host' => env('APP_URL'),
        'php' => PHP_VERSION,
        'laravel' => '5.6.16',
    ],

laravel 5.6 找不到 ElasticsearchFormatter


(1/1) ErrorClass 'Monolog\Formatter\ElasticsearchFormatter' not found
--
in ElasticsearchHandler.php line 105
at ElasticsearchHandler->getDefaultFormatter()in AbstractHandler.php line 113


queue 不支持自定义队列名问题

线上的好多队列都使用了默认队列名。如果发往 es 的日志开启了队列发送。可能会因为队列过多问题出现不可预期的错误。

期望能自定义队列名

配置type判断错误

protected function getDefaultFormatter(): FormatterInterface
{
    return new ElasticsearchFormatter($this->options['index'], Arr::get($this->options['type'], 'type', ''));
}

src/Handler/ElasticsearchHandler.php文件104行,这里写法有问题。
$this->options['type']取出已经是字符串了,用Arr::get的话,怎样都是取不到的,也就走默认成空。后续影响_type的判断,导致不兼容ES旧版本。
可以将$this->options['type']改成$this->options,就一点东西,不PR了:smiley:

用redis做队列时偶发报错Serialization of 'Closure' is not allowed

Exception : Serialization of 'Closure' is not allowed

  at /vendor/laravel/framework/src/Illuminate/Queue/Queue.php:139
    135|
    136|         return array_merge($payload, [
    137|             'data' => [
    138|                 'commandName' => get_class($job),
  > 139|                 'command' => serialize(clone $job),
    140|             ],
    141|         ]);
    142|     }
    143|

  Exception trace:

  1   serialize(Object(Betterde\Logger\Jobs\SendDocuments))
      /vendor/laravel/framework/src/Illuminate/Queue/Queue.php:139

  2   Illuminate\Queue\Queue::createObjectPayload(Object(Betterde\Logger\Jobs\SendDocuments), "queues:logging")
      /vendor/laravel/framework/src/Illuminate/Queue/Queue.php:110

Please use the argument -v to see more details.

多日志渠道下,只能产生单日志文件。

当我在config/logging.php配置下,想配置stack的多渠道:
'stack' => [
'driver' => 'stack',
'channels' => ['daily', 'elastic'],
'ignore_exceptions' => false,
],
发现storage/logs下,只产生laravel.logs单日志文件,不能产生每日的日志文件。.env文件中已确认是:LOG_CHANNEL=stack配置了。

elasticsearch 7.* 已移除 _type 信息了

elasticsearch php client 文档。

https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/indexing_documents.html

可以看看是否需要进行如下修改

/**
     * Use Elasticsearch bulk API to send list of documents
     *
     * @param  array             $records
     * @throws \RuntimeException
     */
    protected function bulkSend(array $records): void
    {
        // 无需要记录的日志时不请求
        if (empty($records)) {
            return;
        }

        try {
            $params = [
                'body' => [],
            ];

            foreach ($records as $record) {
                $params['body'][] = [
                    'index' => [
                        '_index' => $record['_index'],
                        // '_type'  => $record['_type'], // elasticsearch 7.* 已移除 _type 信息
                    ],
                ];
                unset($record['_index'], $record['_type']);

                $params['body'][] = $record;
            }

            $responses = $this->client->bulk($params);

            if ($responses['errors'] === true) {
                throw new ElasticsearchRuntimeException('Elasticsearch returned error for one of the records');
            }
        } catch (Throwable $e) {
            if (! $this->options['ignore_error']) {
                throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e);
            }
        }
    }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.