sorokin-fm/yii2-es-logger-target

该软件包最新版本(dev-master)没有可用的许可信息。

Yii2 适用于 Elastic Search 的日志目标

dev-master 2018-12-31 11:21 UTC

This package is not auto-updated.

Last update: 2024-10-02 21:12:05 UTC


README

默认情况下,Yii2 配置为将日志写入文件,如果您想将内容发送到 Kibana,可以使用 filebeat,这是首选方法。但是,让我们稍微思考一下。为什么我们需要所有这些开销,只是为了将日志发送到 Kibana?为什么不直接发送到 ElasticSearch 呢?

现在您可以直接这样做

compose require "sorokin-fm/yii2-es-logger-target"

并将其添加到组件部分

    ...
    'components' => [
        ...
        'log' => [
            'targets' => [
                [
                    'class' => 'common\components\ElasticSearchLogTarget',
                    'levels' => ['error', 'warning', 'info'],
                    'except' => [
                        'yii\db\*',
                        'yii\web\*',
                    ],
                    'logVars' => [],
                    'index' => 'app-' . date('Y-m-d'),
                    'type' => 'app',
                    'body' => [
                        'site' => 'yourwebsite.com',
                    ],
                    'hosts' => ['http://es_login:es_password@es_host:es_port'],
                ],
            ],
        ],
        ...
    ],

现在所有日志都直接发送到 ElasticSearch,我们可以就此停止,但是……还有另一个改进。

让我们想象一下,您有一个由许多阶段和组件组成的流程。例如,您从控制台命令发送电子邮件,首先需要从数据库获取它,然后通过邮件引擎发送。数据库获取器记录一些信息,邮件发送器也记录。您希望它们都使用一些附加信息进行记录。那么,如何做到这一点呢?

当然,您可以使用这种形式的日志记录

Yii::info([
    'message' => 'Real message',
    'context-information-1' => 'Some additional information',
    'context-information-2' => 'Some additional information',
]);

它会工作。但这是不是很繁琐?更重要的是,它引入了程序模块之间不必要的链接。我们需要将信息传递到模块中,然后在其中使用它。有时我们无法重写模块,因为至少它不是您的,也许它也是通过 composer 包含的。

因此,与重写模块以改进日志记录相比,什么会更好?让我向您提供一个解决方案 - ScopedLogger。

ScopedLogger 是一个工具,它帮助在更高层级添加一些附加信息,这些信息将自动在下层使用。让我们看看它是如何工作的

function fn1() {

    Yii::info('Message fn1.1');

    fn2();

    Yii::info('Message fn1.2');

}

function fn2() {

    $scope = new SorokinFM\LoggerScopeManager([
        'context-information-1' => 'Some additional information',
    ]);

    Yii::info('Message fn2.1');

    fn3();

    Yii::info('Message fn2.2');

    $scope = null;

}

function fn3() {

    $scope = new SorokinFM\LoggerScopeManager([
        'context-information-2' => 'Some additional information',
    ]);

    Yii::info('Message fn3.1');

    Yii::info('Message fn3.2');

    $scope = null;

}

在这个例子中,我们将获取 6 条消息发送到 ElasticSearch。这里是它们

{
    'message' => 'Message fn1.1',
    'site' => 'youwebsite.com'
},
{
    'message' => 'Message fn2.1',
    'site' => 'youwebsite.com'
    'context-information-1' => 'Some additional information',
},
{
    'message' => 'Message fn3.1',
    'site' => 'youwebsite.com'
    'context-information-1' => 'Some additional information',
    'context-information-2' => 'Some additional information'
},
{
    'message' => 'Message fn3.2',
    'site' => 'youwebsite.com'
    'context-information-1' => 'Some additional information',
    'context-information-2' => 'Some additional information'
},
{
    'message' => 'Message fn2.2',
    'site' => 'youwebsite.com'
    'context-information-1' => 'Some additional information',
},
{
    'message' => 'Message fn1.2',
    'site' => 'youwebsite.com'
}

这很酷,对吧?但是这是什么——“site”?参数“site”是全局作用域,在您的日志配置部分 body 中定义。您可以在那里定义几个值,以及每个作用域中的几个值。当日志消息发送时,所有这些值都将合并。

因此,要使用作用域,您只需通过依赖注入机制更改日志记录器即可

    'container' => [
        'singletons' => [
            'yii\log\Logger' => ['class' => 'SorokinFM\ScopedLogger'],
        ],
    ],

享受日志记录!