まず、ログフレームワーク
Xiao Zhang:大規模な分散システムを開発しました。
- System.out.println( "");主要なデータをコンソールに出力し、それを削除しますか?ファイルに書き込みますか?
- システムのいくつかの実行時情報を記録するためのフレームワーク、ログフレームワーク、zhanglogging.jar、
- 背の高いいくつかの機能?非同期モード?自動アーカイブ?xxxx?zhanglogging-good.jar?
- 前のフレームを削除しますか?新しいフレームワークを導入し、以前の関連APIであるzhanglogging-prefect.jarを再変更します。
- JDBC ---データベースドライバ;
統一されたインターフェース層、ログファサード(ログの抽象的な層)を書いた。
特定のログ実装をプロジェクトにインポートします。以前のログフレームワークはすべて実装された抽象レイヤーです。
(1)市場でのログフレームワーク。
JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j ...
ログファサード(ログの抽象層) | ログの実装 |
---|---|
SLF4j(Simple Logging Facade for Java)
|
Log4j(高度なログバックなし) JUL(java.util.logging)(jdkに付属) Log4j2(Apache開発は特に優れていますが、多くのフレームワークはまだ適応されていません) ログバック |
左側でファサード(抽象的なレイヤー)を選択し、右側で実装を選択します。
- ログファサード:SLF4J;
- ログの実現:Logback;
- SpringBoot:最下層はSpringフレームワークであり、SpringフレームワークはデフォルトでJCLを使用します。
SpringBootはSLF4jとlogbackを選択します。
第二に、SLF4jログ slf4j公式サイトリンクの使用
(1)システムでSLF4jを使用する方法。
将来の開発では、loggingメソッドの呼び出しは、ログの実装クラスを直接呼び出すのではなく、ログ抽象化レイヤーでメソッドを呼び出す必要があります。
slf4j jarおよびlogback実装jarをシステムにインポートします。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
各ログ実装フレームワークには、独自の構成ファイルがあります。slf4jを使用した後も、構成ファイルはログ実装フレームワークの独自の構成ファイルになります。
(2)レガシー問題(以前のフレームワークは独自のロギングフレームワークを使用し、最後のシステムは多くの異なるロギングフレームワークを使用していました)
- slf4j + logback
- 春(コモンズロギング)
- Hibernate(jboss-logging)
- MyBatis、xxxx
他のフレームワークと私がslf4jを使用して一緒に出力した場合でも、ロギングフレームワークのレコードを統合する方法は?
- システム内のすべてのログをslf4jに統合する方法。
- まず、システム内の他のログフレームワークを除外します
- 次に、元のロギングフレームワークをミドルウェアに置き換えます
- 次に、slf4jの他の実装をインポートします
3、Spring Bootログ関係
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
SpringBootはこれをログ機能に使用します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
基礎となる依存関係
要約:
- SpringBootの最下層でも、ロギングにslf4j + logbackを使用します
- SpringBootは他のログもslf4jに置き換えました。
- 中間交換パッケージ?(カラムパッケージ用のビームを盗む)
@SuppressWarnings("rawtypes")
public abstract class LogFactory {
static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J =
"http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
//中间包 实际是对log4j日志 new slf4j的对象 进行替换过度
static LogFactory logFactory = new SLF4JLogFactory();
他のフレームワークを導入したい場合はどうなりますか?このフレームワークのデフォルトのログ依存関係を削除する必要がありますか?
Springフレームワークはcommons-loggingを使用します。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
結論:
SpringBootは自動的にすべてのログを適応させることができ、最下層はslf4j + logbackを使用してログを記録します。他のフレームワークを導入する場合、このフレームワークが依存するログフレームワークを除外するだけで済みます。
4、Spring Bootログの使用
(1)Spring Boot 2.2.5公式ウェブサイトログの指示のデフォルト設定
- SpringBootは、デフォルトでログを設定するのに役立ちます。
// 记录器
Logger LOGGER = LoggerFactory.getLogger(SpringBootTest.class);
@Test
public void contextLoad(){
// System.out.println();
/**
* 日志级别由高到低
* 日志级别:ERROR,WARN,INFO,DEBUG,或TRACE。
* 可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
*/
LOGGER.trace("日志踪迹");
LOGGER.debug("日志debug模式");
//SpringBoot默认给我们使用的是info级别的
//,没有指定级别的就用SpringBoot默认规定的级别;root级别
LOGGER.info("日志提示信息");
LOGGER.warn("日志警告信息");
LOGGER.error("日志提示错误信息");
}
ログ出力フォーマットの説明:
日志输出格式: %d表示日期时间, %thread表示线程名, %-5level:级别从左显示5个字符宽度 %logger{50} 表示logger名字最长50个字符,否则按照句点分割。 %msg:日志消息, %n是换行符 --> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 调整日志隔离级别 wxw目录下的调成trace springboot 默认是root级别
#logging.level.com.wxw=trace
# 默认是控制台输出
# 写入spring.log指定的目录。名称可以是确切的位置,也可以相对于当前目录。
#logging.file.path=springboot/log
# 指定目录 logging.file.name :写入指定的日志文件。名称可以是确切的位置,也可以相对于当前目录。
#logging.file.name=springboot/boot.log
# 在控制台输出的日志的格式
#logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
#logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
ロギングプロパティ:
logging.file.name |
logging.file.path |
例 | 説明文 |
---|---|---|---|
(いいえ) |
(いいえ) |
コンソールの記録のみ。 |
|
特定のファイル |
(いいえ) |
|
指定したログファイルに書き込みます。名前は、正確な場所にすることも、現在のディレクトリからの相対にすることもできます。 |
(いいえ) |
特定のディレクトリ |
|
|
(2)カスタムログ設定
クラスパスに適切なライブラリを含めることで、さまざまなロギングシステムをアクティブ化Environment
できます。また、クラスパスのルートディレクトリまたは次のSpring プロパティで指定された場所に適切な構成ファイルを 提供することで、さまざまなロギングシステムをさらにカスタマイズできますlogging.config
。
- デフォルトのロギングを無効にする:
org.springframework.boot.logging.LoggingSystem
systemプロパティを使用して、Spring Bootが特定のロギングシステムを使用するように強制できます。この値は、実装の完全修飾クラス名である必要がありますLoggingSystem
。値を使用して、Spring Bootのログ設定を完全に無効にすることもできますnone。
- 各ログフレームワークの独自の構成ファイルをクラスパスの下に配置します。SpringBootはデフォルトの構成を使用しません
ロギングシステム | カスタマイズ |
---|---|
ログバック |
|
Log4j2 |
|
JDK(Java Util Logging) |
|
注:
- logback.xml:ログフレームワークによって直接認識されます。
- logback-spring.xml:ログフレームワークはログ構成アイテムを直接ロードしません。ログ構成はSpring Bootによって解析され、Spring Bootの高度なプロファイル機能を使用できます
- Springboot環境はオープンモードに切り替わります、(1)プロパティ/ yml設定ファイル(2)コマンドライン設定
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
可以指定某段配置只在某个环境下生效
</springProfile>
たとえば、次のとおりです。
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
-->
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ---->
[%thread] ---> %-5level %logger{50} - %msg%n</pattern>
</springProfile>
<springProfile name="!dev">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ====
%-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
</appender>
ログ構成ファイルとしてlogback.xmlを使用し、プロファイル機能も使用すると、次のエラーが発生します
no applicable action for [springProfile]
5、Spring Bootスイッチングログフレームワーク
slf4jのログ適応図に従って、関連する切り替えを実行できます。
(1)slf4j + log4jの方法。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
log4j2に切り替える
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>