SpringBoot项目集成logback日志分等级配置

news2024/11/15 15:54:16

背景:

日志的作用:

boot项目集成logback:

一、单模块项目配置:

1、添加依赖

2、添加logback-spring.xml配置文件到resources目录下

3、接下来启动一下项目,就可以看到我们的日志已经区分等级打印了

二、多微服务项目集成logback共同一份配置:

1、将你的logback-spring.xml配置文件在nacos中创建出来

2、在项目的配置文件中添加logback文件读取的配置:

3、在logback-spring.xml配置文件中也需要修改一下

4、运行项目,可以看到运行了两个服务,log文件打出来也是按照各服务名称来区分目录的


背景:

在程序中写日志是一件非常重要,但是很容易被开发人员忽视的地方。写好程序的日志可以帮助我们大大减轻后期维护压力。在实际的工作中,开发人员往往迫于巨大时间压力,而写日志又是一个非常繁琐的事情,往往没有引起足够的重视。开发人员应在一开始就养成良好的日志撰写习惯,并且应在实际的开发工作中为写日志预留足够的时间。

日志的作用:

一般程序日志出自下面几个方面的需求:

  • 记录用户操作的审计日志,甚至有的时候就是监管部门的要求。
  • 快速定位问题的根源
  • 追踪程序执行的过程。
  • 追踪数据的变化
  • 数据统计和性能分析
  • 采集运行环境数据

一般在程序上线之后,一旦发生异常,第一件事就是要弄清楚当时发生了什么。用户当时做了什么操作,环境有无影响,数据有什么变化,是不是反复发生等,然后再进一步的确定大致是哪个方面的问题。确定是程序的问题之后再交由开发人员去重现、研究、提出解决方案。这时,日志就给我们提供了第一手的资料。

boot项目集成logback:

一、单模块项目配置:

1、添加依赖

<!--logback依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

2、添加logback-spring.xml配置文件到resources目录下

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒;当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="false" scanPeriod="10 seconds" debug="false">
  <contextName>logback</contextName>
  <property name="log.path" value="./logs/merit" />
  <!-- 彩色日志 -->
  <!-- 彩色日志依赖的渲染类 -->
  <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
  <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
  <!-- 彩色日志格式 -->
  <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  <!--1. 输出到控制台-->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>debug</level>
    </filter>
    <encoder>
      <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
      <!-- 设置字符集 -->
      <charset>UTF-8</charset>
    </encoder>
  </appender>
  <!--2. 输出到文档-->
  <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
  <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 正在记录的日志文档的路径及文档名 -->
    <file>${log.path}/debug/debug.log</file>
    <!--日志文档输出格式-->
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
      <charset>UTF-8</charset> <!-- 设置字符集 -->
    </encoder>
    <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志归档 -->
      <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>100MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!--日志文档保留天数-->
      <maxHistory>15</maxHistory>
    </rollingPolicy>
    <!-- 此日志文档只记录debug级别的 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>debug</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
  <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
  <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 正在记录的日志文档的路径及文档名 -->
  <file>${log.path}/info/info.log</file>
  <!--日志文档输出格式-->
  <encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  <charset>UTF-8</charset>
</encoder>
  <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <!-- 每天日志归档路径以及格式 -->
  <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  <maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
  <!--日志文档保留天数-->
  <maxHistory>15</maxHistory>
</rollingPolicy>
  <!-- 此日志文档只记录info级别的 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>info</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>
</appender>
  <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
  <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 正在记录的日志文档的路径及文档名 -->
  <file>${log.path}/warn/warn.log</file>
  <!--日志文档输出格式-->
  <encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  <charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
  <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <fileNamePattern>${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  <maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
  <!--日志文档保留天数-->
  <maxHistory>15</maxHistory>
</rollingPolicy>
  <!-- 此日志文档只记录warn级别的 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>warn</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>
</appender>
  <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
  <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 正在记录的日志文档的路径及文档名 -->
  <file>${log.path}/error/error.log</file>
  <!--日志文档输出格式-->
  <encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  <charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
  <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  <maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
  <!--日志文档保留天数-->
  <maxHistory>15</maxHistory>
</rollingPolicy>
  <!-- 此日志文档只记录ERROR级别的 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>ERROR</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>
</appender>
  <!-- 4. 最终的策略 -->
  <!-- 4.1 开发环境:打印控制台-->
  <springProfile name="dev">
  <logger name="com.sdcm.pmp" level="debug"/>
</springProfile>
<root level="info">
  <appender-ref ref="CONSOLE"/>
  <appender-ref ref="DEBUG_FILE"/>
  <appender-ref ref="INFO_FILE"/>
  <appender-ref ref="WARN_FILE"/>
  <appender-ref ref="ERROR_FILE"/>
</root>
</configuration>

3、接下来启动一下项目,就可以看到我们的日志已经区分等级打印了;

二、多微服务项目集成logback共同一份配置:

如果项目是使用了微服务架构,将一个大项目拆分成多个模块之后,如果配置打日志区分等级的话,需要在每个模块的resources目录下添加一个这样的配置;这样太麻烦了,几个模块要求的打日志区分出来的等级以及保存策略是一样的,那么我们如何实现将logback-spring.xml文件复用呢?这里我使用的是nacos做的配置管理;

1、将你的logback-spring.xml配置文件在nacos中创建出来;

2、在项目的配置文件中添加logback文件读取的配置:

这里你在nacos上添加了logback的配置文件之后,上图中config的值最后读取出来实际就是logging-spring.xml的文件;

logging.config实际读取为:http://nacos服务所在的IP地址/nacos/v1/cs/config?group=文件所在的分组&tenant=文件所在的命名空间username=nacos服务的账号&password=nacos服务的账号&dataId=logback-spring.xml

3、在logback-spring.xml配置文件中也需要修改一下:

因为是将项目拆分成了多个模块,所以这里需要动态的获取一下每个服务的服务名;

logback-spring.xml的加载顺序早于springboot的application.yml (或application.properties) 配置文件所以在logback-spring.xml文件中使用<property>标签读不到application.yml(或application.properties)文件中的值。这里需要通过springProperty标签来引用:<springProperty name="APPLICATION_NAME" source="spring.application.name"/>

<?xml version="1.0" encoding="UTF-8"?>
<!--
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒;当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="false" scanPeriod="10 seconds" debug="false">
  <contextName>logback</contextName>
  <springProperty name="APPLICATION_NAME" source="spring.application.name"/>
  <property name="log.path" value="./logs/${APPLICATION_NAME}" />
  <!-- 彩色日志 -->
  <!-- 彩色日志依赖的渲染类 -->
  <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
  <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
  <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
  <!-- 彩色日志格式 -->
  <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
  <!--1. 输出到控制台-->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>debug</level>
    </filter>
    <encoder>
      <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
      <!-- 设置字符集 -->
      <charset>UTF-8</charset>
    </encoder>
  </appender>
  <!--2. 输出到文档-->
  <!-- 2.1 level为 DEBUG 日志,时间滚动输出  -->
  <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 正在记录的日志文档的路径及文档名 -->
    <file>${log.path}/debug/debug.log</file>
    <!--日志文档输出格式-->
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
      <charset>UTF-8</charset> <!-- 设置字符集 -->
    </encoder>
    <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 日志归档 -->
      <fileNamePattern>${log.path}/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>100MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!--日志文档保留天数-->
      <maxHistory>15</maxHistory>
    </rollingPolicy>
    <!-- 此日志文档只记录debug级别的 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>debug</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
  <!-- 2.2 level为 INFO 日志,时间滚动输出  -->
  <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 正在记录的日志文档的路径及文档名 -->
  <file>${log.path}/info/info.log</file>
  <!--日志文档输出格式-->
  <encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  <charset>UTF-8</charset>
</encoder>
  <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <!-- 每天日志归档路径以及格式 -->
  <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  <maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
  <!--日志文档保留天数-->
  <maxHistory>15</maxHistory>
</rollingPolicy>
  <!-- 此日志文档只记录info级别的 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>info</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>
</appender>
  <!-- 2.3 level为 WARN 日志,时间滚动输出  -->
  <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 正在记录的日志文档的路径及文档名 -->
  <file>${log.path}/warn/warn.log</file>
  <!--日志文档输出格式-->
  <encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  <charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
  <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <fileNamePattern>${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  <maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
  <!--日志文档保留天数-->
  <maxHistory>15</maxHistory>
</rollingPolicy>
  <!-- 此日志文档只记录warn级别的 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>warn</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>
</appender>
  <!-- 2.4 level为 ERROR 日志,时间滚动输出  -->
  <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <!-- 正在记录的日志文档的路径及文档名 -->
  <file>${log.path}/error/error.log</file>
  <!--日志文档输出格式-->
  <encoder>
  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
  <charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
  <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
  <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
  <maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
  <!--日志文档保留天数-->
  <maxHistory>15</maxHistory>
</rollingPolicy>
  <!-- 此日志文档只记录ERROR级别的 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
  <level>ERROR</level>
  <onMatch>ACCEPT</onMatch>
  <onMismatch>DENY</onMismatch>
</filter>
</appender>
  <!-- 4. 最终的策略 -->
  <!-- 4.1 开发环境:打印控制台-->
  <springProfile name="dev">
  <logger name="com.sdcm.pmp" level="debug"/>
</springProfile>
  <root level="info">
  <appender-ref ref="CONSOLE"/>
  <appender-ref ref="DEBUG_FILE"/>
  <appender-ref ref="INFO_FILE"/>
  <appender-ref ref="WARN_FILE"/>
  <appender-ref ref="ERROR_FILE"/>
</root>
</configuration>

4、运行项目,可以看到运行了两个服务,log文件打出来也是按照各服务名称来区分目录的:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DVWA之SQL注入

Low(数字型注入)1、先确定正常和不正常的回显回显&#xff0c;就是显示正在执行的批处理命令及执行的结果等。输入1时&#xff0c;有回显&#xff0c;是正常的 数据库语句&#xff1a; select * from table where id 1输入5时&#xff0c;有回显&#xff0c;是正常的 数据库语句…

Metasploit工具使用(下)

Metasploit工具使用1.Metasploit简介1.1.Metasploit下载1.2.其它参考1.3.本章简述2.Meterpreter2.1.简介2.2.优点2.3.注意事项2.4.整体攻击流程2.4.1.创建后门2.4.2.监听后门2.4.3.运行后门2.4.4.成功获得3.渗透后命令汇总3.1.迁移进程3.1.1.查看当前进程3.1.2.获取当前进程PID…

你可能不知道的JS使用技巧

数组扁平化 老方案 let arr [1, 2, 4, 6,[5, 4, 5,[98, 3], [34], [7]]]; arr.toString().split(,).map(Number);新方案&#xff1a; flat() const arr [1, [2, [3, [4, 5]]], 6]; console.log(arr.flat(Infinity));深拷贝 老方案&#xff1a; JSON.parse(JSON.stringify(…

数据分析:Matplotlib数据可视化详细教程

1.主要分为4种&#xff1a;柱状图&#xff0c;直方图&#xff0c;散点图&#xff0c;饼状图 可视化的工具选择&#xff1a;可视化的Python软件包 工具的优点&#xff1a;可以自制图形定义功能 绘图程序步骤&#xff1a; 第一步导包中Pyplot模块&#xff0c;以as为别名引入包…

蓝桥杯重点(C/C++)(随时更新,更新时间:2023.1.31)

点关注不迷路&#xff0c;欢迎推荐给更多人&#xff0c;大约两天更新一次&#xff0c;建议点赞收藏加关注 本次更新内容&#xff1a;2.18 递归 目录 1 技巧 1.1 取消同步&#xff08;节约时间&#xff0c;甚至能多骗点分&#xff0c;最好每个程序都写上&#xff09; 1.…

代谢组学文献解读:高胆固醇饮食与脂肪肝相关肝癌的关系

代谢组学文献分享&#xff0c;非酒精性脂肪性肝病&#xff08;Non-alcoholic fatty liver disease , NAFLD)是全世界日趋普遍的慢性肝病。随着肥胖和代谢综合征在全球的流行&#xff0c;近20年亚洲国家NAFLD增长迅速&#xff0c;在上海、北京、广州和香港等地区成人NAFLD患病率…

【论文简述】Multiview Stereo with Cascaded Epipolar RAFT(arxiv 2022)

一、论文简述 1. 第一作者&#xff1a;Zeyu Ma 2. 发表年份&#xff1a;2022 3. 发表期刊&#xff1a;arxiv 4. 关键词&#xff1a;MVS、RAFT、级联、极线 5. 探索动机&#xff1a;3D卷积在计算和内存方面成本很高&#xff0c;在有限资源条件下限制重建质量。 However, a …

CISP-PTE 学习记录

CISP-PTE 学习记录 题目链接1 http://49.232.193.10:2083/start/index.php?pagehello.html write up: http://49.232.193.10:2083/start/index.php?pagephp://filter/readconvert.base64-encode/resource…/key.php 知识点: php伪协议&#xff0c;php伪协议是可以读取到ww…

【运维】Linux/Ec2挂载卷与NFS搭建实站讲解

英文Network File System(NFS)&#xff0c;是由SUN公司研制的UNIX表示层协议(presentation layer protocol)&#xff0c;能使使用者访问网络上别处的文件就像在使用自己的计算机一样。NFS在实际场景中有着不少的应用场景&#xff0c;比如分布式代码部署下&#xff0c;代码一致性…

关于 微软商店无法加载页面 显示错误代码0x80131500的解决办法

目录一、误删系统文件导致Microsoft Store无法打开1.运行 SFC 和 DISM2.尝试修复或者重置微软应用商店3.重新部署 Microsoft Store4.运行Windows疑难解答5.对系统镜像进行无损修复二、其他原因导致Microsoft Store无法打开1.调整网络连接2.更改DNS3.清理应用商店的缓存4.调整 I…

java-raft框架之atomix进行分布式管理

共识算法 在一个分布式的系统中&#xff0c;管理各个节点的一致性&#xff08;共识&#xff09;一直是个很有难度的问题。 在近几十年的发展中&#xff0c;于1990年诞生的Paxos算法是其中最为经典的代表&#xff0c;并一统江湖数几十载。 如著名的zookeeper、chubby都是基于…

操作系统(day03)-- 进程

文章目录进程进程的定义进程的组成进程的组织进程的特征进程的状态-五种基本状态进程状态的转换进程控制进程控制的定义进程控制相关的原语进程 系统并发运行多个程序&#xff0c;它需要将程序代码、数据段存放到内存的某个位置&#xff0c;那系统怎么知道哪个内存的数据在哪呢…

注册公司选择认缴or实缴?如何查验公司实际资金?

目录 前言 实缴制 认缴制 认缴制还是实缴制呢&#xff0c;哪个更好&#xff1f; 1、如果你的启动资金比较少&#xff0c;建议选认缴制&#xff1a; 2、有27类的公司暂不推行注册资金认缴制&#xff1a; 3、如何查看公司实际的公司实缴金额? 4、认缴不需要验资&#xf…

【原文核心对照代码】【一文足以系列】A-LOAM里程计部分简短精解

前言 本文将通过论文对照代码的方式阐述A-LOAM这一神奇算法。全文保持各个章节短小精悍的风格。本文会省去一些细节&#xff0c;但是了解大部分的论文和代码实现已经足够了。 点曲率计算与边缘点面点区分 论文中通过对点云点的曲率进行如下求曲率的计算。将计算的结果跟阈值…

org.slf4j.Logger无法输出日志的BUG

场景依赖<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.13</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>s…

第一章 Iceberg入门介绍

1、Iceberg简介 本质&#xff1a;一种数据组织格式 1.1、应用场景 ①面向大表&#xff1a;单表包含数十个PB的数据 ②分布式引擎非必要&#xff1a;不需要分布式SQL引擎来读取或查找文件 ③高级过滤&#xff1a;使用表元数据&#xff0c;使用分区和列级统计信息修建数据文…

技术管理者如何获得下属的认同?

你好&#xff0c;我是童军&#xff0c;目前是华锐技术资管营销研发团队总监。今天我将从自己的工作场景出发&#xff0c;讲讲我是如何和团队小伙伴相处沟通&#xff0c;并获得认同的。 我们先看一个小故事。 我刚当上主管那会儿&#xff0c;在和新入职同事沟通具体工作时&…

【数组相关面试题】LeetCode试题

前言&#xff1a;在之前我们已经学习过了顺序表的相关概念以及实现的方法&#xff0c;今天我们通过几个题来进行应用了解。 目录1.第一题([oj链接](https://leetcode.cn/problems/remove-element/))2.第二题&#xff08;[oj链接](https://leetcode.cn/problems/remove-duplicat…

Ubuntu和Linux开发板网络环境搭建

参考&#xff1a;https://www.bilibili.com/video/BV1n541197rk?spm_id_from333.999.0.0 目录前言STM32MP157 开发板网络环境搭建开发工具网络拓扑结构Ubuntu 常用工具安装同一网段ping 测试概念关闭Ubuntu 和Windows 防火墙电脑和开发板直连同个路由器准备工作VMware 设置查看…

Java:每个开发人员职业生涯的基本Java技能

早在1996年&#xff0c;Java就首次被引入世界&#xff0c;如今仍然非常受欢迎。2021&#xff0c;全球超过35%的程序员使用这种语言。此外&#xff0c;它是TIOBE索引中最受欢迎的三种编程语言之一。作为Java初学者&#xff0c;这对你意味着什么?这意味着你必须获得竞争优势&…