Log4J Tutorial:効率的なJavaアプリケーションロギングのためのロガーの設定方法
本番環境でコードを実行するとき 可視性とはどういう意味ですか? 主に、メトリック、アプリケーションの正常性、可用性を介したアプリケーションのパフォーマンスなど、トラブルシューティングする必要がある場合はそのログ、または何が遅くなるのか、どのように高速化するのかを把握する必要がある場合はトレースが必要です。
メトリックは、インフラストラクチャの各要素のパフォーマンスに関する情報を提供します。 トレースを使用すると、コード実行とフローの広いビューとコード実行メトリックが表示されます。 最後に、適切に細工されたログは、コードロジックの実行とコード内で何が起こっていたかについての貴重な洞察を提供します。 上記の各部分は、アプリケーションと実際にはシステム全体の可観測性にとって重要です。 今日、私たちは単一の部分、すなわちログにのみ焦点を当てます。 より正確には、Javaアプリケーションログです。 メトリックに興味がある場合は、監視する必要がある主要なJVMメトリックに関する記事をチェックしてください。
しかし、それに入る前に、このフレームワークを使用してコミュニティに影響を与えた問題に対処しましょう。 2021年12月9日、Log4Shellと呼ばれる重大な脆弱性が報告されました。 CVE-2021-44228として識別され、攻撃者はApache Log4J2バージョン2.14.1以下を実行しているマシンを完全に制御し、脆弱なサーバー上で任意のコードを実行できるように Log4Jshellの脆弱性に関する最近のブログ記事では、お客様が影響を受けているかどうかを判断する方法、問題を解決する方法、およびSematextでシステムとユーザー
Log4J1.x End Of Life
2015年5月、ロギングサービスプロジェクト管理委員会はLog4J1と発表した。xは人生の終わりに達していた。 すべてのユーザーはLog4J2に移行することをお勧めします。このブログ記事では、現在のLog4Jの設定、特にlog4j2を理解するのに役立ちます。xバージョン-その後、最新かつ最高のLog4Jバージョンへの移行をお手伝いします。
“私はLog4J1を使用しています。x、どうすればいいの?”. 慌てないでください、それには何も問題はありません。 Log4Jへの移行計画を立てる2.x.私はちょうど読み続ける方法を紹介します:). あなたのアプリケーションは、そのためにあなたに感謝します。 移行後は、セキュリティの修正、パフォーマンスの向上、およびはるかに多くの機能が得られます。
“新しいプロジェクトを始めていますが、どうすればいいですか?”. ちょうどLog4J2を使用してください。Xすぐに、Log4J1についても考えないでください。x. あなたがそれで助けが必要な場合は、私はあなたが必要とするすべてを説明し、このJavaロギングチュートリアルをチェックしてください。
Javaでのログイン
Javaでのログインの背後には魔法はありません。 それはすべて、適切なJavaクラスとそのメソッドを使用してログイベントを生成することになります。 Java logging guideで説明したように、
を開始するには複数の方法がありますもちろん、最も素朴なものであり、従うのに最適なパスではありません。アウトとシステム。クラスを誤る。 はい、あなたはそれを行うことができ、あなたのメッセージは標準出力と標準エラーに行くだけです。 通常、それはコンソールに印刷されるか、ある種のファイルに書き込まれるか、または/dev/nullに送信されて永遠に忘れられることを意味します。 このようなコードの例は次のようになります:
public class SystemExample { public static void main(String args) { System.out.println("Starting my awesome application"); // some work to be done System.out.println( String.format("My application %s started successfully", SystemExample.class) ); }}
上記のコード実行の出力は次のようになります:
Starting my awesome applicationMy application class com.sematext.logging.log4jsystem.SystemExample started successfully
それは完璧じゃないでしょうか? 私はどのクラスがメッセージを生成したか、そしてデバッグ中に重要で重要な多くの”小さな”ものについての情報を持っていません。
実際にデバッグに接続されていない他のものが欠けています。 実行環境、複数のアプリケーションまたはマイクロサービス、およびログ集中化パイプライン構成を簡素化するためにロギングを統合する必要性につ システムを使用して。アウト、または/およびシステム。ロギング目的でコードをerrすると、ロギング形式を調整する必要があるときはいつでも、それを使用するすべての場所をやり直す必要があります。 私はそれが極端であることを知っていますが、私を信じて、私たちはシステムの使用を見てきました。”伝統的な”アプリケーション展開モデルの本番コードに出ています! もちろん、システムにログインします。outはコンテナ化されたアプリケーションのための適切な解決策であり、あなたの環境に合った出力を使用する必要があります。 それについて覚えておいてください!
上記のすべての理由と、私たちが考えていない多くの理由から、Log4j、Log4J2、Logback、javaなど、可能なロギングライブラリのいずれかを調べるべきです。ユーティルJava Development Kitの一部であるロギング。 このブログ記事では、Log4Jを使用します。
抽象化層–SLF4J
Javaアプリケーションに適したロギング-ソリューションを選択するトピックは、Javaでのロギングに関するチュートリアルですでに説明した 私たちは、少なくとも言及されたセクションを読むことを強くお勧めします。
JAVAコードとLog4Jの間の抽象化レイヤーであるSLF4Jを使用します。 Simple Loggingファサードは、Log4J、Logback、javaなどの一般的なログフレームワークのバインディングを提供します。ユーティルログを記録します。 次の単純化された方法でログメッセージを書き込むプロセスを想像してみてください:

を使用したjaveロギングなぜ抽象化レイヤーを使用するのか尋ねることができますか? 答えは非常に簡単です–最終的には、ログフレームワークを変更し、アップグレードし、残りの技術スタックと統合することができます。 抽象化レイヤーを使用する場合、このような操作は非常に簡単です–あなただけのログフレームワークの依存関係を交換し、新しいパッケージを提供します。 抽象化レイヤーを使用しない場合は、コードを変更する必要があります。 何かを記録する各クラス。 非常に素晴らしい開発経験ではありません。
ロガー
Javaアプリケーションのコードは、ログイベントの作成と操作を可能にする主要な要素の標準セットと対話します。 私たちは、Javaロギングチュートリアルで重要なものをカバーしてきましたが、私は私たちが常に使用するクラスの一つ、ロガーについてあなたを思い出させ
Loggerは、アプリケーションがロギング呼び出しを行うために使用する主なエンティティです。 Loggerオブジェクトは、通常、特定のユースケースにコンテキストバインドを提供するために、単一のクラスまたは単一のコンポーネントに使用されます。 これは、適切なログレベルでログイベントを作成し、さらなる処理のためにそれを渡すためのメソッドを提供します。 通常は、次のように対話する静的オブジェクトを作成します:
... Logger LOGGER = LoggerFactory.getLogger(MyAwesomeClass.class);
そして、それはすべてです。 期待できることがわかったので、Log4Jライブラリを見てみましょう。
Log4J
Log4Jを使用する最も簡単な方法は、Javaアプリケーションのクラスパスにライブラリを含めることです。 これを行うには、ビルドファイルにバージョン1.2.17を意味する最新の利用可能なlog4jライブラリを含めます。
私たちはGradleを使用し、単純なアプリケーションとGradleビルドファイルの依存関係セクションは次のようになります:
dependencies { implementation 'log4j:log4j:1.2.17'}
コードの開発を開始し、Log4Jを使用してロギングを含めることができます:
package com.sematext.blog;import org.apache.log4j.Logger;public class ExampleLog4j { private static final Logger LOGGER = Logger.getLogger(ExampleLog4j.class); public static void main(String args) { LOGGER.info("Initializing ExampleLog4j application"); }}
上記のコードでわかるように、静的なgetLoggerメソッドを使用してLoggerオブジェクトを初期化し、クラスの名前を指定しました。 これを行うと、静的ロガーオブジェクトに簡単にアクセスし、それを使用してログイベントを生成できます。 私たちはmainメソッドでそれを行うことができます。
一つのサイドノート-getLoggerメソッドは、引数として文字列を使用して呼び出すこともできます。:
private static final Logger LOGGER = Logger.getLogger("com.sematext.blog");
これは、ロガーを作成し、comの名前を関連付けることを意味します。セマテクストそれを持つブログ。 コード内の他の場所で同じ名前を使用する場合、Log4Jは同じLoggerインスタンスを返します。 これは、複数の異なるクラスからのロギングを単一の場所に結合したい場合に便利です。 たとえば、単一の専用ログファイルに支払いに関連するログが含まれています。
Log4Jは、適切なログレベルを使用して新しいログイベントを作成できるメソッドのリストを提供します。 それらは:
- public void trace(オブジェクトメッセージ)
- public void debug(オブジェクトメッセージ)
- public void info(オブジェクトメッセージ)
- public void warn(オブジェクトメッセージ)
- public void error(オブジェク)
一つの一般的な方法は:
- public void log(レベルレベル、オブジェクトメッセージ)
Java logging tutorialのブログ記事で、Java loggingレベルについて説明しました。 あなたがそれらを認識していない場合は、ログレベルがロギングのために重要であるように、それらに慣れるために数分かかります。 ただし、ログレベルを使い始めたばかりの場合は、ログレベルガイドも参照することをお勧めします。 私たちは、彼らが何であるかから正しいものを選ぶ方法、そして意味のある洞察を得るためにそれらを利用する方法まですべてを説明します。
上記のコードを実行すると、標準コンソールで取得する出力は次のようになります:
log4j:WARN No appenders could be found for logger (com.sematext.blog.ExampleLog4j).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
期待したログメッセージが表示されませんでした。 Log4jは、構成が存在しないことを通知しました。 Oooops、Log4Jの設定方法について話しましょう…
Log4J設定
Log4Jロギングを設定する方法は複数あります。 たとえば、静的初期化ブロックを含めるなどして、プログラムで実行できます:
static { BasicConfigurator.configure();}
上記のコードは、ログをデフォルトの形式でコンソールに出力するようにLog4Jを構成します。 この例のアプリケーションを実行すると、次のように出力されます:
0 INFO com.sematext.blog.ExampleLog4jProgrammaticConfig - Initializing ExampleLog4j application
ただし、プログラムでLog4Jを設定することはあまり一般的ではありません。 最も一般的な方法は、プロパティファイルまたはXMLファイルを使用することです。 コードを変更し、次の内容のlog4j.propertiesファイルを含めることができます:
log4j.rootLogger=DEBUG, MAINlog4j.appender.MAIN=org.apache.log4j.ConsoleAppenderlog4j.appender.MAIN.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIN.layout.ConversionPattern=%r %-5p %c %x - %m%n
そうすれば、デフォルトで使用されるルートロガーを作成することをLog4Jに伝えました。 デフォルトのログレベルはDEBUGに設定されているため、重大度DEBUG以上のログイベントが含まれます。 そのため、DEBUG、INFO、WARN、ERROR、およびFATAL。 また、ロガーにMAINという名前を付けました。 次に、ロガーの出力をコンソールに設定し、パターンレイアウトを使用してロガーを設定します。 それについては、ブログ記事の後半で詳しく説明します。 上記のコードを実行すると、次のように出力されます:
0 INFO com.sematext.blog.ExampleLog4jProperties - Initializing ExampleLog4j application
必要に応じて、log4j.propertiesファイルを変更して、次のようなファイルを使用することもできますlog4j.xml….. XML形式を使用した同じ構成は、次のようになります:
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration> <appender name="MAIN" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %-5p %c %x - %m%n" /> </layout> </appender> <root> <priority value ="debug"></priority> <appender-ref ref="MAIN" /> </root></log4j:configuration>
log4j.propertiesを次のように変更するとしますlog4j.xml 一つは、クラスパスにそれを維持し、次のように私たちの例のアプリケーションの実行は次のようになります:
0 INFO com.sematext.blog.ExampleLog4jXML - Initializing ExampleLog4j application
では、Log4Jはどのファイルを使用するかをどのように知っていますか? それを見てみましょう。
初期化プロセス
Log4Jが実行されている環境に関する仮定をしていないことを知っておくことが重要です。 Log4jは、既定のログイベントの宛先を想定していません。 起動すると、log4j.configurationプロパティを検索し、指定されたファイルを設定としてロードしようとします。 ファイルの場所をURLに変換できない場合、またはファイルが存在しない場合は、クラスパスからファイルをロードしようとします。
これは、起動時に-Dlog4J.configurationを指定し、正しい場所を指すことによって、クラスパスからLog4J構成を上書きできることを意味します。 たとえば、otherというファイルが含まれているとします。次の内容のxml:
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration> <appender name="MAIN" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%r %-5p %c %x - %m%n" /> </layout> </appender> <root> <priority value ="debug"></priority> <appender-ref ref="MAIN" /> </root></log4j:configuration>
そして、-Dlog4J.configuration=/opt/sematext/otherでコードを実行します。xmlコードからの出力は次のようになります:
0 INFO com.sematext.blog.ExampleLog4jXML - Initializing ExampleLog4j application
Log4J Appenders
私たちはすでに私たちの例でappendersを使用していました…まあ、本当に一つだけ–ConsoleAppender。 その唯一の目的は、ログイベントをコンソールに書き込むことです。 もちろん、多数のログイベントやシステムが異なる環境で実行されている場合、純粋なテキストデータを標準出力に書き込むのは、コンテナで実行していない限り、最良の考えではないかもしれません。 そのため、Log4Jは複数のタイプのアペンダをサポートしています。 Log4Jアペンダの一般的な例をいくつか示します:
- ConsoleAppender-ログイベントをシステムに追加するアペンダー。アウトまたはシステム。デフォルトはSystemでerrします。出ろ このアペンダーを使用すると、アプリケーションのコンソールにログが表示されます。
- FileAppender–ログイベントをファイルシステムに格納する定義されたファイルに追加するアペンダー。
- RollingFileAppender–FileAppenderを拡張し、ファイルが定義されたサイズに達したときにファイルを回転させるアペンダー。 RollingFileAppenderを使用すると、ログファイルが非常に大きくなり、維持が困難になるのを防ぎます。
- SyslogAppender–ログイベントをリモートのSyslogデーモンに送信するアペンダー。
- JDBCAppender–ログイベントをデータベースに格納するアペンダー。 このアペンダーはエラーを保存せず、一般的にログイベントをデータベースに保存するのが最善の考えではないことに注意してください。
- SocketAppender–シリアル化されたログイベントをリモートソケットに送信するアペンダー。 このアペンダーは、シリアル化された生のログイベントを送信するため、レイアウトを使用しないことに注意してください。
- NullAppender–ログイベントを破棄するだけのアペンダー。
さらに、単一のアプリケーションに対して複数のアペンダを設定することができます。 たとえば、コンソールとファイルにログを送信できます。 以下のlog4j。プロパティファイルの内容はまさにそれを行います:
log4j.rootLogger=DEBUG, MAIN, ROLLINGlog4j.appender.MAIN=org.apache.log4j.ConsoleAppenderlog4j.appender.MAIN.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIN.layout.ConversionPattern=%r %-5p %c %x - %m%nlog4j.appender.ROLLING=org.apache.log4j.RollingFileAppenderlog4j.appender.ROLLING.File=/var/log/sematext/awesome.loglog4j.appender.ROLLING.MaxFileSize=1024KBlog4j.appender.ROLLING.MaxBackupIndex=10log4j.appender.ROLLING.layout=org.apache.log4j.PatternLayoutlog4j.appender.ROLLING.layout.ConversionPattern=%r %-5p %c %x - %m%n
私たちのルートロガーは、デバッグの重大度から始まるすべてを記録し、メインとローリングの二つのアペンダにログを送信するように設定されています。 メインロガーは、すでに見たものです–コンソールにデータを送信するものです。
第二のロガー、ローリングと呼ばれるものは、この例ではより興味深いものです。 これは、ファイルにデータを書き込むRollingFileAppenderを使用し、ファイルの大きさと保持するファイルの数を定義します。 私たちの場合、ログファイルはawesomeと呼ばれるべきです。ログを記録し、/var/log/sematext/ディレクトリにデータを書き込みます。 各ファイルは最大1024KBで、10個以上のファイルが保存されていない必要があります。 より多くのファイルがある場合、log4jがそれらを認識するとすぐにファイルシステムから削除されます。
上記の設定でコードを実行すると、コンソールは次の内容を出力します:
0 INFO com.sematext.blog.ExampleAppenders - Starting ExampleAppenders application1 WARN com.sematext.blog.ExampleAppenders - Ending ExampleAppenders application
/var/log/sematext/awesomeにあります。ログファイルが表示されます:
0 INFO com.sematext.blog.ExampleAppenders - Starting ExampleAppenders application1 WARN com.sematext.blog.ExampleAppenders - Ending ExampleAppenders application
アペンダーログレベル
アペンダーの良いところは、ログを記録するときに考慮する必要があるレベルを持つことができるということです。 これまでに見てきたすべての例は、DEBUG以上の重大度を持つすべてのメッセージを記録しました。 Comのすべてのクラスでそれを変更したい場合はどうすればよいですか。セマテクストブログパッケージ? 変更する必要があるのはlog4j.propertiesファイルだけです:
log4j.rootLogger=DEBUG, MAINlog4j.appender.MAIN=org.apache.log4j.ConsoleAppenderlog4j.appender.MAIN.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIN.layout.ConversionPattern=%r %-5p %c %x - %m%nlog4j.logger.com.sematext.blog=WARN
上記の設定ファイルの最後の行を見てください。 私たちはlog4j.logger接頭辞を使用し、loggerがcomと呼ばれると言いました。セマテクストブログは、重大度レベルWARN以上にのみ使用する必要があるため、エラーと致命的です。
アプリケーションコードの例は次のようになります:
public static void main(String args) { LOGGER.info("Starting ExampleAppenderLevel application"); LOGGER.warn("Ending ExampleAppenderLevel application");}
上記のLog4J設定では、ロギングの出力は次のようになります:
0 WARN com.sematext.blog.ExampleAppenderLevel - Ending ExampleAppenderLevel application
ご覧のとおり、WARNレベルのログのみが含まれていました。 それはまさに私たちが望んでいたものです。
Log4J Layouts
最後に、ログファイル内のデータの構造を制御するLog4Jロギングフレームワークの一部であるレイアウト。 Log4jは、PatternLayout、SimpleLayout、XMLLayout、HTMLLayout、EnchancedPatternLayout、DateLayoutなどのいくつかのデフォルトの実装を提供します。
ほとんどの場合、PatternLayoutが発生します。 このレイアウトの背後にある考え方は、ログの構造を定義するためのさまざまな書式設定オプションを提供できることです。 例のいくつかは次のとおりです:
- d–ログイベントの日付と時刻、
- m–ログイベントに関連付けられたメッセージ、
- t–スレッド名、
- n–プラットフォーム依存の行区切り文字、
- p-ログレベル。
使用可能なオプションの詳細については、PatternLayoutの公式Log4J Javadocsを参照してください。
PatternLayoutを使用するとき、どのオプションを使用するかを設定できます。 日付、ログイベントの重大度、角括弧で囲まれたスレッド、およびログイベントのメッセージを記述したいとしましょう。 このようなパターンを使うことができます:
%d %-5p - %m%n
この場合の完全なlog4j.propertiesファイルは次のようになります:
log4j.rootLogger=DEBUG, MAINlog4j.appender.MAIN=org.apache.log4j.ConsoleAppenderlog4j.appender.MAIN.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIN.layout.ConversionPattern=%d %-5p - %m%n
日付を表示するには%d、5文字を使用して重大度を表示するには%-5p、スレッドの場合は%t、メッセージの場合は%m、行区切りの場合は%nを使用します。 このサンプルコードを実行した後にコンソールに書き込まれる出力は、次のようになります:
2021-02-02 11:49:49,003 INFO - Initializing ExampleLog4jFormatter application
ネストされた診断コンテキスト
ほとんどの現実世界のアプリケーションでは、ログイベントは単独では存在しません。 それは特定の文脈に囲まれています。 このようなコンテキストをスレッドごとに提供するために、Log4Jはいわゆるネストされた診断コンテキストを提供します。 このようにして、サンプルアプリケーションのように、セッション識別子などの追加情報を指定して特定のスレッドをバインドできます:
NDC.push(String.format("Session ID: %s", "1234-5678-1234-0987"));LOGGER.info("Initializing ExampleLog4jNDC application");
x変数を含むパターンを使用する場合、指定されたスレッドの各ログラインに追加情報が含まれます。 私たちの場合、出力は次のようになります:
0 INFO com.sematext.blog.ExampleLog4jNDC Session ID: 1234-5678-1234-0987 - Initializing ExampleLog4jNDC application
セッション識別子に関する情報がログラインにあることがわかります。 参考までに、この例で使用したlog4j.propertiesファイルは次のようになります:
log4j.rootLogger=DEBUG, MAINlog4j.appender.MAIN=org.apache.log4j.ConsoleAppenderlog4j.appender.MAIN.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIN.layout.ConversionPattern=%r %-5p %c %x - %m%n
Mapped Diagnostic Context
ログイベントに含めることができるコンテキスト情報の第二のタイプは、mapped diagnostic contextです。 MDCクラスを使用して、追加のキーと値に関連する情報を提供できます。 ネストされた診断コンテキストと同様に、マップされた診断コンテキストはスレッドバインドです。
アプリケーションコードの例を見てみましょう:
MDC.put("user", "[email protected]");MDC.put("step", "initial");LOGGER.info("Initializing ExampleLog4jNDC application");MDC.put("step", "launch");LOGGER.info("Starting ExampleLog4jNDC application");
ユーザーとステップの2つのコンテキストフィールドがあります。 ログイベントに関連付けられたマップされたすべての診断コンテキスト情報を表示するには、パターン定義でX変数を使用するだけです。 例えば:
log4j.rootLogger=DEBUG, MAINlog4j.appender.MAIN=org.apache.log4j.ConsoleAppenderlog4j.appender.MAIN.layout=org.apache.log4j.PatternLayoutlog4j.appender.MAIN.layout.ConversionPattern=%r %-5p %c %X - %m%n
上記のコードを構成と共に起動すると、次の出力が生成されます:
0 INFO com.sematext.blog.ExampleLog4jMDC {{step,initial}{user,[email protected]}} - Initializing ExampleLog4jNDC application1 INFO com.sematext.blog.ExampleLog4jMDC {{step,launch}{user,[email protected]}} - Starting ExampleLog4jNDC application
パターンを変更することで、どの情報を使用するかを選択することもできます。 たとえば、マップされた診断コンテキストのユーザーを含めるには、次のようなパターンを記述できます:
%r %-5p %c %X{user} - %m%n
今回の出力は次のようになります:
0 INFO com.sematext.blog.ExampleLog4jMDC [email protected] - Initializing ExampleLog4jNDC application0 INFO com.sematext.blog.ExampleLog4jMDC [email protected] - Starting ExampleLog4jNDC application
一般的な%Xの代わりに%X{user}を使用したことがわかります。 これは、特定のログイベントに関連付けられたマップされた診断コンテキストからのuser変数に関心があることを意味します。
Log4J2への移行
Log4J1からの移行。XをLog4J2にする。xは難しいものではなく、場合によっては非常に簡単かもしれません。 内部Log4J1を使用しなかった場合。また、DOMConfiguratorクラスとPropertyConfiguratorクラスを使用しませんでした移行は、log4j-1.2-apiを含めるのと同じくらい簡単でなければなりません。Log4Jの代わりにjar jarファイル1.x jarファイル。 それはLog4J2を可能にするでしょう。あなたのコードで動作するようにx。 Log4J2を追加する必要があります。x jarファイルは、設定を調整し、voilà-あなたは完了です。
Log4J2についてもっと知りたい場合。x Java logging tutorialとそのLog4J2をチェックしてください。x専用セクション。
ただし、内部Log4J1を使用した場合。X classes、Log4Jからの移行方法に関する公式移行ガイド1.XをLog4J2にする。xは非常に参考になります。 必要なコードと設定の変更について説明し、疑問があるときには非常に貴重です。
ログ管理ツールを使用した集中ログ
ログイベントをコンソールまたはファイルに送信することは、単一のアプリケーションには適していますが、アプリケーシ このような場合、データ量はすぐに管理不能になり、自己ホスト型またはベンダーのいずれかからの専用ソリューションが必要になります。 そして、通常はファイルにログを書き込まないコンテナはどうですか? ログが標準出力に出力された、またはコンテナが強制終了されたアプリケーションのトラブルシューティングとデバッグを行うにはどうすればよい
ここでは、ログ管理サービス、ログ解析ツール、クラウドロギングサービスが活躍しています。 ログを管理して最大限に活用することを真剣に考えているときに、このようなソリューションを使用することは、エンジニアの間で書かれていないJava たとえば、ログ監視および管理ソフトウェアであるSematext Logsは、上記のすべての問題などを解決します。
Sematext Logsのような完全に管理されたソリューションを使用すると、環境の別の部分を管理する必要はありません。 このようなセットアップは、小さくて安価に開始することができますが、彼らはしばしば大きくて高価に成長します。 インフラコストだけでなく、管理コストの面でも。 あなたが知っている、時間と給与。 マネージドサービスを使用する利点の詳細については、ログ記録のベストプラクティスに関するブログ記事で説明します。

アラートとログ集約は、問題に対処する際にも重要です。 最終的には、Javaアプリケーションの場合、ガベージコレクションログをオンにしてログの分析を開始すると、ガベージコレクションログが必要にな メトリクスと相関するこのようなログは、ガベージコレクション関連の問題をトラブルシューティングするための非常に貴重な情報源です。
要約
Log4J1にもかかわらず。xは、それはまだ世界中で使用されるレガシーアプリケーションの多数に存在している長い時間前に人生の終わりに達しました。 その若いバージョンへの移行はかなり簡単ですが、かなりのリソースと時間を必要とする可能性があり、通常は最優先事項ではありません。 特に、手順、法的要件、またはその両方が監査を必要とする大企業では、すでに実行されているシステムで何かを変更する前に、長くて高価なテストが しかし、移行を開始したばかりの人や移行を考えている人にとっては、Log4J2を覚えておいてください。xはそこにあり、すでに成熟しており、高速で、安全で、非常に能力があります。
しかし、Javaアプリケーションのログ記録に使用しているフレームワークに関係なく、Sematext Logsなどの完全に管理されたログ管理ソリューションを使用することをお勧めします。 それを試してみる! あなたはそれをテストドライブするために利用可能な14日間の無料トライアルがあります。