[Javaのログ] P2: Log4jには、ソフトウェアに統合しました

ブログ桐フインから発表された論文, 著者の同意を得ました.

こんにちはみんな, 全然前に ([Javaのログ] P1: ソフトウェア開発におけるログの重要性) について共有しました ロギングの重要性 いくつかの 原則 ロギングするとき. この記事はご案内します 基本的なログモジュールをアプリケーションに統合する方法. 最小の個人からすべてのソフトウェアにロギングを統合する習慣を身に付けるべきです, その使いやすさとソフトウェアがより専門的になるでしょう, 大規模なソフトウェアを作成するときも、馴染みがありはるかに簡単です.
Mình sẽ hướng dẫn cách tích hợp Log4j vào một chương trình ジャワ nhỏ. Trong bài này mình sẽ hướng dẫn cấu hình bằng file XML, các bạn hoàn toàn có thể tìm hiểu và thử cấu hình bằng JSON, YAML, Properties cũng với cấu trúc tương tự. Trong phạm vi bài viết này, để đơn giản nhất có thể nên mình sẽ không sử dụng Maven, thay vào đó sẽ dùng cách add lib vào project thông thường 😀

Trước tiên các bạn cần tải gói jar log4j, ở đây mình sẽ sử dụng phiên bản Log4jの 2.7.
Link download: http://archive.apache.org/dist/logging/log4j/2.7/apache-log4j-2.7-bin.zip
Trong file nén này có rất nhiều gói jar, nhưng để ghi được log thì chỉ cần 2 gói coreAPI là đủ.
後に 2 gói jar trên, các bạn add vào project và bắt đầu code. Nếu ai chưa biết các add lib .jar vào project thì tự google nhé, đây là kiến thức cơ bản 🙂

Trước tiên mình tạo 1 ファイル Main.java cho ví dụ này và khai báo một đối tượng logger 以下のコードとして.

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
 
public class Main {
    static Logger logger = LogManager.getLogger(Main.class);
    public static void main(String[] args) {
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

次に作成します 1 ファイルlog4j2.xml そしてディレクトリに入れます資源 プロジェクトの (正しいファイル名とディレクトリが必要です). これはロギングの構成ファイルになります.
ファイルを画像として構造化する

私の前で一つを設定します アペンダー 画面に書き込む最も簡単なログ コンソール

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss a} %highlight{%-5level} [%15.15t] %style{%40C{1.}.%-20M}{cyan} : %msg%n"/>
        </Console>
    </Appenders>
 
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

アペンダー ログの保存場所の定義に役立つコネクタを宣言する, ログのフォーマット方法.
上で宣言しました 1 タイプアペンダー Console, という名前 Console 出力先として SYSTEM_OUTコマンドライン画面を意味します. その中で、より多くのフォーマットを定義する必要があります 1 ログ行はどのような情報を出力しますか?.
これらのフォーマットの詳細については、 docsLog4jの
https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
ロガー 使用条件を宣言する アペンダー. 上記のように、すべてをログに記録することが条件です レベルログ から デバッグ 燃える コンソール
プログラムをテストして結果を確認する

2019-07-12 22:56:33 PM INFO  [           main]                               n.t.l.Main.main                 : info
2019-07-12 22:56:33 PM WARN  [           main]                               n.t.l.Main.main                 : warn
2019-07-12 22:56:33 PM ERROR [           main]                               n.t.l.Main.main                 : error

ファイル内のコードは Main.java 私はテキストでログ関数を呼び出すだけです 「情報」, 「警告」, "エラー". しかし、表示されたログは完全です 実行時間,ログレベル (INFO, 警告, エラー), パッケージクラス, 方法, ログの表示に非常に便利. それはセクションの設定によるものです PatternLayout
同様に、私はもっと設定します 1 アペンダー ログアウト ファイル 以下のアペンダーを追加することにより

<RollingFile name="File" fileName="logs/server.log"
             filePattern="logs/$${date:yyyy-MM}/%d{dd}/server.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n"/>
    <Policies />
</RollingFile>

結果, ログがファイルに書き込まれると、通常は完全に表示されます パッケージクラス 余白の増加を避けるためにスペースを揃えないでください

2019-07-12 23:08:58 PM INFO [main] net.tunghuynh.logging.Main.main : info
2019-07-12 23:08:58 PM WARN [main] net.tunghuynh.logging.Main.main : warn
2019-07-12 23:08:58 PM ERROR [main] net.tunghuynh.logging.Main.main : error

上記のログファイルのアペンダー, filePatternを自動に設定しました ログファイルを日付で切り取る
だからほんの数ステップ, あなたが持っているだろう ロギング プログラムの基準による. より明確にしたい場合, さらに設定できます アペンダー ファイルに分割する ログ情報, ログエラー, ログデバッグ 制御を容易にし、上記の一般的なログを置き換える.

<RollingFile name="FileInfo" fileName="logs/info.log"
             filePattern="logs/$${date:yyyy-MM}/%d{dd}/info.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n"/>
    <LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
    <Policies />
<RollingFile name="FileWarn" fileName="logs/warn.log"
             filePattern="logs/$${date:yyyy-MM}/%d{dd}/warn.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n"/>
    <LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
    <Policies />
<RollingFile name="FileError" fileName="logs/error.log"
             filePattern="logs/$${date:yyyy-MM}/%d{dd}/error.%i.log">
    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n"/>
    <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
    <Policies />
</RollingFile>

ここに行く, 見始めた アペンダー ストレージパスなどの同様の構成があります ログ, パターンレイアウト, 修正する必要がある場合は、修正する必要があります アペンダー, これらを宣言できるように 財産 値を定義して、 アペンダー

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="patternLayout">%d{yyyy-MM-dd HH:mm:ss a} %-5level [%t] %logger{36}.%M : %msg%n</Property>
        <Property name="logPath">logs</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{yyyy-MM-dd HH:mm:ss a} %highlight{%-5level} [%15.15t] %style{%40C{1.}.%-20M}{cyan} : %msg%n"/>
        </Console>
        <RollingFile name="FileInfo" fileName="${logPath}/info.log"
                     filePattern="${logPath}/$${date:yyyy-MM}/%d{dd}/info.%i.log">
            <PatternLayout pattern="${patternLayout}"/>
            <LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies />
        </RollingFile>
        <RollingFile name="FileWarn" fileName="${logPath}/warn.log"
                     filePattern="${logPath}/$${date:yyyy-MM}/%d{dd}/warn.%i.log">
            <PatternLayout pattern="${patternLayout}"/>
            <LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies />
        </RollingFile>
        <RollingFile name="FileError" fileName="${logPath}/error.log"
                     filePattern="${logPath}/$${date:yyyy-MM}/%d{dd}/error.%i.log">
            <PatternLayout pattern="${patternLayout}"/>
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies />
        </RollingFile>
    </Appenders>
    .......
</Configuration>

だから今ショー 大きくなる アップ, 機能数 オペレーションの増加, すべてのログがまだ1つのファイルに書き込まれている場合、それは非常に 制御しにくい, それが必要なときです チアログ による ビジネス 具体的には.
ただし、すべての企業がログファイルを分離する必要があるわけではありません。, 前の記事で述べたように、ログを分離します 重要な事業 または 多くを扱う 簡単な制御のために. ここでもっと作ります 3 クラス 新しいシミュレーション 3 ビジネス 発生した, そして意志 ロギング 1 クラス 例としてのビジネス.

public class BusinessA {
    Logger logger = LogManager.getLogger(getClass());
    public BusinessA(){
        logger.info("Info From BusinessA");
        logger.warn("Warn From BusinessA");
        logger.error("Error From BusinessA");
    }
}
public class BusinessB {
    Logger logger = LogManager.getLogger(getClass());
    public BusinessB(){
        logger.info("Info From BusinessB");
        logger.warn("Warn From BusinessB");
        logger.error("Error From BusinessB");
    }
}
public class BusinessC {
    Logger logger = LogManager.getLogger(getClass());
    public BusinessC(){
        logger.info("Info From BusinessC");
        logger.warn("Warn From BusinessC");
        logger.error("Error From BusinessC");
    }
}

それから加えて アペンダー プライベートクラスのロギング ビジネス 新しく作成されたアペンダーを使用してクラスを宣言します

.....
    <RollingFile name="LogBusinessA" fileName="${logPath}/business-a.log"
                 filePattern="${logPath}/$${date:yyyy-MM}/%d{dd}/business-a.%i.log">
        <PatternLayout pattern="${patternLayout}"/>
        <Policies />
    </RollingFile>
.....
<Loggers>
        <Logger name="net.tunghuynh.logging.BusinessA" level="debug" additivity="false">
            <AppenderRef ref="LogBusinessA"/>
            <AppenderRef ref="Console"/>
        </Logger>
        ........
    </Loggers>

ビジネス 書き留めます 1 ファイル 個別にログインして画面に書き込む コンソール 単語ログレベル デバッグ オンワード
結果はまだ全体の完全なログを記録します 3 ビジネス 画面に新しく追加されました コンソール, しかしのログ ビジネス ファイルにのみ書き込む business-a.log 次のような一般的なログファイルに表示されるのではなく info.log, warn.log, error.log

あなたのビジネスが扱う場合 多くのクラス その後 パッケージごとの操作の収集 そして、パッケージ名のみを参照するようにログを設定することが可能です クラス全体をパッケージに記録する そこ
物事はそれほど単純ではありません, ショーがなったとき 1 優れたソフトウェアまたはアプリケーション, ハンドル数が増えました その結果、各操作のログファイルをより多く記録する必要があり、容量がますます大きくなります。, 削除すると、ログは失われます, そうでない場合、ファイルまたはトレースログを読み取るのは困難です。, 今、私たちはする必要があります ログカット.
ログファイルをカットするには、はい 2 から 共通のカット 容量 または その時には, 私はいつもします 組み合わせた すべて 2 こちらです. たとえば、ログをカットする 容量が10Mbを超える日付でログをカット, 毎日ログをカットします 1 その日の最後の時間 プライベートフォルダに保存, 処理が多すぎる企業の場合、ログを1時間ごとに削減できます. 例1 アペンダー 次のように、日付と容量によるログ切断を構成します

<RollingFile name="LogBusinessA" fileName="${logPath}/business-a.log"
             filePattern="${logPath}/$${date:yyyy-MM}/%d{dd}/business-a.%i.log">
    <PatternLayout pattern="${patternLayout}"/>
    <Policies>
        <TimeBasedTriggeringPolicy/>
        <SizeBasedTriggeringPolicy size="10 MB"/>
    </Policies>
    <DefaultRolloverStrategy max="10"/>
</RollingFile>

また、システムスパムの場合は避けられません, または苦しむ 1 ログが複数のファイルにカットされたにもかかわらず、何か再試行エラーが常に発生しますが、ファイル数 まだ生まれすぎた サーバーのハードドライブが完全にクラッシュする. だから私は上の設定を追加しましたDefaultRolloverStrategy 保存のみを許可する10 ファイル で1 ログ文字列, ファイルの数を超えると、古いファイルが自動的に削除されます.
これらの設定値は、他のアプリでも再利用する必要があるため、指定することができます財産 上記のように.

あなたのプログラムは 統合された基本的な標準ログモジュール 使用して見るのに十分 chuyên nghiệp hơn rất nhiều. 🙂

これは統合されたチュートリアルなので、便宜上ソースをアップロードします. 誰が使用しますか?IntelliJ IDEその後、プロジェクトを開くことができ、プロジェクト内のライブラリをいつでも構成できます。記事の最後にあるソースをダウンロードできます。.

しかし、それは答えだけです ghilograファイル, ファイル内のログを読み取ると、多くの不便が発生することがあります. 必要な場合の例 ログインしたユーザーのアクションを制御する ソフトウェア, どんな機能を使っていますか?, ソフトウェアでどのようなデータ操作, 一般に、データは代表的である必要があります リンクに文字列があります に従ってください セッションログイン または特定のビジネスストリームは、1つにログインする必要があります データベース または利便性のための同様のアーキテクチャ データクエリ.
この記事はかなり久しぶりなので、ガイドします データベースに非同期ロギングを書き込む 次のセクションで

ダウンロードコード Log4JExample.zip