記事のディレクトリ
市場に出回っているログフレームワーク:
logback、log4j log4j2、slf4j
1.ログとは何ですか?
ログ:システムのリアルタイム動作ステータスを説明する情報。
次に例を示します。System.out.println()ステートメントは、一種の最低レベルのログです。
2.ログファサードとログの実装とは何ですか?
ログファサード:ログ実装の抽象化レイヤーです。
ログの実現:特定のログ機能の実現。
ログの実装を直接使用せず、ログファサードと呼ばれる別のものを作成してみませんか?
ログの実装により、プロジェクトでのユーザーの使用に影響を与えないように、コードの最適化と変更が行われる場合があります。ログファサードの統合インターフェースを使用します。実装レイヤーコードが変更されたと仮定すると、ユーザーはプロジェクトでログを使用しますインターフェイスを呼び出すなど、影響を受けません。
3.一般的なログフレームワークは何ですか?
ログファサード(抽象化レイヤー) | ログの実装 |
---|---|
JCL SLF4j | JUL(java.util.logging)log4 logback log4j2 logback |
実際の使用では、抽象化レイヤーのログファサードが選択され、低レベルのログ実装で使用されます。
SpringBootでデフォルトで選択されるコロケーションは次のとおりです:slf4j + logback
ログファサード:slf4j
ログの実装:ログバック
springboot:最下層はSpringフレームワークであり、SpringフレームワークはデフォルトでJCLを使用します
SpringBootはslf4jとlogbackを選択します
4.slf4jの使用
将来の開発では、loggingメソッドの呼び出しは、ログ実装クラスを直接呼び出すのではなく、ログ抽象化レイヤーのメソッドを呼び出す必要があります。
各ログ実装フレームワークには、独自の構成ファイルがあります。slf4jを使用した後も、構成ファイルはログ実装フレームワークの構成ファイル(つまり、実装フレームワークが使用される構成ファイル)になります。
5.レガシーの問題
(slf4j + logback):Spring(commons-loggin)、Hibernate(jboss-loggin)、Mybatis
slf4jとlogbackを使用しているが、他のプロジェクトを統合した後、他のプロジェクトがさまざまなロギングフレームワークを使用する場合、統合ロギングが必要であり、slf4jを使用してすべてのログを出力します。
システム内のすべてのログをslf4jに統合する方法:
1.最初にシステム内の他のログフレームワークを除外します
2.元のログフレームワークを中間パッケージに置き換えます
3.slf4jの他の実装をインポートします
6.SpringBootログの関係
Pom依存関係分析のヒント:
これを選択すると、グラフ形状の依存関係分析が表示されます。
(1)SpringBootの最下層は、ロギングにslf4j + logbackを使用します
(2)SpringBootも他のログをslf4jに置き換えました
(3)交換時に中間変換パッケージを使用した
(4)他のフレームワークを導入したい場合はどうなりますか?このフレームワークのデフォルトのログ依存関係を必ず削除してください。
例:Springフレームワークを導入した場合、Springフレームワークcommons-loggingのデフォルトのログ依存関係を除外する必要があります。
SpringBootはすべてのログに自動的に適応でき、最下層はslf4j + logbackを使用してログを記録します。他のフレームワークが導入されると、フレームワークが依存する基盤となるロギングフレームワークが除外され、SpringBootはフレームワークに適応できます。
7.SpringBootでのログの使用
ログの使用:
@SpringBootTest
class DemoApplicationTests {
// 获取日志记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
// 日志级别 trace < debug < info < warn < error
// 可以调整日志的输出级别,日志就只会在这个级别及以后的高级别生效
logger.trace("这是trace日志...");
logger.debug("这是debug日志...");
// SpringBoot默认是 info 级别的
logger.info("这是info日志...");
logger.warn("这是warn日志...");
logger.error("这是error日志...");
}
}
ログレベルのトレース<デバッグ<情報<警告<エラー
application.yml
ログ出力レベルはファイルで指定でき、springbootのデフォルトレベルはですinfo级别
。
logging:
level:
# 需要指定哪个包下的日志级别
com.example: trace
file:
# 在当前磁盘的根目录下创建spring和log文件夹,里边创建springboot.log日志文件
path: /spring/log
# 可以使用绝对路径
# path: E:\mylog
# 指定日志文件名,若不指定日志路径,默认在根目录下
# name: springboot.log
8.SpringBootでログ出力形式を指定します
logbackを使用する場合は、logback.xmlまたはlogback-spring.xmlファイルをresourcesディレクトリに直接配置して有効にすることができます。
logback.xml 和 logback-spring.xml 的区别:
logback-spring.xmlファイルは<springProfile name="">
、タグを使用して、どの開発環境でどの形式を使用するかを指定できます。
完全なlogback-spring.xmlファイルは、resourcesディレクトリで使用できます。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 尽量别用绝对路径,如果带参数不同容器路径解释可能不同,以下配置参数在pom.xml里 -->
<property name="log.root.level" value="INFO"/> <!-- 日志级别 -->
<property name="log.other.level" value="INFO"/> <!-- 其他日志级别 -->
<property name="log.base"
value="logs"/> <!-- 日志路径,这里是相对路径,web项目eclipse下会输出到eclipse的安装目录下,如果部署到linux上的tomcat下,会输出到tomcat/bin目录 下 -->
<property name="log.moduleName" value="blog"/> <!-- 模块名称, 影响日志配置名,日志文件名 -->
<property name="log.max.size" value="20MB"/> <!-- 日志文件大小 -->
<!--控制台输出 -->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger.%method:%L) - %cyan(%msg%n)
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
</appender>
<!-- info文件输出 -->
<appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.base}/${log.moduleName}-info.log
</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.base}/archive/${log.moduleName}-info-%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 日志输出的文件的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
</layout>
</appender>
<!-- debug文件输出 -->
<appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.base}/${log.moduleName}-debug.log
</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.base}/archive/${log.moduleName}-debug-%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 日志输出的文件的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
</layout>
</appender>
<!-- warning文件输出 -->
<appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.base}/${log.moduleName}-warn.log
</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.base}/archive/${log.moduleName}-warn-%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 日志输出的文件的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
</layout>
</appender>
<!-- error文件输出 -->
<appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.base}/${log.moduleName}-error.log
</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.base}/archive/${log.moduleName}-error-%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 日志输出的文件的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
</layout>
</appender>
<!-- error文件输出 -->
<appender name="all" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log.base}/${log.moduleName}-all.log
</File><!-- 设置日志不超过${log.max.size}时的保存路径,注意如果 是web项目会保存到Tomcat的bin目录 下 -->
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${log.base}/archive/${log.moduleName}-all-%d{yyyy-MM-dd}.%i.log
</FileNamePattern>
<!-- 当天的日志大小 超过${log.max.size}时,压缩日志并保存 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${log.max.size}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日志输出的文件的格式 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger{56}.%method:%L -%msg%n</pattern>
</layout>
</appender>
<!-- 为某个包下的所有类的指定Appender 这里也可以指定类名称例如:com.aa.bb.ClassName -->
<logger name="com.jg.blog" additivity="false">
<level value="debug"/>
<appender-ref ref="stdout"/>
<appender-ref ref="info"/>
<appender-ref ref="debug"/>
<appender-ref ref="warn"/>
<appender-ref ref="error"/>
<appender-ref ref="all"/>
</logger>
<!-- root将级别为“DEBUG”及大于“DEBUG”的日志信息交给已经配置好的名为“Console”的appender处理,“Console”appender将信息打印到Console -->
<root level="info">
<appender-ref ref="stdout"/> <!-- 标识这个appender将会添加到这个logger -->
<appender-ref ref="info"/>
<appender-ref ref="debug"/>
<appender-ref ref="warn"/>
<appender-ref ref="error"/>
<appender-ref ref="all"/>
</root>
</configuration>