CodeGym/Java Blog/ランダム/Java ロギング
John Squirrels
レベル 41
San Francisco

Java ロギング

ランダム グループに公開済み
人のメンバー
やあ!レッスンを書くときは、実際の仕事で絶対に必要となる特定のトピックがあるかどうかを特に重視します。だから、聞いてください!今日取り上げるトピックは、入社初日からすべてのプロジェクトで間違いなく役立つでしょう。Java ロギングについて説明します。このトピックはまったく複雑ではありません (簡単とも言えます)。しかし、最初の仕事では強調すべき明白な事柄がたくさんあるので、今すぐそれを徹底的に理解することをお勧めします :) さて、始めましょう。

Javaのロギングとは何ですか?

ロギングは、プログラムの動作に関するデータを記録する行為です。このデータを記録する場所を「ログ」と呼びます。すぐに 2 つの疑問が生じます。どのデータがどこに書き込まれるのかということです。「どこ」から始めましょう。プログラムの動作に関するデータは、さまざまな場所に書き込むことができます。たとえば、勉強中にSystem.out.println() を実行することがよくあります。データをコンソールに出力します。最も単純な形式ではありますが、これは確かにログ記録です。もちろん、これはユーザーや製品サポート チームにとってはあまり便利ではありません。当然、IDE をインストールしてコンソールを監視する必要はありません :) 情報を記録するためのより一般的な形式、テキスト ファイルがあります。人間はこの形式のデータを読む方がはるかに快適であり、確かにデータを保存する場合もはるかに便利です。次に 2 番目の質問です。どのプログラム データをログに記録する必要がありますか? それは完全にあなた次第です!Java のロギング システムは非常に柔軟です。プログラムの動作すべてをログに記録するように設定できます。一方で、これは良いことです。しかしその一方で、Facebook や Twitter のログにすべてを書き込んだ場合、そのログがどれほど大きくなるかを想像してみてください。これらの大企業はおそらく、それだけの量のデータを保存する能力を持っているでしょう。しかし、500 ギガバイトのテキスト ログから 1 つの重大なエラーに関する情報を見つけるのがどれほど難しいかを想像してみてください。それは干し草の山から針を探すよりも悪いことです。したがって、Java はエラー データのみをログに記録するように構成できます。あるいは、単なる重大なエラーでも構いません。とはいえ、Java のネイティブ ロギング システムについて語るのは完全に正確ではありません。実際のところ、この機能が言語に追加される前に、プログラマーはログ記録を必要としていました。Java が独自のログ ライブラリを導入するまでに、誰もがすでに log4j ライブラリを使用していました。Java でのログインの歴史は実際には非常に長く、有益です。つまり、Java には独自のロギング ライブラリがありますが、それを使用する人はほとんどいません :) その後、いくつかの異なるロギング ライブラリが登場し、プログラマが使用し始めたとき、互換性の問題が発生しました。さまざまなインターフェイスを備えた十数の異なるライブラリで人々が車輪の再発明を行うのを防ぐために、抽象的な SLF4J フレームワーク (「Service Logging Facade For Java」) が作成されました。これは抽象と呼ばれます。SLF4J クラスのメソッドを使用して呼び出したとしても、内部では実際には、log4j、標準の java.util.logging など、以前のすべてのロギング フレームワークが使用されるからです。ある時点で、他のライブラリにはない Log4j の特定の機能が必要になったが、プロジェクトをこのライブラリに直接リンクしたくない場合は、SLF4J を使用してください。次に、Log4j メソッドを呼び出します。気が変わって Log4j 機能がもう必要ないと判断した場合は、再構成するだけで済みます。ここにLog4j ライブラリはここにあります。次に、アーカイブを解凍し、IntelliJ IDEA を使用して JAR ファイルをクラスパスに追加します。メニュー項目: [ファイル] -> [プロジェクト構造] -> [ライブラリ] 必要な JAR ファイルを選択し、プロジェクトに追加します (ダウンロードしたアーカイブには多くの JAR ファイルが含まれています。必要なファイルは写真を参照してください)。この指示はそのような学生向けであることに注意してください ロギングが必要な理由 - 2ロギングが必要な理由 - 3。 Maven の使い方がわからない人。Maven の使用方法を知っている場合は、通常はそこから始めてみる方が良い (はるかに簡単です)。Maven を使用する場合は、次の依存関係を追加します。
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
素晴らしい!設定を理解しました :) SLF4J がどのように動作するかを見てみましょう。プログラムの作業がどこかに記録されていることを確認するにはどうすればよいでしょうか? これを行うには、ロガーとアペンダーという 2 つのものが必要です。まずは最初から始めましょう。ロガーは、ログの完全な制御を提供するオブジェクトです。ロガーの作成は非常に簡単です。静的なLoggerFactory.getLogger()メソッドを使用してこれを行います。メソッド パラメータは、操作がログに記録されるクラスです。コードを実行してみましょう。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
コンソール出力:
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
ここで何が見えるでしょうか?まず、エラー メッセージが表示されます。これは、必要な設定が不足していることが原因です。したがって、現在、ロガーはエラー メッセージ (ERROR) をコンソールにのみ出力できます。logger.info ()メソッドが機能しませんでした。しかし、logger.error() はそうでした。コンソールには、現在の日付、エラーが発生したメソッドが表示されます ( main)、「ERROR」という単語、そして私たちのメッセージ! ERROR はログレベルです。一般に、ログ エントリに「ERROR」という単語が付いている場合は、プログラムのこの時点でエラーが発生しています。エントリに「INFO」という単語が付いている場合、メッセージは単にプログラムの通常の動作に関する現在の情報を表します。SLF4J ライブラリには、ログを柔軟に構成できるさまざまなログ レベルが多数あります。管理はすべて非常に簡単です。必要なロジックはすべて Java Loggerクラスにすでに含まれています。関連するメソッドを呼び出すだけです。日常的なメッセージをログに記録したい場合は、logger.info()メソッドを呼び出します。エラー メッセージの場合は、logger.error()を使用します。警告を表示するには、logger.warn()を使用します。

さて、アペンダーについて話しましょう

アペンダーはデータが保存される場所です。ある意味、データ ソースの逆、つまり「ポイント B」です。デフォルトでは、データはコンソールに出力されます。前の例では何も設定する必要がなかったことに注意してください。テキストはコンソールに表示され、Log4j ライブラリのロガーはエラー レベルのメッセージのみをコンソールに出力できます。明らかに、テキスト ファイルでログを読み書きした方が便利です。ロガーのデフォルトの動作を変更するには、ファイル アペンダーを構成する必要があります。まず、log4j.xml ファイルを src フォルダーに直接作成する必要があります。XML 形式についてはすでによくご存じでしょう。私たちは最近、XML 形式についてのレッスンを受けました:) ファイルの内容は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
ここでは特に特別なことや難しいことは何もありません :) それでも、内容を見ていきましょう。
<Configuration status="INFO">
これはいわゆる StatusLogger です。これは私たちのロガーとは無関係で、Log4j の内部プロセスで使用されます。status="INFO" の代わりに status="TRACE" を設定すると、Log4j の内部作業に関するすべての情報がコンソールに表示されます (アペンダーがファイルであっても、StatusLogger はデータをコンソールに表示します)。今は必要ないので、そのままにしておきます。
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
ここでアペンダーを作成します。<File>タグは、ファイル アペンダであることを示します。 name="MyFileAppender" はアペンダーの名前を設定します。 fileName="C:\Users\Username\Desktop\testlog.txt" は、すべてのデータが書き込まれるログ ファイルへのパスを示します。 append="true" は、データをファイルの最後に書き込むかどうかを示します。私たちの場合、まさにこれが私たちが行うことです。値を false に設定すると、プログラムが起動されるたびにログ ファイルの古い内容が削除されます。 <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>は書式設定を示します。ここでは、正規表現を使用して、ログ内のテキストのフォーマットをカスタマイズできます。
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
ここではルートレベルを示します。「INFO」レベルを設定しました。これは、(上記の表によると) INFO よりも高いレベルのすべてのメッセージはログに記録されないことを意味します。私たちのプログラムには 3 つのメッセージがあります: 1 つは INFO、1 つは WARN、1 つは ERROR です。現在の構成では、3 つのメッセージすべてがログに記録されます。ルート レベルを ERROR に変更すると、LOGGER.error() メソッド呼び出しからの最後のメッセージのみがログに記録されます。さらに、アペンダーへの参照もここに含まれます。このような参照を作成するには、 <Root>タグ内に<ApprenderRef>タグを作成し、それにref='your appender's name'属性を追加する必要があります。忘れた場合に備えて、ここでアペンダーの名前を設定します。<。そしてこれが私たちのコードです!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
もちろん、これは少し奇抜です (RuntimeException をキャッチするという考えには疑問があります) が、私たちの目的には最適です :) main()メソッドを 4 回続けて実行し、testlog.txt ファイルを見てみましょう。事前に作成する必要はありません。ライブラリによって自動的に作成されます。すべてうまくいきました!:) これでロガーが設定されました。各メソッドにロガー呼び出しを追加して、古いプログラムの一部を試してみることができます。次に、結果のログを見てください :) ログのトピックについて詳しく考察しています。一気に全部読むのは難しいでしょう。そうは言っても、追加の有用な情報がたくさん含まれています。たとえば、testlog.txt ファイルが特定のサイズに達した場合に新しいテキスト ファイルを作成するようにロガーを設定する方法を学びます :) これでクラスは終わりです。今日、あなたは非常に重要なトピックについて学びました。この知識は将来の仕事に間違いなく役立つでしょう。次回まで!:)
コメント
  • 人気
  • 新規
  • 古い
コメントを残すには、サインインしている必要があります
このページにはまだコメントがありません