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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

2回答

3782閲覧

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

sweetfish

総合スコア24

Java

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

0グッド

1クリップ

投稿2019/02/07 01:59

編集2019/02/12 14:27

前提・実現したいこと

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

発生している問題

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

該当のソースコード

Java

1logger.error("エラー!",new IllegalArgumentException("Oops!")); 2```log4j2.xml 3(送信側) 4<Appenders> 5 <Socket name="mySocket" host="localhost" port="4712" reconnectionDelayMillis="100000"> 6 <SerializedLayout /> 7 </Socket> 8</Appenders> 9 10<Loggers> ※rootロガーの記述は省略。 11 <Logger name="mylogger" level="debug"> 12 <AppenderRef ref="mySocket"/> 13 </Logger> 14</Loggers> 15 16(受信側) 17<Appenders> 18 <RollingFile name="mylogger" fileName="c:/applog/test.log" filePattern="c:/applog/test_%d{yyyy-MM-dd}-%i.zip"> 19 <PatternLayout pattern="[${date}]:%-5p - hostname=%X{hostname} user_cd=%X{userCd} %m%n%ex"/> 20 <Policies> 21 <TimeBasedTriggeringPolicy /> 22 </Policies> 23 </RollingFile> 24</Appenders> 25 26<Loggers> ※rootロガーの記述は省略。 27 <Logger name="mylogger" level="debug"> 28 <AppenderRef ref="mylogger"/> 29 </Logger> 30</Loggers> 31### 試したこと 32送信側のSocketAppenderのlayoutを「SerializedLayout」→「PatternLayout」にしてみましたが、java.io.StreamCorruptedExceptionでエラーとなってしまいました。 33----- (追記)発生したException 34ERROR org.apache.logging.log4j.core.net.server.TcpSocketServer.4712 - IOException encountered while reading from socket 35java.io.StreamCorruptedException: invalid type code: 5B 36 37### 補足情報(FW/ツールのバージョンなど) 38log4jバージョン:2.3 39送信側 JDK1.6 受信側 JDK1.8

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/02/11 00:47

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

2019/02/11 06:37

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

2019/02/11 06:40 編集

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

回答2

0

もう2年以上も経ってしまいましたが、ようやく解決方法が分かりました。lo4j2.xml内で「%ex」としている部分を「%xEx{full}」(%の直後の"x"が重要!)とすることでスタックトレースが出力されるようになりました({full}の部分は要件に応じて{short}等にすることも可能です。「https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout」参照)。どうやら"Thrown Proxy"というものと関連するようです。

投稿2021/03/13 02:33

konnok1

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sweetfish

2021/12/23 05:06

時間が経過しているにも関わらず、ご回答をいただき、ありがとうございます。 当方も本ページを見たのが本日になってしまい、お礼が遅くなり、大変申し訳ありません。 せっかくご教示いただいたのですが、log4j2のバージョンアップにより、TcpSocketServerがまだうまく動作していない為、動作確認出来ていない状態です。 TcpSocketServerの起動について、別途質問↓をさせていただいております。もしお気づきの点がございましたら、また教えていただけますと幸いです。 https://teratail.com/questions/375215
sweetfish

2022/07/17 02:46

上記投稿から回答が遅くなりました。 やっとバージョンアップしたLog4j2でのTcpSocketServerを使用して、動作確認し、教えていただいた設定でスタックトレースが出力されました。ありがとうございました。
guest

0

ベストアンサー

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

投稿2019/02/10 14:52

konnok1

総合スコア60

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sweetfish

2019/02/11 06:58

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

2019/02/11 07:33

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

2019/02/11 23:46

現場環境を確認しました。 ・StackTraceはSocketAppenderで問題なく出力されている ・log4jのバージョンは1.2.15 ・SocketAppenderの送信側もPatternLayoutとなっており、Pattern設定を送信側/受信側で合わせている ・送信側はSocketAppenderそのものではなく、SocketAppenderを継承したカスタムクラスを使用している(但しカスタマイズの目的は、ログに固有の情報を埋め込むためのものであり、ExceptionのStackTrace出力とは無関係(と思われる)) ・SocketServer自体はカスタマイズ無しのSimpleSocketServerを使用している 以上の状況ですので、Patternを試行錯誤しながら送信側もPatternLayoutとすることで解決する可能性があると考えられますが、いかがでしょうか。 (そなりますと、StreamCorruptedExceptionの解消に軸足が移ることになりますが…)
sweetfish

2019/02/12 14:43

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

2019/02/13 00:58

確かにご指摘のとおり、SocketAppenderの送信側と受信側とでLayoutを合わせなければならないのはlog4jのコンセプトに反するような気がします。 そこで、当方の確認環境で送信側をSimpleLayout(受信側はPatternLayoutのまま)としましたところ、ちゃんとStackTradeが出力されました。 log4j2ではSimpleLayoutというのは廃止されたようで、更にSimpleLayoutに相当するものが何か当方把握しておらず恐縮ですが、JSONやSyslogといったLayoutも試してくださいませんでしょうか。
konnok1

2019/02/13 00:59

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

2019/02/18 07:51

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問