Logstash起動時のエラー


#1

linux環境にlogstash,erasticsearch,kibanaの構築をしています。

logstash(tar.gz版)を設定後に起動コマンドを実行したところ下記エラーが出ます。

[main]Logstash - java.lang.IllegalStateException: Logstash stopped processing because of an error:(GemspecError) There was a LoadError while loading logstash-core.gemspec:
load error: psych-- java.lang.RuntimeException :BUG : we can not copy embedded jar to temp directory

Does it try to require a relative path? That's been removed in Ruby 1.9.

・エラー文中のtempディレクトリとは、/tmpディレクトリでしょうか?(/tmpはrootユーザのみ書き込み許可されていますが、logstashの起動ユーザにはroot権限がありません)
・(もし/tmpをさしている場合)Erasticsearchでは、環境変数ES_TMPDIRに任意のtmpディレクトリを設定しましたが、logstashも同様に変更できるでしょうか。
・上記とは異なるエラー原因でしょうか

恐れ入りますがご教示頂けますと幸いです。


(Makoto Nozawa) #2

同様と思われるエラーのトピックがありました

temp directoryとは /tmp のことを指しているようですね。
権限周りを変更することができれば解決する可能性がたかそうです。

一方、logstashの設定としてtemp directoryを変更する項目はさっと見たところなさそうに思います。
(logstashのファイル群の中には/tmpを指している箇所が相当数ありますが大半がjrubyに関するもので、専門外の私にはよくわかりませんでした)


#3

ありがとうございます。
/tmpの権限変更可能かサーバの管理者に確認してみます。

ちなみに添付いただいた記事ですと、スーパーユーザーで実行するとpipeline.ymlが使用できないということですよね?(複数conf実行したいためpipelineは使用したいと考えております)


(Shota Ito) #4

もし解決できない場合は以下情報を貼って貰えればもう少し何かわかるかもしれません。

  • OS情報
    • RHEL|CentOS|Debian|Ubuntu等
    • アーキテクチャ(i386 |x86_64等。uname -aコマンドで出てくるかと思います)
  • Logstash情報
    • Version
  • /tmpディレクトリの情報
    $ ls -la /tmp
    
  • エラーが出るまでの実行手順(以下、例)
    $ sudo su -
    # bin/logstash -f logstash-simple.conf
    Sending Logstash logs to /root/logstash-6.5.1/logs which is now configured via log4j2.properties
    [2018-12-04T06:15:19,237][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
    [2018-12-04T06:15:19,279][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.5.1"}
    [2018-12-04T06:15:24,433][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
    [2018-12-04T06:15:25,052][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
    [2018-12-04T06:15:25,063][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://localhost:9200/, :path=>"/"}
    

(tsgkdt) #5

こんにちわ。
確かに/tmpフォルダに書き込み権限がないと、同じエラーになることをLogstash6.5.1で確認しました。

tmpが書き込み権限がないというのであれば、書き込みができる場所を
Javaのテンポラリ用のフォルダの指定をすれば良い、ということになるかと思います。

そこで、EM_TEMPDIRではなく、LS_JAVA_OPTS環境変数でJVM引数を指定してみてください。

export LS_JAVA_OPTS="-Djava.io.tmpdir=/hoge/fuga"

/hoge/fugaは、logstash実行ユーザが書き込みができる場所とします。
これで実行いただくと、tmpフォルダが書き込み権限なくても、/hoge/fuga以下を使うので起動エラーは避けられるはずです。

こちらはDockerで確認していますが、これを確認したときの起動コマンドはこちらになります。
/tmpフォルダはReadOnly、新しく指定するtmp用のフォルダはReadWriteで。

docker run  -it -v /home/test/1205:/tmp:ro \
                -v /home/test/hoge:/hoge/fuga:rw \
                -e LS_JAVA_OPTS=-Djava.io.tmpdir=/hoge/fuga \
                docker.elastic.co/logstash/logstash:6.5.1

これでlogstashを起動すると、jrubyのjarがtmpとして指定したフォルダにコピーされていることが確認できました。

参考になれば幸いです。


#6

ありがとうございます!
tmpフォルダに権限を与えて実行できました。

JAVAのtmp出力で使用しているのですね。
今後ディレクトリ構成を諸々検討するため、環境変数の設定も視野に入れたいと思います。

ご回答いただいたみなさま、本当にありがとうございました。