2

我正在研究用于日志记录的 ELK 堆栈(即 ElasticSearch、LogStash 和 Kibana)。我的大部分日志将来自我使用 NLog 作为日志框架的 .NET 服务。

不过,我在将日志导入 Logstash 时遇到了麻烦。一些研究表明我应该能够使用 Lumberjack 协议作为 Logstack 输入,并且有一个用于 Nlog ( NLog.Targets.Lumberjack ) 的 Nuget 包。

我已经使用 Docker 安装了 ELK 堆栈(如此处所述),这似乎在三个容器启动的意义上起作用,我可以连接到它们,还可以访问 Kibana 用户界面。

我还更新了 Logstack.conf 文件以指定 Lumberjack 作为输入:

input {
    lumberjack {
        port => 5000
        ssl_certificate => "/etc/ssl/logstashcerts/logstash.crt"
        ssl_key => "/etc/ssl/logstashcerts/logstash.key"
    }
}

该证书是使用以下命令生成的:

openssl req -x509 -newkey rsa:2048 -keyout logstash.key -out logstash.crt -nodes -subj /C=GB/ST=Oxfordshire/L=Oxford/O=*****/OU=****/CN=****

我正在使用 Windows,并且现在只是在本地工作,因此还将证书导入我的本地商店并拥有证书指​​纹。

我从NLog.Targets.Lumberjack nuget 包中获取了示例 NLog.config 文件,我所做的唯一更改是根据 Docker compose 文件将端口更改为 5000,并且还添加了thumbnail参数以匹配我导入的证书。

问题是当我的 .NET 代码通过 NLog 发送日志条目时,Logstash 控制台显示以下异常:

logstash_2 | {:timestamp=>"2016-11-14T14:08:13.377000+0000", :message=>"伐木工人输入:未处理的异常", :exception=>#, :backtrace=>["/opt/logstash/vendor/ bundle/jruby/1.9/gems/jls-lumberjack-0.0.26/lib/lumberjack/server.rb:225:in handle_version'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack-0.0.26/lib/lumberjack/server.rb:210:inheader'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack -0.0.26/lib/lumberjack/server.rb:163:in feed'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack-0.0.26/lib/lumberjack/server.rb:332:inread_socket'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack-0.0.26/lib/lumberjack/server. rb:315:in run'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-input-lumberjack-2.0.4/lib/logstash/inputs/lumberjack.rb:110:ininvoke'", "org/jruby/RubyProc.java:271:in call'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/concurrent-ruby-0.9.1-java/lib/concurrent/executor/executor_service.rb:515:inrun'", "Concurrent$$JavaExecutorService$$Job_1581663657.gen:13:in `run'"], :level=>:错误}

因此,为了尝试找出原因,我已连接到 Docker logstack 容器,得到一个 bash 提示,以便我可以查看调用堆栈中的源代码。

它似乎在下面的代码中失败了......

def handle_version(version, &block)
  if supported_protocol?(version)
    yield :version, version
  else
    raise "unsupported protocol '#{version}'"
  end
end

def supported_protocol?(version)
  SUPPORTED_PROTOCOLS.include?(version)
end

IE。它抛出异常,表明SUPPORTED_PROTOCOLS不包含任何version内容。

然而,SUPPORTED_PROTOCOLS是这样的吗:

PROTOCOL_VERSION_1 = "1".ord
PROTOCOL_VERSION_2 = "2".ord

SUPPORTED_PROTOCOLS = [PROTOCOL_VERSION_1, PROTOCOL_VERSION_2]

根据调用堆栈,version是 1。所以对于我未经训练的 Ruby 眼(我对 Ruby 一无所知!),看起来它不应该遇到那个异常。

任何想法我做错了什么或错过了什么?

4

0 回答 0