Javaロギング・フレームワーク--JCL(Jakarta Commonsのロギング)

また、「Apacheのコモンズログ」として知られている「Jakarta Commonsのロギング」と呼ばれるJCLは、Apacheが提供する共通ログAPIです。統一されたインタフェースが提供する「すべてのJavaロギングを達成」であるJCLデザインモード「アダプタモード」を使用するには、そのクラスは、特定のロギングフレームワークのログに委託適応で動作します、それ自体これは、ログの実装を提供しますが、(非常に弱いですSimpleLog)。これは、一般的に単独で使用されていません。これは、開発者が特定のログを達成するためのさまざまなツールを使用することができます:Log4jに、JDK独自のログ(7月)

二つの基本的なJCL抽象クラスがありますログイン(基本的なレコーダー)たLogFactory(ログのインスタンスを作成するための責任)

図1に示したログ継承システム:

図2に示されたLogFactory継承システム:

Log4JLogger、Jdk14Loggerので、適応クラスがあります。

Log4JLoggerのクラス「org.apache.log4j.Logger」クラスに委任する「org.apache.log4j.Logger」タイプ、すなわちLog4JのLoggerクラスで、操作の方法、従ってコールログLog4JLoggerクラスを含みます実行
Jdk14Loggerのクラスは、「java.util.logging.Loggerの」カテゴリ「のjava.util.loggingに委託される操作Jdk14Loggerクラスのメソッドを呼び出してログインするためのLoggerクラス、中つまりJavaロギングのAPIが含まれています。ロガー「クラスの実行

"のJclと7月、log4j1、log4j2、logbackの統合":https://jybzjf.iteye.com/blog/2238792
"コモンズ・ログ詳細既存のクラスローダの問題を":https://yq.aliyun.com/articles/46888

A、JCLエントリー

ビルドにAPIプロジェクトのログJCL + Javaの:

1.ビルドのMavenプロジェクト:JCLのjarパッケージ

<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

TestDemo作成2.:なし他のロギング実装インタフェースJCLを、ネイティブJDKが自動的にログに記録されます(7月)

  @Test
    public void testQuick() throws Exception{
//        获取log日志记录器对象
        Log log = LogFactory.getLog(JCLTest.class);
//        日志记录输出
        log.info("hello jcl");
    }

ビルドにJCL + Log4Jのプロジェクト:

1. JCLインタフェースのlog4jログ

まず、Mavenプロジェクトで実装されたjarパッケージのlog4jログを追加

        <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

設定ファイルの内容とlog4j.properties commons-logging.properties 2.次に、2つのファイルが作成され

次のように設定ファイルをlog4j.properties:

#配置根  Loggers控制日志的输出级别与日志是否输出
log4j.rootLogger=trace,console

#配置输出到控制台  Appenders是指定日志的输出方式
log4j.appender.console=org.apache.log4j.ConsoleAppender
#指定输出控制台
log4j.appender.console.Target = System.out
#指定布局,输出日志的格式
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#指定布局的参数
log4j.appender.console.layout.ConversionPattern=[%-10p] %r %l %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n

commons-logging.properties設定ファイルを次のように

org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger

3.最後にデモテストは、JCLは、達成達成log4jロギングなるのlog4j呼び出し、

  @Test
    public void testQuick() throws Exception{
//        获取log日志记录器对象
        Log log = LogFactory.getLog(JCLTest.class);
//        日志记录输出
        log.info("hello jcl");
    }

コモンズ・ログは、ログを結合達成します

LogFactory.getLog(JclTest.class)ソース次のように

public static Log getLog(Class clazz) throws LogConfigurationException {
    return getFactory().getInstance(clazz);
}

取得プロセスのログは、大きく2つの段階に分けられます

  • (文字通りログは生産工場である)たLogFactoryプロセスを取得します。LogFactoryImpl:によって提供さコモンズ・ロギングたLogFactoryデフォルトの実装
  • たLogFactoryに応じてログ取得処理。Jdk14Logger、Log4JLogger、SimpleLog:コモンズ・ロギング実装では、デフォルトのログを提供します。

おそらくコモンズ-loggingパッケージの内容を見てみましょう。

第二に、なぜ我々はログファサードを使用する必要があります

インタフェース開発のための1、特定のカテゴリにもはや依存。カップリングコードを減らします

2.プロジェクトの実装クラスの異なるログを導入することによって、ログが柔軟フレームを切り替えることができます

3.統一されたAPI、開発者は簡単に習得して使用します

4.統一構成管理プロジェクトのログを促進します

三、JCL原則

1.ログ実装クラスのダイナミックローディングたLogFactory

取得プロセスの2.1たLogFactory

以下から取得するたLogFactory、いくつかの方法

(1)属性取得システム

System.getProperty("org.apache.commons.logging.LogFactory")

(2)SPI機構Javaを使用して

Java用のSPIメカニズムは、詳細はここでは説明しない、自分で検索することができます。次のように検索パスは、次のとおりです。

META-INF/services/org.apache.commons.logging.LogFactory

検索は、パッケージが含まれているjarファイルがたLogFactoryを達成し、指定に対応する検索ファイルが含まれているだけです

コモンズ・ロギング構成ファイルから(3)

コモンズ・ロギングはまたcommons-logging.propertiesという名前の、独自の構成ファイルを持つことができますが、現在はほとんどの部分は、我々はそれを使用する必要はありません。設定ファイルの場合、属性を読み取ろうと「org.apache.commons.logging.LogFactory」コンフィギュレーション・ファイルに対応する値から

(4) 默认的 org.apache.commons.logging.impl.LogFactoryImpl

LogFactoryImpl 是 commons-logging 提供的默认实现

2.2根据 LogFactory 获取 Log 的过程

这时候就需要寻找底层是选用哪种类型的日志

就以 commons-logging 提供的默认实现为例,来详细看下这个过程:

(1) 从 commons-logging 的配置文件中寻找 Log 实现类的类名

从commons-logging.properties 配置文件中寻找属性为 "org.apache.commons.logging.Log" 对应的 Log 类名

(2) 从系统属性中寻找 Log 实现类的类名

System.getProperty("org.apache.commons.logging.Log")

(3) 如果上述方式没找到,则从 classesToDiscover 属性中寻找

classesToDiscover 属性值如下:

private static final String[] classesToDiscover = {
    "org.apache.commons.logging.impl.Log4JLogger",
    "org.apache.commons.logging.impl.Jdk14Logger",
    "org.apache.commons.logging.impl.Jdk13LumberjackLogger",
    "org.apache.commons.logging.impl.SimpleLog"
};

3.获取具体的日志实现,通过查看源代码可以发现,执行"LogFactory.getLog(Main.class)"语句的时候,最终是执行LogFactoryImp类中的discoverLogImplementation方法,在该方法中有如下代码语句:

for(int i = 0; i < classesToDiscover.length && result == null; ++i)
 {
        result = this.createLogFromClass(classesToDiscover[i], logCategory, true);
}

它会尝试根据上述类名,依次进行创建,如果能创建成功,则使用该 Log,然后返回给用户。

发布了17 篇原创文章 · 获赞 11 · 访问量 8000

おすすめ

転載: blog.csdn.net/LOVE_Me__/article/details/104286506