我正在研究用于日志记录的 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:in
header'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack -0.0.26/lib/lumberjack/server.rb:163:infeed'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack-0.0.26/lib/lumberjack/server.rb:332:in
read_socket'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/jls-lumberjack-0.0.26/lib/lumberjack/server. rb:315:inrun'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-input-lumberjack-2.0.4/lib/logstash/inputs/lumberjack.rb:110:in
invoke'", "org/jruby/RubyProc.java:271:incall'", "/opt/logstash/vendor/bundle/jruby/1.9/gems/concurrent-ruby-0.9.1-java/lib/concurrent/executor/executor_service.rb:515:in
run'", "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 一无所知!),看起来它不应该遇到那个异常。
任何想法我做错了什么或错过了什么?