また、「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,然后返回给用户。