Javaは、JDK1.4のフレームワークの一部としてロギングAPIライブラリを組み込んでいます。現在、これはJavaの組み込みサポートです。ただし、このライブラリは、サードパーティのライブラリが提供する1つ以上の代替ログソリューションを使用できるという意味で、カスタマイズ可能で拡張可能です。これらのサードパーティソリューションには、ログデータを作成するための異なるアプローチがありますが、最終的には、アプリケーションランタイムからメッセージをログに記録するという同じ目標を共有します。この記事では、ロギングの基本を探り、Javaプログラムでどのように使用できるかを示します。
Javaロギング
ログ 通常、ある種の記録の維持を意味します。プログラミングの観点からは、プログラムの実行中にログファイルにメッセージを書き込むプロセスです。永続化されたメッセージログは、通常はプログラマーによって参照され、分析時に予期しない状況を明らかにする可能性のある特定の実行時統計情報を収集します。実際、ロギングが使用される理由は数多くありますが、これはそのうちの1つにすぎません。 Java APIのドキュメントによると、ロギングの主な用途は次の4つです。
- エンドユーザーおよびシステム管理者による問題診断用。
- フィールドサービスエンジニアは、ログに記録されたメッセージから問題を診断し、迅速に修正するのに便利です。
- 開発組織は、特定のサブシステムの内部実行を追跡して分析できます。
- 開発者は、ログに記録されたメッセージから根本的な問題に関する迅速な洞察を得ることで、開発中のアプリケーションをデバッグできます。
Java APIロギングは、本番アプリケーションでも残余として残すことができるという意味で、安価な方法で設計されています。これにより、プログラム実行の効率に大きなオーバーヘッドが生じることはありません。 APIは、ログメッセージの生成を動的に変更するメカニズムを提供します。これにより、最大の効率を必要とする操作中にロギングの影響を最小限に抑えることができます。 APIは、それらを拡張することによってカスタマイズできるいくつかのクラスとインターフェースで構成されています。ロギングAPI全体はjava.util.loggingにパッケージ化されています 。このパッケージのクラスとインターフェースは、Javaのコアロギング機能を提供します。
ロギングレベル
Javaプログラムへのログインの緊急性は、いくつかのレベルに分類できます。レベルアップおよびレベルダウンすることで、本番アプリケーションへのログインコストを増減できます。これは、1つ以上のイベントをログに記録する必要があるアプリケーションの実行の効率を制御する方法です。これは、レベルと呼ばれるクラスを通じて実現されます。 、ロギングの重要性を定義します。ログレベルは、 staticによって順序付けおよび指定されます 次のような整数定数:
- Level.ALL: 重要度に関係なく、すべてのメッセージがログに記録されます
- Level.OFF: ロギングがオフになっています
- Level.SEVERE: 重大な障害を示します。ログに記録する必要があります
- Level.WARNING: 警告メッセージを示します
- Level.INFO: ランタイム情報メッセージ
- Level.CONFIG: 静的構成メッセージ
- Level.FINE: メッセージのトレース
- Level.FINER: 詳細なトレースメッセージ
- Level.FINEST: 非常に詳細なトレースメッセージ
ログコンポーネント
ロガーが必要です Javaであらゆる種類のロギングを行うためのインスタンス。このインスタンスは、データを LogRecordに記録する役割を果たします。 。 LogRecord インスタンスは、ロギングフレームワークと個々のログハンドラーの間でロギング要求を渡すために使用されます。 Java SEには、次の5つのタイプの組み込みハンドラが用意されています。 StreamHandler 、 ConsoleHandler 、 FileHandler 、 SocketHandler 、および MemoryHandler 。ただし、新しいハンドラーを作成することも、カスタマイズとしてこれらの1つを拡張することもできます。ハンドラーは、ログレコードをどう処理するかを決定します。たとえば、ローカルリポジトリに永続化することも、ネットワーク経由でサーバーに渡すこともできます。 Java SEには、次の2つの標準フォーマッタも含まれています。 SimpleFormatter およびXMLFormatter 。これらのフォーマッタは、 LogRecordをフォーマットするために使用されます 人間が読める形式と標準のXML形式にそれぞれ変換します。
LogManagerがあります 名前付きLoggersの階層名前空間など、グローバルロギング情報を追跡するクラス 構成ファイルからのロギング制御プロパティのセット。これはJavaでのログインの中心であり、他の初期化の詳細など、ログに記録する内容、ログに記録する場所をほぼ制御します。
簡単なロギングの例
ロガーの作成 オブジェクトは非常に単純です。これは、それを説明するための非常に単純なコードです。
import java.util.logging.Logger; public class App { private static Logger logger = Logger.getLogger(App.class.getName()); public static void main(String[] args) { logger.info("This is a log message !!!"); logger.info("The name of the logger is " + logger.getName() + " nwhich is same as class name: " + App.class.getName()); } }
ロガー オブジェクトは通常、文字列を使用して名前が付けられます 階層的なドットで区切られた名前空間の値。上記の場合、クラス名と同じです。ただし、名前は任意の文字列値にすることができますが、通常、名前はログに記録されたコンポーネントのパッケージ名またはクラス名に基づいています。 ロガーに保存されない「匿名」ロガーを作成することもできます。 名前空間。
XMLフォーマットを使用した外部ファイルへのログ記録
次のコードでは、ログメッセージは FileHandlerを使用してファイルにリダイレクトされます。 。
注: ファイルはプロジェクトディレクトリに作成されます。 |
FileHandler 指定されたファイルに書き込むことも、回転するファイルのセットに書き込むこともできます。ファイルのローテーションセットは、ベースファイル名に0、1、2などを追加して古いファイルに名前を付けることを意味します。 XMLFormatter FileHandlerで使用されるデフォルトのフォーマットです 。
import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; public class App { private static FileHandler fileHandler; private static Logger logger = Logger.getLogger(App.class.getName()); public static void main(String[] args) throws IOException { fileHandler = new FileHandler(App.class.getName() + ".log"); logger.setLevel(Level.ALL); logger.addHandler(fileHandler); logger.info("Log message redirected to a file"); logger.info("The name of the logger is " + logger.getName() + " nwhich is same as class name: " + App.class.getName()); } }
カスタムフォーマットを使用した外部ファイルへのログ記録
次のコードを少し調整して、メッセージのフォーマットをカスタマイズします。これにより、メッセージが外部ファイルに書き込まれる方法が変わります。
注: フォーマットがどのように変更されたかについて、ログファイルの内容を確認してください。 |
import java.io.IOException; import java.util.logging.*; public class App { private static FileHandler fileHandler; private static Logger logger = Logger.getLogger(App.class.getName()); public static void main(String[] args) throws IOException { fileHandler = new FileHandler(App.class.getName() + ".log"); logger.setLevel(Level.ALL); fileHandler.setFormatter(newCustomFormatter()); logger.addHandler(fileHandler); logger.fine("Log message redirected to a file"); logger.finer("The name of the logger is " + logger.getName()); loggerfinest("This is same as class name: " + App.class.getName()); } private static class CustomFormatter extends Formatter { private static final String format = "[%1$tF %1$tT] [%2$-4s] %3$s %n"; public String format(LogRecord record) { returnString.format(format, record.getMillis(), record.getLevel().getLocalizedName(), record.getMessage()); } } }
それで全部です。 Javaロギングを試して、他の多くの可能性を試してください。必要に応じて、JavaAPIドキュメントを参照してください。
Javaの他のロギングフレームワーク
サードパーティのロギングフレームワークを使用すると便利な場合があり、人気のあるフレームワークがかなりあります。たとえば、SLF4Jによって提供されるロギングAPIは、アプリケーションをロギングフレームワークから切り離すことができる抽象化レイヤーである単純なファサードパターンを使用します。 Log4jは、構文的には組み込みのJavaロギングに似ています。すべてのログメッセージをコンソールに出力するデフォルト設定があります。 Logbackは、Log4jの後継であり、前任者の拡張です。 tinyLogは、JavaとAndroidの両方で使用できる軽量のログフレームワークです。
結論
ロギングプロセスは、本来の機能を簡単かつ効率的に提供できるように設計されています。 JavaでLoggingAPIをすぐに使い始めることができます。デザインは拡張可能であり、開発者の最終的なニーズに応じてカスタマイズできます。この記事では、Javaロギングの基本を垣間見ることができます。簡単にするために、多くの複雑な詳細は省略されています。詳細については、JavaAPIドキュメントおよびその他の適切なドキュメントを参照してください。
参照
- Javaロギングの概要
- JavaAPIドキュメント