[妹のSpringBootチュートリアルの詳細な紹介] SpringBoot統合ログslf4jとlogback(4)

市場に出回っているログフレームワーク:

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>

おすすめ

転載: blog.csdn.net/weixin_54707168/article/details/113931198