我已经为Laravel应用程序成功配置了ELK,但我们正面临着Laravel日志的问题。我已使用以下代码配置了logstash模板。但是我在Kibana接受Break线路。我按照以下细节尝试了两种不同的配置代码。
20-laravel.conf
input {
stdin{
codec => multiline {
pattern => "^\["
what => "previous"
negate => true
}
}
}
filter {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{DATA:message}" }
}
}
output {
elasticsearch {
document_type => "logs"
hosts => ["127.0.0.1"]
index => "laravel_logs"
}
}
filter {
# Laravel log files
if [type] == "laravel" {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\] %{DATA:env}\.%{DATA:severity}: %{DATA:message} \[" }
}
}
}
laraval样本日志是:
[2017-09-13 16:19:28] production.ERROR: Symfony\Component\Debug\Exception\FatalThrowableError: Parse error: syntax error, unexpected identifier (T_STRING), expecting ',' or ')' in /var/www/app/Http/Controllers/BrandsController.php:57
Stack trace:
#0 /var/www/vendor/composer/ClassLoader.php(322):
Composer\Autoload\includeFile('/var/www/vendor...')
#1 [internal function]: Composer\Autoload\ClassLoader-
>loadClass('App\\Http\\Contro...')
#2 [internal function]: spl_autoload_call('App\\Http\\Contro...')
所以我的主要问题是我们在单行中记录kibana中的这个日志。例如,上面的日志代码是一个划分为不同的行消息,我们无法确定哪个行消息来自哪个错误?
单个laravel日志的Kibana日志输出显示在下面的图像中。kibana log-output
答案 0 :(得分:0)
一个简单的替代方法是使用Laralog。
使用Laralog,Laravel可以直接登录到Elastic Search而无需安装所有完整的Logstash堆栈,因此它适用于小型和容器环境。
使用示例:
laralog https://elasticsearch:9200 --input=laravel.log
Laralog将自动解析并发送日志。
答案 1 :(得分:0)
您应该创建一个新的提供程序来正确设置monolog,请尝试以下设置:
class LogstashProvider extends ServiceProvider
{
public function boot(): void
{
$stream = storage_path('logs/laravel.log');
$name = env('APP_NAME');
$formatter = new LogstashFormatter($name, null, null, 'ctxt_', LogstashFormatter::V1);
$streamHandler = new StreamHandler($stream, Logger::DEBUG, false);
$streamHandler->setFormatter($formatter);
Log::getMonolog()->pushHandler(
$streamHandler
);
}
}
您还应配置您的logstash以解析json而不是