背景紹介
開発では、System.out.println() を使用して情報を出力することがよくありますが、System.out を多用するとリソースの消費が増加するため、これは良くありません。実際のプロジェクトでは slf4j の logback を使用してログを出力していますが、これは非常に効率的ですが、Spring Boot にはログ システムが提供されており、logback が最適です。
百度百科事典からの一節を引用します。
Java 用の Simple Logging Facade である SLF4J は、特定のロギング ソリューションではなく、さまざまなロギング システムにのみサービスを提供します。公式声明によると、SLF4J はログ システムのシンプルなファサードであり、エンド ユーザーがアプリケーションをデプロイするときに必要なログ システムを使用できるようになります。
この段落の一般的な意味は、統一された方法でログ コードを記述するだけでよく、どのログ システムやログがどのような形式で出力されるかを気にする必要がないということです。これらは、プロジェクトのデプロイ時にバインドされたログ システムに依存するためです。たとえば、slf4j を使用してプロジェクト内のログを記録し、log4j をバインドする (つまり、対応する依存関係をインポートする) 場合、ログは log4j のスタイルで出力されます。後で、logback のスタイルでログを出力するように変更する必要があります。プロジェクト内のコードを変更することなく、log4j を logback に置き換えるだけです。これは、サードパーティコンポーネントによって導入されたさまざまなログシステムの学習コストがほぼゼロであり、その利点はこれだけでなく、簡潔なプレースホルダーの使用とログレベルの判断にもあります。
slf4jを使用します
slf4j を使用したロギングは非常に簡単で、LoggerFactory を使用して作成するだけです。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
private static final Logger logger = LoggerFactory.getLogger(Test.class);
// ……
}
application.yml でのログの構成
application.yml ファイル内のログ構成を見てみましょう。
logging:
config: logback.xml
level:
com.itcodai.course03.dao: trace
logging.config は、プロジェクトの開始時に読み取る構成ファイルを指定するために使用されます。ここでは、ログ構成ファイルはルート パスの下の logback.xml ファイルとして指定されます。ログに関する関連構成情報は、logback.xml ファイルに配置されます。logging.level は、特定のマッパーのログの出力レベルを指定するために使用されます。上記の構成は、com.itcodai.course03.dao パッケージにあるすべてのマッパー ログの出力レベルがトレースであることを示しています。これは、操作データベースの SQL を出力し、問題の特定を容易にするために開発中にトレースに設定します。運用環境では、ログ レベルをエラー レベルに設定します。)。
一般的に使用されるログ レベルは降順で、ERROR、WARN、INFO、DEBUG です。
Logback.xml 構成ファイルの解析
上記の application.yml ファイルでは、主にログの設定に使用されるログ設定ファイル logback.xml を指定しました。logback.xml では、ログの出力形式、パス、コンソール出力形式、ファイル サイズ、保存時間などを定義できます。それを分析してみましょう:
<1> ログの出力形式と保存パスを定義する
<configuration>
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
</configuration>
この定義の意味を見てみましょう。まず、「LOG_PATTERN」という名前の形式を定義します。ここで、%date は日付を表し、%thread はスレッド名を表し、%-5level は左から 5 文字幅で表示されるレベルを表し、%logger{36} は最大 36 文字のロガー名を表し、%msg はログ メッセージを表し、%n は改行を表します。
次に、「FILE_PATH」という名前のファイル パスを定義すると、ログがこのパスに保存されます。%i は i 番目のファイルを意味します。ログ ファイルが指定されたサイズに達すると、ログは新しいファイルに生成されます。ここで、i はファイル インデックスです。ログ ファイルの許容サイズを設定できます。これについては後述します。ここで注意すべき点は、Windows システムでも Linux システムでも、ログ保存先のパスは絶対パスである必要があります。
<2> コンソール出力を定義する
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
このノードを使用して、「CONSOLE」として定義されたコンソール出力 (class="ch.qos.logback.core.ConsoleAppender") の構成を設定します。上で定義した出力形式 (LOG_PATTERN) を使用して出力し、${} を使用して引用符で囲むだけです。
<3> ログファイルの関連パラメータを定義します。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按照上面配置的FILE_PATH路径来保存日志 -->
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!-- 日志保存15天 -->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 单个日志文件的最大,超过则新建日志文件存储 -->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!-- 按照上面配置的LOG_PATTERN来打印日志 -->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
「FILE」という名前のファイル構成を定義するために使用します。これは、主にログ ファイルの保存時間、単一のログ ファイルの保存サイズ、ファイルの保存パス、ログの出力形式を構成します。
<4> ログ出力レベルを定義する
<configuration>
<logger name="com.itcodai.course03" level="INFO" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
上記の定義を使用して、最後にプロジェクトのデフォルトのログ出力レベルを定義します。ここではレベルを INFO として定義し、INFO レベルのログに対して上で定義したコンソール ログ出力とログ ファイルを参照するパラメータを使用します。このようにして、logback.xml ファイル内の構成がセットアップされます。
実用的な使用法: Logger を使用してプロジェクト内のログを出力する
コードでは通常、Logger オブジェクトを使用してログ情報を出力します。これにより、出力するログ レベルを指定でき、非常に便利なプレースホルダーもサポートされます。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/log")
public String testLog() {
logger.debug("=====测试日志debug级别打印====");
logger.info("======测试日志info级别打印=====");
logger.error("=====测试日志error级别打印====");
logger.warn("======测试日志warn级别打印=====");
// 可以使用占位符打印出一些参数信息
String str1 = "blog.itcodai.com";
String str2 = "blog.csdn.net/eson_15";
logger.info("======倪升武的个人博客:{};倪升武的CSDN博客:{}", str1, str2);
return "success";
}
}
プロジェクトを開始し、ブラウザに「localhost:8080/test/log」と入力して、コンソールのログ レコードを確認します。
======测试日志info级别打印=====
=====测试日志error级别打印====
======测试日志warn级别打印=====
======倪升武的个人博客:blog.itcodai.com;倪升武的CSDN博客:blog.csdn.net/eson_15
INFO レベルが DEBUG レベルよりも高いため、デバッグ行は出力されません。logback.xml のログ レベルが DEBUG に設定されている場合は、4 つのステートメントがすべて出力されます。これは自分でテストできます。同時に、D:\logs\course03\ ディレクトリを開くことができます。このディレクトリには、プロジェクトの開始後に生成されたすべてのログ レコードが含まれています。プロジェクトがデプロイされた後、ほとんどの人はログ ファイルを調べて問題を特定します。