「インターネットアーキテクチャ」ソフトウェアアーキテクチャ-Javaログシステム

ログシステムに非常に多くのjarパッケージがある理由を理解しました。数日間のログ記録の後、システムはオンラインディスクを爆破します。具体的にログを構成して使用する方法、いくつかの構成は情報がログであり、エラーがログであり、見つけるのが非常に面倒です。オンラインで問題がない場合、私たちはめったに気にしません。問題がある場合、それは本当に迷惑です。対応するログスルーを見つけます。分散開発の場合、ログ管理がelkのような統合ツールを使用せず、異なるマシンに分散していると、10台のマシンに移動してログを順番に検索する必要があります。非常に面倒ですか。 ?今日は、ログ全体を一度に実行しましょう。システムは理解します。

JAVAのログ印刷コンポーネントとは何ですか

名前 説明
log4j
ログバック
log4j2
java.util.logging
  • Springフレームワークがログを印刷したいと仮定すると、どのコンポーネントを選択する必要がありますか?

アプリケーションで実際に使用されているログコンポーネントのみに基づいて、それらのいずれも選択できないことがわかりました。それ以外の場合は、ログの複数のコピーが印刷されます。アプリケーションで実際に使用されているロギングコンポーネントであるApacheCommons Logingを見つける方法は、この問題を解決します

  • Apache Commons Loging(JCL)

Commons Loging自体は、ログインターフェイスのみを提供します。実行時に対応するコンポーネントを動的に検索する具体的な実装は何ですか。例:log4j、jdk14loogerなど。ただし、この動的バインディング方法は、システムが特に大きい場合にバインディング障害を引き起こします。今、より人気のあるslf4jは、静的バインディングに基づいてこの問題を解決しますか?

  • slf4j

Sl4j自体もログインターフェイスのみを提供します。コモンロギングとは異なり、classPathに追加された次のjarパッケージを使用して、使用される実装を示し
ます。•slfj-log4j12.jar(log4jを示す)
•slf4j-jdk14.jar(指定されたjdkを示すLooging)
•slf4j-jcl.jar(指定されたjclを示します)
•log4j-slf4j-impl(指定されたlog4j2を示します)
•logback-classic(指定されたログバックを示します)

  • ファサードパターン

JCLとslf4jはどちらも
、システムの複雑さを隠し、クライアントがシステムにアクセスするためのインターフェースを提供するファサードモード(ファサードモード)を使用します。このタイプのデザインパターンは構造パターンです。サブシステム内のインターフェイスのグループに対して、統合アクセスインターフェイスが提供されます。このインターフェイスにより、サブシステムへのアクセスまたは使用が容易になります。

簡単に言えば、このモードは、外部ユーザーが簡単に使用できるように、いくつかの複雑なプロセスをインターフェースにカプセル化することです。このモードでは、3つの役割が設計されています。

1.ファサードの役割:外観モデルの中核。これは顧客の役割によって呼び出され、サブシステムの機能に精通しています。お客様の役割のニーズに応じて、機能のいくつかの組み合わせが内部で予約されています。

2.サブシステムの役割:サブシステムの機能を実現します。顧客の役割とファサードには不明です。システム内で相互作用することも、外部から呼び出すこともできます。

3.顧客の役割:Facedeを呼び出して実現する機能を完了します。

ログの履歴

最初に表示されたのは、Apacheオープンソースコミュニティのlog4jでした。このログは、実際に最も広く使用されているロギングツールであり、Javaロギングの事実上の標準になっています。しかし、当時、Sunはlog4jと戦うためにjdk1.4にJULログの実装を追加しましたが、混乱を招きました。これも批判のポイントです。もちろん、他にもロギングツールがあり、開発者は必然的に混乱を招きます。これらのロギングシステムは相互に関連していないため、置き換えと統合は難しいものになっています。アプリケーションがlog4jを使用し、次に別のチームのライブラリを使用するとします。彼らはJULを使用します。アプリケーションは2つのロギングシステムを使用する必要があります。次に、simplelogを使用する2番目のライブラリがあります。この時点であなたは壊れると推定されていますが、これはどうなるのでしょうか?この状況は解決策を見つけるためにあなたに任されています、どうすればそれを解決できますか?抽象化するには、インターフェイスレイヤーを抽象化し、各ログ実装を適合または転送して、他のユーザーに提供されるこれらのライブラリが抽象化レイヤーを直接使用できるようにします。はい、オープンソースコミュニティは、ロギングフレームワークであるJCLと呼ばれるコモンズロギングの抽象化を提供します。これは、主流と互換性のあるロギング(log4j、JUL、simplelog)を実現し、基本的に世界を統合する優れた仕事をします。最も有名な春もJCLに依存しています。物事は確かに美しいように見えますが、美しい日は長くはなく、別の優れたログフレームワークslf4jの追加は、より混沌としたシーンにつながりました。偶然にも、slf4j(CekiGülcü)の作者はlog4jの作者であり、JCLでは不十分だと感じたので、自分でもっとエレガントなものを作りたかったので、slf4jログシステムが誕生し、親子を実現しました。 slf4jの場合-ログバックは確かによりエレガントですが、多くのコードベースが以前にJCLを使用したことがあるため、slf4jとJCLの間にはブリッジ変換がありますが、統合中にはまだ多くの問題があります。これは、多くの初心者にとって非常に厄介です。 log4jだけよりも優れています。時代ははるかに「複雑」であり、これに注意を払うことができます。確かに多くの不満があります。この時点で終了するはずですが、CekiGülcüは、戻って「兄貴」であるlog4jを保存する必要があると感じたため、log4j2が誕生し、log4j2もslf4jログシステムに参加しました。未来。

slf4jのデザインは確かにもっとエレガントです。それはより馴染みのある方法を採用しています-インターフェースと実装の分離。純粋なインターフェースレイヤー-slf4j-apiプロジェクトがあります。これは基本的にログインターフェースを完全に定義するので、開発のために必要なのはこの。インターフェイスがある場合は、それを実装する必要があります。最も尊敬される実装はlogbackです。Logbackはslf4j-apiインターフェイスを完全に実装し、log4jよりもパフォーマンスが優れています。また、可変パラメータープレースホルダーログ出力メソッドなどの新機能も実装しています。log4jの使用がより一般的であるため、このユーザーグループをサポートする必要があることを説明しました。slf4j-log4j12は、log4jのアダプターと見なされるslf4j-apiも実装します。同じ理由で、JUL、slf4j-jdk14などのアダプターがあります。JCLおよびその他のロギングシステムを使用するユーザーがslf4jに簡単に切り替えることができるようにするために、次のようなさまざまなブリッジプロジェクトが提供されます。jcl-over-slf4jはJCLへのすべての呼び出しをslf4jにブリッジします。APIとJCLがわかります。 jcl-over-slf4jのは同じであるため、これら2つのjarは共存できません。jul-to-slf4jはjulへの呼び出しをslf4jにブリッジし、log4j-over-slf4jはlog4jへの呼び出しをslf4jにブリッジします。

ログ追加ファイル

log4j2の構成

  • HelloSlf4j
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloSlf4j {
    
    
    private static Logger logger = LoggerFactory.getLogger(HelloSlf4j.class);

    public static void main(String[] args) {
    
    
      /*  org.apache.log4j.Logger logger1=   org.apache.log4j.Logger.getLogger(HelloSlf4j.class);
        logger1.error("log4-error - abcd");
        logger1.info("log4- info -abcd");*/


        for (int i = 0; i < 2000; i++) {
    
    
            logger.error("slf4j- error - abcd");
            logger.info("slf4j- info -abcd");
        }
    }
}

  • log4j2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="error">
    <!-- 定义输出源 -->
    <Appenders>
        <Console name="Console" target="SYSTEM_ERR">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
        </Console>
        <!--  测试环境使用-->
        <File name="file" fileName="logs/all.log" append="false">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
        </File>
        <RollingFile name="rollingFile" fileName="logs/all-3.log"
                     filePattern="logs/$${date:yyyy-MM-dd}/all-%d{yyyy-MM-dd-HH}-%i.zip">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="2 KB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>


        <RollingFile name="errorRollingFile" fileName="logs/error2.log"
                     filePattern="logs/$${date:yyyy-MM-dd}-error/error-%d{yyyy-MM-dd-HH}-%i.log">
            <PatternLayout pattern="%d [%-5level][%t] %m (%C:%F:%L) %n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="2 KB"/>
            </Policies>
            <DefaultRolloverStrategy max="5"/>
        </RollingFile>
    </Appenders>

    <!--  具体的日志配置 name =-->
    <Loggers>
        <AsyncRoot  level="debug">
            <AppenderRef ref="errorRollingFile"/>
        </AsyncRoot>
    </Loggers>
</Configuration>
  • pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>tuling-logging</groupId>
    <artifactId>tuling</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--slf4j门面 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!--  log4j2 桥接包 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.3</version>
        </dependency>

        <!--  log4j2 实现 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
        </dependency>
        <!--  log4j2 实现 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.3</version>
        </dependency>







        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.4</version>
        </dependency>

    </dependencies>


</project>

PS:Log4j 2には、LMAX分離ライブラリに基づく次世代の非同期ログシステムが含まれています。マルチスレッド環境では、非同期ログシステムにより、Log4j 1.xおよびLogbackと比較してパフォーマンス(スループットと遅延)が10倍向上します。元のテキストは次のとおりです。

Log4j 2には、LMAXDisruptorライブラリに基づく次世代の非同期ロガーが含まれています。マルチスレッドのシナリオでは、非同期ロガーのスループットはLog4j 1.xおよびLogbackの10倍で、レイテンシーは桁違いに低くなります。

おすすめ

転載: blog.csdn.net/zhugeaming2018/article/details/110367800