Springboot Logback日志多文件输出(按日期和大小分割)

2023-11-02

在早期的日志Slf4j+Log4j使用方式中,我们使用最多的就是LoggerFactory来获取一个Logger实例,logback的原理也一样。本文示例文件分割按照日志大小和日期进行分割。

目录

配置logback.xml

配置需要的propery属性

配置日志追加方式

配置日志级别

配置日志模板

logback 多日志文件操作

logback 官方按大小和时间分隔规则

日志未按照大小删除和控制文件总大小 

logback完整示例配置

Java日志工具类

系统启动日志示例

示例效果


配置logback.xml

配置需要的propery属性

这部分可以配置到logback.properties 需要开启扫描才行,下面是直接在logback.xml配置

 <!--设置日志目录-->
    <property name="LOG_HOME" value="./applog"/>
    <!--这里需要将value改成项目名称-->
    <property name="LOG_NAME" value="patrol-mobile-service"/>

配置日志追加方式

配置appender标签包括文件生成规则,内容的输出规则等

  <!--控制台日志格式-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
         
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

配置日志级别

注意:日志级别不区分大小写

  <!--默认日志级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF-->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>

配置日志模板

 logger的配置就是LoggerFactory需要的模板,只有配置了工厂获取才会生效。

  <!--业务操作日志-->
    <logger name="POSITION_LOG" level="info" additivity="false">
        <appender-ref ref="POSITION_LOG_APPENDER"/>
    </logger>
    <logger name="EVENT_LOG" level="info" additivity="false">
        <appender-ref ref="EVENT_LOG_APPENDER"/>
    </logger>
    <logger name="TRACK_LOG" level="info" additivity="false">
        <appender-ref ref="TRACK_LOG_APPENDER"/>
    </logger>
    <logger name="FILE_LOG" level="info" additivity="false">
        <appender-ref ref="FILE_LOG_APPENDER"/>
    </logger>
    <logger name="RESTART_LOG" level="info" additivity="false">
        <appender-ref ref="RESTART_LOG_APPENDER"/>
    </logger>

logback 多日志文件操作

logback 官方按大小和时间分隔规则

http://logback.qos.ch/manual/appenders.html

<configuration>
  <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>mylog.txt</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
       <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
       <maxFileSize>100MB</maxFileSize>    
       <maxHistory>60</maxHistory>
       <totalSizeCap>20GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>


  <root level="DEBUG">
    <appender-ref ref="ROLLING" />
  </root>

</configuration>

日志未按照大小删除和控制文件总大小 

参考官方说明:http://logback.qos.ch/manual/appenders.html#TimeBasedRollingPolicy

需要配置:cleanHistoryOnStart标签值为true默认是false.

<!-- 文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

logback完整示例配置

根据前面介绍的一个完整配置示例

<configuration>
    <!--设置日志目录-->
    <property name="LOG_HOME" value="./applog"/>
    <!--这里需要将value改成项目名称-->
    <property name="LOG_NAME" value="patrol-mobile-service"/>
    <!--控制台日志格式-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>
    <!-- 文件日志策略:每天生成多个日志文件-->
    <!-- <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
         <file>${LOG_HOME}/${LOG_NAME}.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">      
             <fileNamePattern>${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.%i.zip</fileNamePattern>  
             <minIndex>1</minIndex>
             <maxIndex>1000</maxIndex>
         </rollingPolicy>
         <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">       
             <maxFileSize>100MB</maxFileSize>  
         </triggeringPolicy>  
         <encoder>    
             <pattern> %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>  
         </encoder>
     </appender>-->

    <!-- 【实时位置同步】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="POSITION_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-position-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--仅输出INFO日志-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 接收INFO级别和高于INFO级别的日志-->
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

    <!-- 【用户事件同步】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="EVENT_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-event-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--仅输出INFO日志-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 接收INFO级别和高于INFO级别的日志-->
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

    <!-- 【用户轨迹同步】件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="TRACK_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-track-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--仅输出INFO日志-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 接收INFO级别和高于INFO级别的日志-->
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

    <!-- 【事件附件同步】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="FILE_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-file-sync.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--仅输出INFO日志-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 接收INFO级别和高于INFO级别的日志-->
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

    <!-- 【系统重启服务】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="RESTART_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-restart.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--仅输出INFO日志-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 接收INFO级别和高于INFO级别的日志-->
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

    <!-- 【REDIS服务】文件日志策略:每天生成一个日志文件,保存30天的日志文件-->
    <appender name="REDIS_LOG_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_HOME}/${LOG_NAME}-redis.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>10GB</totalSizeCap>
            <cleanHistoryOnStart>true</cleanHistoryOnStart>
        </rollingPolicy>
        <!--仅输出INFO日志-->
        <!--<filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!-- 接收INFO级别和高于INFO级别的日志-->
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} | %msg%n</pattern> 
        </encoder>
    </appender>

    <!--默认日志级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF-->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
    <!--特定日志级别,其中xxx为项目名称-->
    <logger name="com.patrol.mobile.controller" level="info" additivity="false">
        <appender-ref ref="CONSOLE"/>
    </logger>

    <!--业务操作日志-->
    <logger name="POSITION_LOG" level="info" additivity="false">
        <appender-ref ref="POSITION_LOG_APPENDER"/>
    </logger>
    <logger name="EVENT_LOG" level="info" additivity="false">
        <appender-ref ref="EVENT_LOG_APPENDER"/>
    </logger>
    <logger name="TRACK_LOG" level="info" additivity="false">
        <appender-ref ref="TRACK_LOG_APPENDER"/>
    </logger>
    <logger name="FILE_LOG" level="info" additivity="false">
        <appender-ref ref="FILE_LOG_APPENDER"/>
    </logger>
    <logger name="RESTART_LOG" level="info" additivity="false">
        <appender-ref ref="RESTART_LOG_APPENDER"/>
    </logger>
    <logger name="REDIS_LOG" level="info" additivity="false">
        <appender-ref ref="REDIS_LOG_APPENDER"/>
    </logger>
</configuration>

Java日志工具类

日志枚举根据自己项目的需要进行自定义即可。

package com.patrol.beans.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @Copyright: 2019-2021
 * @FileName: LoggerUtils.java
 * @Author: PJL
 * @Date: 2020/9/8 10:34
 * @Description: 日志管理工具
 */
public class LoggerUtils {

    /**
     * 打印到指定的文件下
     *
     * @param patrolLoggerType 日志文件类型
     * @return
     */
    public static Logger getLogger(PatrolLoggerType patrolLoggerType) {
        return LoggerFactory.getLogger(patrolLoggerType.getLogFileName());
    }

    /**
     * @Copyright: 2019-2021
     * @FileName: PatrolLoggerType.java
     * @Author: PJL
     * @Date: 2020/9/8 10:10
     * @Description: 巡护日志类型枚举
     */
    public enum PatrolLoggerType {
        /**
         * 重启日志
         */
        RESTART("RESTART_LOG"),
        /**
         * 实时位置
         */
        POSITION("POSITION_LOG"),
        /**
         * 用户事件
         */
        EVENT("EVENT_LOG"),
        /**
         * 用户轨迹
         */
        TRACK("TRACK_LOG"),
        /**
         * 事件附件
         */
        FILE("FILE_LOG");

        private String logFileName;

        PatrolLoggerType(String fileName) {
            this.logFileName = fileName;
        }

        public String getLogFileName() {
            return logFileName;
        }


    }
}

系统启动日志示例

在Application启动类调用日志输出。

package com.patrol.mobile;

import com.patrol.beans.util.LoggerUtils;
import org.slf4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import javax.annotation.PostConstruct;

/**
 * 开启异步请求
 */
@EnableAsync
/**
 * 开启接口缓存
 */
@EnableCaching
/**
 * 开启定时任务调度
 */
@EnableScheduling
/**
 * 开启接口文档描述
 */
@EnableSwagger2
/**
 * @SpringBootApplication
 * <p>相当于@Configuration,@EnableAutoConfiguration和 @ComponentScan </p>
 */
@SpringBootApplication
public class PatrolMobileServiceApplication {
    /**
     * 系统重启日志输出(指定日志文件输出)
     */
    @PostConstruct
    public void printLog() {
        Logger logger = LoggerUtils.getLogger(LoggerUtils.PatrolLoggerType.RESTART);
        logger.info(">>>系统重启!");
    }

    public static void main(String[] args) {
        SpringApplication.run(PatrolMobileServiceApplication.class, args);
    }

}

示例效果

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot Logback日志多文件输出(按日期和大小分割) 的相关文章

  • 超5星难度【微软Core allocation】Coding赛题 - 解题思路&优秀代码分享,邀你来“找茬儿”

    6月23日英雄会平台发布了一道难度为超5星的微软比赛题目 截止活动结束共有300多名编程爱好者参与线上答题 而最终通过者仅有7人 通过率仅为2 为什么成绩如此出人意料 是因为原题的英文描述难以理解 还是题目本身的难度太高让很多人望而生畏知难
  • Web前端简易复习手册(一)

    Web前端复习题 一 1 创建js对象的几种方式 2 如何访问对象属性和方法 3 解构是什么 4 什么是原型 原型链 5 基于原型的继承两种方式 6 实例成员 7 原型成员 8 类成员 9 Rest参数含义 10 简述arguments对象
  • 动手学数据分析 Task 1

    动手学数据分析 Task 1 一 数据加载 二 Pandas基础 三 探索性数据分析 一 数据加载 项目源数据请见 kaggle 1 对于csv中的数据 pandas库提供两种方法来读取 分别为 read csv 和read table 二
  • null、undefined、NaN的区别。它们之间的隐式转换和全等结果又是什么?

    前言 在 JavaScript 中 null undefined 和 NaN 是三种不同的特殊值 它们在使用时有着不同的含义和用途 而我们在做项目时候 常常与它们打交道 因此 在编写 JavaScript 代码时需要了解它们之间的区别和相互
  • tensorflow BP神经网络 波士顿房价预测

    前言 啥也别说了 上代码 code 根据波士顿房价信息进行预测 多元线性回归 特征数据归一化 可视化 TensorBoard可视化 读取数据 from sklearn metrics import mean squared error 均方
  • 强化学习:玩转Atari-Pong游戏

    玩转Atari Pong游戏 该项目基于PaddlePaddle框架完成 详情见玩转Atari Pong游戏 Atari 雅达利 最初是一家游戏公司 旗下有超过200款游戏 不过已经破产 在强化学习中 Atari游戏是经典的实验环境之一 因
  • python数字信号_Python数字信号处理应用

    第 1章 声音和信号1 1 1 周期信号1 1 2 频谱分析3 1 3 信号4 1 4 波形的读写6 1 5 频谱7 1 6 波形对象7 1 7 信号对象8 第 1章 声音和信号1 1 1 周期信号1 1 2 频谱分析3 1 3 信号4 1
  • 电脑大小写怎么切换_快速练习好电脑打字的方法

    使用电脑的基本技能 打字 很多人打字都是二指禅 极其不专业 让人看了感觉到非常的搞笑 当有专业的人看见你二指禅打字 就会感觉你这个人水平不行 根本不会盲打 要想熟练地使用电脑 打字是基本的技能 一定要练习会盲打 练习好计算机键盘的盲打 盲打
  • CMake应用:集成gtest进行单元测试

    编写代码有bug是很正常的 通过编写完备的单元测试 可以及时发现问题 并且在后续的代码改进中持续观测是否引入了新的bug 对于追求质量的程序员 为自己的代码编写全面的单元测试是必备的基础技能 在编写单元测试的时候也能复盘自己的代码设计 是提
  • 记一次通过ftplib上传文件至ftp,遇到550 Failed to change directory及553 Could not creat file问题与解决

    遇到550及553错误后 排查思路 1 查看ftp上传路径是否从根目录开始 个人遇到的情况是 需求方提供的ftp地址存在隐藏目录 需求方提供的ftp地址为 ftp xx xx xxx xxx xxx input 这个地址可以正常访问 只不过
  • TPS5430和TPS54302调试艰辛之路

    此文用于记录个人调试中碰到的问题 也请各路大神不吝赐教指点迷津 该问题目前还没有解决也没有得到一个合理的解释 本人仍在探索 调试背景 功率需求 5V 0 1A 需要做一个小板子 功能就是将232通讯转换为485通讯 需要24V供电所以选了D
  • 【地图可视化】Echarts地图上展示3D柱体

    这是以前有这方面可视化的需求做的 找了很多资料 最后感觉这样的效果比较满意 效果展示 以下以江苏省的地图为例 数据准备 对于想要做3d效果的地区 需要准备对应的json文件 可以在这个网站上下载 数据最小粒度可以具体到县 DataV Geo
  • OpenCV曝光参数和快门时间的对应关系

    目录 1 曝光设置 2 设置自动曝光为手动曝光 3 曝光参数具体对应于曝光时间 4 代码实现 5 其他知识补充 5 1 相机曝光原理 5 2 快门速度 opencv Camera曝光设置 1 曝光设置 cv cap set cv CAP P
  • 插入排序 直接插入 C语言

    碎碎念念 基本思路是 一般先孤立这堆数字的第一个数 那么它自己一个就是有序了 再拿后面的数和它比较 找到大小位置合适的插进去 完了之后这一小堆还是有序的 再拿后面的来和前面的比较 找到合适的位置插进去 直到全部插完 代码 include
  • Arthas使用教程

    什么是 Arthas 摘录一段官方 Github 上的简介 Arthas 是Alibaba开源的Java诊断工具 深受开发者喜爱 当你遇到以下类似问题而束手无策时 Arthas 可以帮助你解决 这个类从哪个 jar 包加载的 为什么会报各种

随机推荐

  • 微信小程序(原生)使用Swiper实现(商品详情)视频和图片轮播(仿京东/淘宝商品详情头部视频+图片轮播)

    一 需求 1 如果第一是视频 不进行自动轮播 2 可以手动滑动切换 3 点击播放视频 也可以手动滑动切换 4 视频播放完后 自动轮播 5 视频可以点击暂停和全屏播放 二 最终效果 三 源码 播放icon使用了TDesign组件库 1 wxm
  • 同一个类的方法怎么Mock?spy函数啦

    大家好 我是神韵 是一个技术 生活博主 出文章目的主要是两个 一是好记忆不如烂笔头 记录总结中提高自己 二是希望我的文章可以帮到大家 欢迎来点赞打卡 你们的行动将是我无限的动力 本篇主题是 同一个类的方法怎么Mock spy函数啦 我在测试
  • C语言fscanf函数的理解

    第一次学文件时 没学太明白 在课程设计时又不得不使用fscanf 因此又复习了一下 fp1 fopen Data FindPassword Qusetion txt r fscanf fp1 s answer i 这意思就是将FindPas
  • idea报错:Parent ‘Unknown:Unknown:Unknown‘ has problems

    导入项目时报错 Parent Unknown Unknown Unknown has problems 问题阐述 查看maven的setting xml文件 值得注意的一点 问题阐述 项目在导入之后 就报错了如下所示错误 Parent Un
  • 【CSS flex布局】用flex写个骰子

    注 新手练习 基本思路 HtML部分 一个大 ul 包裹6个 li 也就是6个骰子 每个 li 中的 span 对应一个骰子点数 ul li span span li li span span span span li li span sp
  • G. 积木画(dp + 滚动数组)

    大致题意 给定2 N的画布 以及两种积木 问填满画布的方法有多少种 思路 数据范围很大 时间复杂度要求O n 可以想到用线性dp来解决 考虑状态转移方程 状态表示 d i j 表示前 i 列都填满 填满第 i 1 列时状态为j的种类数 按j
  • 从hdfs读取image文件

    发现从hdfs直接读取image文件response Image open filepath 会报错路径不存在 出现这个问题是因为PIL的Image open filepath 只能打开本地路径里的文件 不能打开hdfs里的 而且hdfs是
  • (转)牛牛牌型判定(五小牛 > 五花牛 > 炸弹 > 银牛 > 牛牛 > 有牛>没牛)

    牌型大小 五小牛 gt 五花牛 gt 炸弹 gt 银牛 gt 牛牛 gt 有牛 牛987654321 gt 没牛 K gt Q gt J 2 gt A 黑桃 gt 红桃 gt 梅花 gt 方块 同样的牌型比大小 同样的手牌比花色 1 2 在
  • nzAutocomplete监听选择事件,做相应处理

    nzAutocomplete 当组件选择一个选项后 没有回调函数 但想在选择时获取相关的数据 可以通过点击事项 传入相关对象
  • excel 下载方法封装

    1 首先需要拿到后端返回的URL下载地址 2 写个下载方法 url 接口返回的下载地址 例如 https cancer research oss cn beijing aliyuncs com yuance platform permiss
  • Unity 3D 做FPS游戏

    Part 1 Introduction 第一部分 介绍 This tutorial will detail how to make a simple First Person Shooter FPS It will introduce fu
  • 项目类中@Data注解无法使用

    原因 Data注解无法使用 需要安装插件 解决 在idea中找到 File Setting 找到Plugins如下图 输入lombok 点击安装即可 lombok插件 已解决
  • bottomnavigationview 去动画_Android Notes|BottomNavigationView 爱上 Lottie

    鸡老大说 大丈夫岂能久居人下 首发掘金 掘金 个人页 juejin im 前言 好容易解决个问题 感觉记录一波 当日事当日毕 践行鸡老大 点滴积累 万一某天优秀了呢 以前大部分项目底部导航栏关于图片部分的实现 要么两套图 selector
  • python-爬虫(获取NBA球员信息)

    目录 引入外部库 安装XPath 1 下载XPath helper的源码 2 在edge中添加 3 使用Xpath helper 原码 在上一节我们已经配置好了python爬虫的环境python 配置爬虫环境 现在我们就来实践一下吧 引入外
  • Hive集成HBase详解

    摘要 Hive提供了与HBase的集成 使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询 应用场景 1 将ETL操作的数据存入HBase 2 HBase作为Hive的数据源 3 构建低延时的数据
  • 部署elk集群6

    文章目录 一 集群环境 二 部署es 1 192 168 4 115 2 192 168 4 116 3 192 168 4 118 4 启动测试 5 加入开启自启动 6 故障 三 部署logstash 1 官方地址 2 解压安装 3 创建
  • Pycharm2022安装及python环境的搭建

    一 安装Pycharm 首先进入pycharm的官网https www jetbrains com pycharm download section windows 选择社区版进行下载 运行启动安装向导的pycharm 2022 2 4 e
  • cookie注入

    什么是cookie Cookies 确定身份 在服务器产生 存储在客户端的一小段文本信息 格式为字典 键值对 cookie分类 会话级 保存在内存 浏览器关闭则丢失 持久级 保存至硬盘 只有 当失效时间到了才会清除 一般都是持久化比较多 打
  • 设计模式(二十一) 状态模式

    状态模式也是一种行为型模式 当我们的程序中需要一些状态转换 对于不同的状态需要不同的行为时 我们就可以考虑使用状态模式 下面用交通灯来当例子 我们需要红黄绿三种颜色的状态 interface State void show class Re
  • Springboot Logback日志多文件输出(按日期和大小分割)

    在早期的日志Slf4j Log4j使用方式中 我们使用最多的就是LoggerFactory来获取一个Logger实例 logback的原理也一样 本文示例文件分割按照日志大小和日期进行分割 目录 配置logback xml 配置需要的pro