sorokin-fm / yii2-es-logger-target
Yii2 适用于 Elastic Search 的日志目标
Requires
- php: >=5.4.0
- elasticsearch/elasticsearch: ^6.0
- yiisoft/yii2: ^2.0
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'],
],
],
享受日志记录!