JavaRush /Java Blog /Random-JA /なぜログ記録が必要なのでしょうか?

なぜログ記録が必要なのでしょうか?

Random-JA グループに公開済み
こんにちは!講義を書くときは、特定のトピックが実際の仕事で確実に使用されるかどうかに特に注意します。 ログ記録が必要な理由 - 1 注意してください! 今日取り上げるトピックは、仕事の初日からすべてのプロジェクトに間違いなく役立ちます。 ログ記録について説明します。 このトピックはまったく難しくありません (簡単とも言えます)。しかし、最初の仕事では、明らかな事柄に対処するのに十分なストレスがすでにあるはずなので、今すぐ徹底的に整理することをお勧めします:) それでは、始めましょう。ロギングとは何ですか? ロギングとは、プログラムの動作に関するデータをどこかに記録することです。このデータが書き込まれる場所を「ログ」と呼びます。2 つの疑問が同時に生じます。それは、どこに、どのようなデータが記録されるのかということです。「どこで」から始めましょう。プログラムの動作データをさまざまな場所に記録できます。たとえば、学習中に、 を使用してデータをコンソールに出力することがよくありますSystem.out.println()。最も単純ではありますが、これは実際のログ記録です。もちろん、これはクライアントや製品サポート チームにとってはあまり便利ではありません。彼らは明らかに IDE をインストールしてコンソールを監視したくないでしょう :) 情報を記録するための、より一般的な形式であるテキスト ファイルもあります。このようにすると、人々は非常に読みやすくなり、保存も確実に簡単になります。次に 2 番目の質問です。プログラムの動作に関するどのようなデータをログに記録する必要がありますか? しかし、ここではすべてがあなた次第です!Java ログ システムは非常に柔軟です。プログラムの進行状況全体が記録されるように設定できます。一方で、これは良いことです。しかしその一方で、Facebook や Twitter のログにすべてが書き込まれた場合、そのログのサイズがどれくらいになるかを想像してみてください。このような大企業であれば、おそらくこの量の情報さえも保存する能力があるでしょう。しかし、500 ギガバイトのテキストを含むログから 1 つの重大なエラーに関する情報を検索することがどれほど難しいかを想像してみてください。それは干し草の山に針が刺さるよりもさらに悪いです。したがって、Java でのログ記録では、エラー データのみがログ (ログ) に書き込まれるように設定できます。あるいは重大なエラーについても! ただし、「Java にログインする」という言い方は完全に正しいわけではありません。実際のところ、ログ記録の必要性は、この機能が言語に追加される前にプログラマーの間で生じていました。そして、Java が独自のログ ライブラリを持っていたころには、誰もがすでに log4j ライブラリを使用していました。Java でのロギングの歴史は実際には非常に長く、有益です。暇なときに、Habré のこの投稿を読むことができます。つまり、Java には独自のロギング ライブラリがありますが、それを使用する人はほとんどいません :) その後、いくつかの異なるロギング ライブラリが登場し、すべてのプログラマが異なるものを使用し始めたとき、互換性の問題が発生しました。人々が異なるインターフェイスを持つ十数の異なるライブラリを使用して同じことを行うのを防ぐために、slf4j 抽象化フレームワークが作成されました。(「Java のサービス ロギング ファサード」)。これが抽象化と呼ばれるのは、slf4j クラスを使用してそのメソッドを呼び出しても、内部では以前のロギング フレームワーク (log4j、標準 java.util.logging など) がすべて実行されているためです。現在、他のライブラリにはない log4j の特定の機能が必要であるが、プロジェクトをこの特定のライブラリに厳密にリンクしたくない場合は、slf4j を使用してください。そして、彼女はすでに log4j メソッドを「プル」します。気が変わって、log4j 機能がもう必要ないと判断した場合は、別のライブラリを使用するように「ラッパー」 (つまり、slf4j) を再構成するだけで済みます。コード内では特定のライブラリではなく slf4j のメソッドを呼び出すため、コードの動作が停止することはありません。ちょっとした余談。次の例が機能するには、ここからslf4j ライブラリをダウンロードし、ここから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 record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
コンソール出力: エラー StatusLogger Log4j 2 構成ファイルが見つかりません。デフォルト構成 (エラーのみをコンソールに記録) を使用するか、ユーザーがプログラムで提供した構成を使用します。Log4j 2 の内部初期化ログを表示するには、システム プロパティ「log4j2.debug」を設定します。Log4j 2 15:49:08.907 [main] ERROR MyTestClass - プログラムでエラーが発生しました。 ここで何が見えるでしょうか?最初にエラー メッセージが表示されます。現在必要な設定が不足しているために表示されました。したがって、ロガーはエラー メッセージ (ERROR) のみをコンソールにのみ出力できるようになりました。メソッドはlogger.info()実行されませんでした。でも、logger.error()うまくいきました!コンソールには、現在の日付、エラーが発生した方法 ( main)、ERROR という単語、およびメッセージが表示されます。 ERROR はログレベルです。 一般に、ログ エントリに「ERROR」という単語が付いている場合は、プログラムのその時点でエラーが発生したことを意味します。エントリに「INFO」という単語が付いている場合は、それがプログラムの通常の動作に関する現在の情報であることを意味します。SLF4J ライブラリには、ログを柔軟に設定できるようにするさまざまなログ レベルが多数あります。これらは管理が非常に簡単です。必要なロジックはすべてクラスにすでに含まれていますLogger。必要なメソッドを呼び出すだけです。通常のメッセージを投稿したい場合は、 を呼び出しますlogger.info()。エラーメッセージ - logger.error()。警告を表示する -次に、アペンダーlogger.warn() について説明します。 アペンダーはデータが届く場所です。データ ソースの反対は「ポイント B」と言えます。デフォルトでは、データはコンソールに出力されます。前の例では何も設定する必要がなかったことに注意してください。テキストはコンソール自体に表示されますが、log4j ライブラリのロガーはコンソールにエラー レベルのメッセージしか出力できません。テキスト ファイルからログを読み取り、同じファイルにログを保存する方が明らかに便利です。ロガーのデフォルトの動作を変更するには、ファイル アペンダを設定する必要があります。まず、 src フォルダー内、または Maven を使用している場合はリソース フォルダー内に、Maven を使用している場合はリソース フォルダー内にlog4j.xmlファイルを作成する必要があります。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">
これはいわゆるステータスロガーです。これはロガーとは関係がなく、log4j によって内部的に使用されます。status=”INFO” の代わりに status=”TRACE” を設定すると、log4j の内部動作に関するすべての情報がコンソールに出力されます (プログラムのアペンダーがファイルであっても、status-logger はデータをコンソールに出力します) -ベース)。これは今必要ないので、すべてそのままにしておきます。
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\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 つは情報、1 つは警告、1 つはエラーです。現在の構成では、3 つのメッセージすべてがログに書き込まれます。ルート レベルを ERROR に変更すると、LOGGER.error() からの最後のメッセージのみがログに記録されます。さらに、アペンダーへのリンクがここに配置されます。<Root>このようなリンクを作成するには、タグ内にタグを作成し<ApprenderRef>、それにパラメータを追加する必要がありますref=”Name твоего аппендера”。忘れた場合に備えて、ここでアペンダーの名前を作成しました。 <File name="MyFileAppender" そして、これがプログラムのコードです。
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("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
もちろん、これは少し歪んでいます (RuntimeException をキャッチするのは凡庸なアイデアです) が、私たちの目的には最適です :) メソッドをmain()4 回続けて実行して、testlog.txt ファイルを見てみましょう。事前に作成する必要はありません。ライブラリが自動的に作成します。すべてうまくいきました!:) これで、ロガーが設定されました。すべてのメソッドにロガー呼び出しを追加して、以前に作成したいくつかのプログラムを試してみて、結果のログを確認することができます :) さらに読むには、この記事を強くお勧めします。そこでは、ロギングのトピックについて詳しく説明されており、一度に読むのは簡単ではありません。ただし、多くの有用な追加情報が含まれています。たとえば、testlog.txt ファイルが特定のサイズに達した場合に新しいテキスト ファイルを作成するようにロガーを設定する方法を学びます :) これでレッスンは終わりです。今日、あなたは非常に重要なトピックについて学びました。この知識は将来の仕事に間違いなく役立ちます。またね!:)
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION