質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.36%

  • Java

    15092questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

log4j2のSocketAppenderでスタックトレースが出力されない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 110

sweetfish

score 8

前提・実現したいこと

複数のサーバから出力されるログを集約するため、log4j2のSocketAppenderを使用してログ出力を行っています。Exception発生時は、例外オブジェクトを引数に指定することにより、スタックトレースが出力されるようにしたいです。

発生している問題

SocketAppender経由でログ出力時に、スタックトレースがファイルに出力されない状態です。※RollingFileAppenderを指定した場合は、出力されます。
[2019-02-06 23:59:39]:ERROR - hostname=xxxxx user_cd=xxxxx エラー!
java.lang.IllegalArgumentException: Oops! ←SocketAppenderの場合、この行以降が出力されない

該当のソースコード

logger.error("エラー!",new IllegalArgumentException("Oops!"));

log4j2.xml
(送信側)
<Appenders>
<Socket name="mySocket" host="localhost" port="4712" reconnectionDelayMillis="100000">
<SerializedLayout />
</Socket>
</Appenders>

<Loggers> ※rootロガーの記述は省略。
<Logger name="mylogger" level="debug">
<AppenderRef ref="mySocket"/>
</Logger>
</Loggers>

(受信側)
<Appenders>
<RollingFile name="mylogger" fileName="c:/applog/test.log" filePattern="c:/applog/test_%d{yyyy-MM-dd}-%i.zip">
<PatternLayout pattern="[${date}]:%-5p - hostname=%X{hostname}  user_cd=%X{userCd} %m%n%ex"/>
<Policies>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
</Appenders>

<Loggers> ※rootロガーの記述は省略。
<Logger name="mylogger" level="debug">
<AppenderRef ref="mylogger"/>
</Logger>
</Loggers>

試したこと

送信側のSocketAppenderのlayoutを「SerializedLayout」→「PatternLayout」にしてみましたが、java.io.StreamCorruptedExceptionでエラーとなってしまいました。
----- (追記)発生したException
ERROR org.apache.logging.log4j.core.net.server.TcpSocketServer.4712 - IOException encountered while reading from socket
java.io.StreamCorruptedException: invalid type code: 5B

補足情報(FW/ツールのバージョンなど)

log4jバージョン:2.3
送信側 JDK1.6 受信側 JDK1.8

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/02/11 09:47

    SocketServer は起動してるんだろうか?
    ※ 別で起動してる Log4j2を設定しているServerではない

    キャンセル

  • sweetfish

    2019/02/11 15:37

    SocketServerは起動していると思われます。スタックトレースより前のログは出力されておりますし。以下のコマンドで起動しています。
    すみません、「別で起動してる Log4j2を設定しているServer」の意味がよくわかりません。

    キャンセル

  • sweetfish

    2019/02/11 15:39 編集

    SocketServerは起動していると思われます。スタックトレースより前の部分は出力されているので。
    (仮)SocketServerを起動しているコマンド)
    java -cp ./lib/* org.apache.logging.log4j.core.net.server.TcpSocketServer 4712 ./config/log4j2-receive.xml
    ※すみません、「別で起動してる Log4j2を設定しているServer」の意味がよく分かっていないです

    キャンセル

回答 1

checkベストアンサー

+1

Javaソース中の「logger」変数の実体のクラスは何でしょうか?(ExtendedLoggerクラスですか?)
また、RollingFileAppenderで成功した際のlog4j2.xmlも公開して頂けると解決が早いかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/11 15:58

    アドバイス、ありがとうございます。

    >Javaソース中の「logger」変数の実体のクラスは何でしょうか?
    org.apache.logging.log4j.LogManager.getLogger(loggerName) で取得したLoggerオブジェクトを使用しています(ExtendedLoggerではないです)。
    >RollingFileAppenderで成功した際のlog4j2.xml
    (受信側)のlog4j2.xmlと同様です。
    ※上記の(送信側)log4j2.xmlの<Appnders>の<Socket>の定義部分が、(受信側)の<Appnders>の<RollingFile>の定義に置き換わったものです。

    キャンセル

  • 2019/02/11 16:33

    ご返信ありがとうございます。

    私も現場でRollingFileAppenderからSocketAppenderへの変更を実施した経験がありますが、確かSocketAppenderでもStackTraceは出ていたと思います(両者にログの出方の違いはなかったと思います)。
    明日以降、当該現場のlog4j.xmlの設定内容を確認してみますので、しばらくお待ちください。

    キャンセル

  • 2019/02/12 08:46

    現場環境を確認しました。
    ・StackTraceはSocketAppenderで問題なく出力されている
    ・log4jのバージョンは1.2.15
    ・SocketAppenderの送信側もPatternLayoutとなっており、Pattern設定を送信側/受信側で合わせている
    ・送信側はSocketAppenderそのものではなく、SocketAppenderを継承したカスタムクラスを使用している(但しカスタマイズの目的は、ログに固有の情報を埋め込むためのものであり、ExceptionのStackTrace出力とは無関係(と思われる))
    ・SocketServer自体はカスタマイズ無しのSimpleSocketServerを使用している

    以上の状況ですので、Patternを試行錯誤しながら送信側もPatternLayoutとすることで解決する可能性があると考えられますが、いかがでしょうか。
    (そなりますと、StreamCorruptedExceptionの解消に軸足が移ることになりますが…)

    キャンセル

  • 2019/02/12 23:43

    丁寧な回答、ありがとうございます。現場環境のご確認までしていただき、感謝します。
    SocketAppenderの送信側もPatternLayoutで定義して動作していることが確認できたことも、大変助かりました。まだStreamCorruptedExceptionは解決しておりませんが、PatternLayoutで調査を進めていこうと思います。ただ、サブシステム毎にLoggerを定義し、参照するSocketAppenderはLogger間で共有、出力するログファイルはサブシステム(Logger)毎にPatternLayoutを定義できるようにすることを考えておりましたが、出力先のPatternLayoutとSocketのPatternLayoutを合わせるとなると、Socketの定義はLogger毎に定義しなければいけない、ということが少し残念です。
    質問欄にも追記しましたが、StreamCorruptedException発生時、「invalid type code: 5B」というエラーメッセージが出力されています。もしこの意味がお分かりでしたら、教えていただけると助かります。

    キャンセル

  • 2019/02/13 09:58

    確かにご指摘のとおり、SocketAppenderの送信側と受信側とでLayoutを合わせなければならないのはlog4jのコンセプトに反するような気がします。

    そこで、当方の確認環境で送信側をSimpleLayout(受信側はPatternLayoutのまま)としましたところ、ちゃんとStackTradeが出力されました。

    log4j2ではSimpleLayoutというのは廃止されたようで、更にSimpleLayoutに相当するものが何か当方把握しておらず恐縮ですが、JSONやSyslogといったLayoutも試してくださいませんでしょうか。

    キャンセル

  • 2019/02/13 09:59

    すみません、書き漏らしました。「invalid type code: 5B」の意味は存じ上げません。

    キャンセル

  • 2019/02/18 16:51

    返信、遅くなりました。
    JSONLayoutやSyslogLayout等の助言、ありがとうございます。ただ、あまり時間もかけられない事から、元々共通用としてログ出力用のラッパークラスを作成して実装しているので、そのクラスでException(Throwable)を指定された場合、スタックトレースをStringに変換してメッセージに付加することで、いったん対応することとしました。
    追々JSONLayoutやSyslogLayoutでの検証も行わせていただきたいと思います。ご支援、大変ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    15092questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。