当前位置: 首页 > news >正文

Log日志详解分析

目录

  • 1、log日志的用途
  • 2、log日志级别
  • 3、什么时候需要输出日志
    • 1. 系统启动参数、环境变量
    • 2. 异常捕获处
    • 3. 函数获得期望之外的结果时
    • 4. 关键操作
  • 4、日志输出的内容
  • 5、 注意事项
    • 1. 日志信息不明确
    • 2. 特殊异常处理
    • 3. 日志输出顺序
    • 4. 临时调试日志
  • 6、xml文件配置
  • 7、linux下查看日志命令
    • 7.1 linux查看日志的常用命令包括
      • 1. tail命令:用于显示文件的末尾内容。
      • 2. head命令:用于显示文件的开头内容。
      • 3. cat命令:用于将文件内容输出到终端。
      • 4. less命令:用于以可滚动的方式查看大型文件。
      • 5. grep命令:用于在文件中搜索特定的内容。
    • 7.2 常用场景
      • 1. 匹配关键字,排查错误
      • 2. 查看某个时间段的日志信息
      • 3. 查看日志最后一次出现关键字’test’的日志记录
      • 4. 统计一份日志里面出现‘keyword’关键字的行数
      • 5. wc命令常用的几个参数

1、log日志的用途

问题追踪:通过日志不仅仅包括我们程序的一些bug,也可以在安装配置时,通过日志可以发现问题。

状态监控:通过实时分析日志,可以监控系统的运行状态,做到早发现问题、早处理问题。

安全审计:审计主要体现在安全上,通过对日志进行分析,可以发现是否存在非授权的操作。

2、log日志级别

日志可分为五个级别
DEBUG :为程序的调试信息,最低级
INFO :为一般要显示的信息,比如登录登出
ERROR:为严重错误 主要是程序的错误
WARN :为一般警告,比如session丢失
FATAL:崩溃,整个程序终止运行

3、什么时候需要输出日志

日志并不是越多越详细就越好。在分析运行日志,查找问题时,我们经常遇到该出现的日志没有,无用的日志一大堆,或者有效的日志被大量无意义的日志信息淹没,查找起来非常困难。那么什么时候输出日志呢?以下列出了一些常见的需要输出日志的情况,而且日志的级别基本都是>=INFO,至于Debug级别日志的使用场景,本节没有专门列出,需要具体情况具体分析,但也是要追求“恰如其分”,不是越多越好。

1. 系统启动参数、环境变量

系统启动的参数、配置、环境变量、System.Properties等信息对于软件的正常运行至关重要,这些信息的输出有助于安装配置人员通过日志快速定位问题,所以程序有必要在启动过程中把使用到的关键参数、变量在日志中输出出来。在输出时需要注意,不是一股脑的全部输出,而是将软件运行涉及到的配置信息输出出来。比如,如果软件对jvm的内存参数比较敏感,对最低配置有要求,那么就需要在日志中将-Xms -Xmx -XX:PermSize这几个参数的值输出出来。

2. 异常捕获处

在捕获异常处输出日志,大家在基本都能做到,唯一需要注意的是怎么输出一个简单明了的日志信息。这在后面的问题问题中有进一步说明。

3. 函数获得期望之外的结果时

一个函数,尤其是供外部系统或远程调用的函数,通常都会有一个期望的结果,但如果内部系统或输出参数发生错误时,函数将无法返回期望的正确结果,此时就需要记录日志,日志的基本通常是warn。需要特别说明的是,这里的期望之外的结果不是说没有返回就不需要记录日志了,也不是说返回false就需要记录日志。比如函数:isXXXXX(),无论返回true、false记录日志都不是必须的,但是如果系统内部无法判断应该返回true还是false时,就需要记录日志,并且日志的级别应该至少是warn。

4. 关键操作

关键操作的日志一般是INFO级别,如果数量、频度很高,可以考虑使用DEBUG级别。以下是一些关键操作的举例,实际的关键操作肯定不止这么多。

删除:删除一个文件、删除一组重要数据库记录……

添加:和外系统交互时,收到了一个文件、收到了一个任务……

处理:开始、结束一条任务……

4、日志输出的内容

ERROR:错误的简短描述,和该错误相关的关键参数,如果有异常,要有该异常的StackTrace。

WARN:告警的简短描述,和该错误相关的关键参数,如果有异常,要有该异常的StackTrace。

INFO:言简意赅地信息描述,如果有相关动态关键数据,要一并输出,比如相关ID、名称等。

DEBUG:简单描述,相关数据,如果有异常,要有该异常的StackTrace。

在日志相关数据输出的时要特别注意对敏感信息的保护,比如修改密码时,不能将密码输出到日志中。

5、 注意事项

1. 日志信息不明确

实际开发时没有记录任务id和任务名称,软件部署后现错误后,根据该日志记录不能确认哪一条任务错误,给进一步的分析原因带来困难。

2. 特殊异常处理

对于静态工具类函数中的异常处理,最简单的方式就是不捕获、不记录日志,直接向上抛出,如果认为异常类型太多,或者意义不明确,可以抛出自定义异常类的实例。

3. 日志输出顺序

另外需要明确一点:日志系统是一个多线程公用的系统,在两行日志输出之间有可能会被插入其他线程的日志记录,不会按照我们的意愿顺序输出。

4. 临时调试日志

对于临时调试日志,建议在日志的输出信息中添加一些特殊的连续字符,也可以用自己的名称、代号,这样可以在调试完毕后,提交代码之前,方便地找到所有临时代码,一并删除。

6、xml文件配置

logback-spring.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!--定义日志文件的存储地址 --><property name="LOG_HOME" value="../pro_col_logs/user" /><!--<property name="COLOR_PATTERN" value="%black(%contextName-) %red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta( %replace(%caller{1}){'\t|Caller.{1}0|\r\n', ''})- %gray(%msg%xEx%n)" />--><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern>--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}:%L) - %msg%n</pattern></encoder></appender><!-- 按照每天生成日志文件 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件输出的文件名 --><FileNamePattern>${LOG_HOME}/user-%d{yyyy-MM-dd}.%i.log</FileNamePattern><!--日志文件保留天数 --><MaxHistory>30</MaxHistory><maxFileSize>50MB</maxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}:%L - %msg%n</pattern></encoder><!-- 此日志文档记录除了DEBUG级别的其它高于DEBUG的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><!--抓到该级别的就拦截--><onMatch>DENY</onMatch><!-- 上面没抓到的就放行--><onMismatch>ACCEPT</onMismatch></filter></appender><!-- 滚动记录文件--><!-- level为 DEBUG 日志,时间滚动输出  --><appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 正在记录的日志文档的路径及文档名 --><file>${LOG_HOME}/user-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_HOME}/user-debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern><timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"><maxFileSize>100MB</maxFileSize></timeBasedFileNamingAndTriggeringPolicy><!-- 日志文档保留天数 --><maxHistory>15</maxHistory><!-- 限制日志文件总容量 --><totalSizeCap>10GB</totalSizeCap></rollingPolicy><!-- 此日志文档只记录debug级别的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>debug</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- 生成 error html格式日志开始 --><appender name="HTML" class="ch.qos.logback.core.FileAppender"><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!--设置日志级别,过滤掉info日志,只输入error日志--><level>ERROR</level></filter><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="ch.qos.logback.classic.html.HTMLLayout"><pattern>%p%d%msg%M%F{32}%L</pattern></layout></encoder><file>${LOG_HOME}/user-error-log.html</file></appender><!-- 生成 error html格式日志结束 --><!--myibatis log configure --><logger name="com.apache.ibatis" level="TRACE" /><logger name="java.sql.Connection" level="DEBUG" /><logger name="java.sql.Statement" level="DEBUG" /><logger name="java.sql.PreparedStatement" level="DEBUG" /><logger name="com.byd" level="DEBUG" /><!-- 日志输出级别 --><root level="INFO"><appender-ref ref="STDOUT" /><appender-ref ref="FILE" /><appender-ref ref="HTML" /><appender-ref ref="DEBUG_FILE" /></root></configuration>

7、linux下查看日志命令

7.1 linux查看日志的常用命令包括

tail/head、cat/tac、less/more、grep/sed、wc

1. tail命令:用于显示文件的末尾内容。

tail -f filename --> 实时监控日志
tail -10f filename --> 实时监控10行日志信息
tail -n 100 filename —> 查看尾部最后100行日志信息
tail -n +100 filename — >查看日志100行之后的日志信息

2. head命令:用于显示文件的开头内容。

head -n 100 filename —> 查看文本开始的头100行信息
head -n -100 filename —> 查看文本最后100行信息以上的内容

3. cat命令:用于将文件内容输出到终端。

例如:cat filename 将显示文件filename的全部内容。

cat filename --> 查看全部文本信息
cat -n filename |tail -n +100|head -n 20 —> 查看100-120行之间的内容
tac – 从文本的尾部往头部展示日志内容

4. less命令:用于以可滚动的方式查看大型文件。

例如:less filename 将打开文件filename,您可以使用上下箭头和Page Up/Page Down键来浏览文件。

/keyword -->搜索
n/shift+n键–>向下查找
快捷键:ctrl+F/ctrl+B–>向前/后翻页
less +/keyword logfile.log–>搜索关键字
直接定位:
less +100g xx.log --> 直接定位到第100行
less +GG xx.log --> 定位到最后一行
less +100P xx.log --> 定位到第100个字节的位置
less +100p xx.log --> 直接定位到50%的位置
more -10 filename 设定每页展示10条数据信息。

5. grep命令:用于在文件中搜索特定的内容。

grep是一种强大的文本搜索工具,使用正则表达式搜索文本且把匹配的行打印出来。grep “match_pattern” file1,file2,file3 —>多个文本中查找
grep “match_pattern” filename --color=auto -->标记匹配颜色(always never auto三种)
grep -v “match _pattern”filename -->输出除之外的所有行
grep -E “[1-9]+” --> 使用正则表达式
grep -o -E “[a-z]+.” line --> 只输出匹配到的内容
grep -c “text” filename --> 统计文件或者文本中包含匹配字符串的行数
grep “text” -n filename --> 输出包含匹配字符串的行数
sed是一种非交互式的编辑器,sed会逐行处理文件并将结果发送到屏幕。
sed -n ‘1p’ filename --> 只打印文件第一行
sed -n ‘1,10p’ filname --> 查看文件1-10行内容
sed ‘1d’ filename --> 删除文本第一行内容
sed ‘s/希望替换的内容/被替换的内容/g’ --> 替换字符串
sed ‘s/1/one /g’ filename 将1替换为one
sed -n ‘/2019-08-06 22:43/,/2019-08-06 22:44/p’ filename --> 查看时间区间内的日志记录;
n1 log.file| sed -n ‘1,10p’ --> 查看日志的1-20行内容。

7.2 常用场景

1. 匹配关键字,排查错误

grep

grep -w “keyword" filelog.log -2 --color -n > /tmp/tmp.log
grep -w   "keyword" filelog.log -2 --color  -n  | less

-w 全匹配;-2 关键字上下2行;–color 关键字着色;-n 输出行号

2. 查看某个时间段的日志信息

 grep '2019-08-06 22' filename

cat结合grep

cat log.file |grep -n '2019-08-06 22:43'

sed结合grep

sed -n '2013:15:00:01/,/2013:16:59:58/p' xxxx.log | grep "Exception" -n -5 --color

3. 查看日志最后一次出现关键字’test’的日志记录

grep 'test' -A 10  log.file | tail -n 11

这里需要了解到grep命令的几个参数含义:
grep ‘name’ -A 10 显示匹配内容和后面的10行
grep ‘name’ -B 10 显示匹配内容和前面的10行
grep ‘name’ -C 10 显示匹配内容和前后面的10行
tail -n 11命令则是将当前显示的10行内容以及匹配的那一行内容展示出现

4. 统计一份日志里面出现‘keyword’关键字的行数

grep 'keyword' ./log.file |wc -l

5. wc命令常用的几个参数

-l 匹配的行数
-w 匹配的字数
-m 匹配的字符数目

相关文章:

Log日志详解分析

目录 1、log日志的用途2、log日志级别3、什么时候需要输出日志1. 系统启动参数、环境变量2. 异常捕获处3. 函数获得期望之外的结果时4. 关键操作 4、日志输出的内容5、 注意事项1. 日志信息不明确2. 特殊异常处理3. 日志输出顺序4. 临时调试日志 6、xml文件配置7、linux下查看日…...

【API篇】九、Flink的水位线

文章目录 1、Flink时间语义2、事件时间和窗口3、水位线4、水位线和窗口的工作原理 1、Flink时间语义 事件时间处理时间 举个例子就是&#xff0c;一条数据在23:59:59产生&#xff0c;在00:00:01被处理&#xff0c;前者为事件时间&#xff0c;后者为处理时间。 从Flink1.12版本…...

#经典论文 异质山坡的物理模型 2 有效导水率

Binley, A., Beven, K., & Elgy, J. (1989). A physically based model of heterogeneous hillslopes: 2. Effective hydraulic conductivities. Water Resources Research, 25(6), 1227–1233. https://doi.org/10.1029/WR025i006p01227 这篇论文指出&#xff0c; 每个输…...

Java面试题-Redis-第一天(Redis简单介绍)

目录 一、Redis是什么&#xff1f;优缺点&#xff1f; 二、Redis为什么这么快&#xff1f; 三、Redis相较于Memcached有哪些优势&#xff1f; 四、为什么使用Redis做缓存&#xff1f; 五、为什么要用Redis而不用map/guava做缓存&#xff1f; 六、Redis的常用场景有哪些&am…...

Java 生成和读取JSON文件

下面的demo当中 &#xff0c;是将json文件放到了zip包当中。如果不需要&#xff0c;可以拿掉。 1、生成对象JSON文件 public static void crateJson() {try {String orcPath "D:\\doc\\ts_service_orchestration.json";// 对象集合或者对象都可以List<DataPO>…...

k8s-----26、细粒度权限管理 RBAC

0、导读 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限(也就是通过serviceaccount) token(共享秘钥) SSL(双向SSL认证) …通过任何一个认证即表示认证通过,进入下一步第二步:授权检查,确认是否对资源…...

【Unity ShaderGraph】| 制作一个 高级流体水球效果

前言 【Unity ShaderGraph】| 快速制作一个 流体水球效果一、效果展示二、简易流体水球效果三、进阶流体水球效果四、应用实例 前言 本文将使用ShaderGraph制作一个 高级流体水球 &#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xf…...

日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120dll丢失”。那么&#xff0c;究竟什么是msvcp120dll文件&#xff1f;当它丢失时&#xff0c;我们会遇到哪些问题呢&#xff1f;本文将从以下几个方面进行详细阐述。 msvcp120dll是…...

自动驾驶之—2D到3D升维

前言&#xff1a; 最近在学习自动驾驶方向的东西&#xff0c;简单整理一些学习笔记&#xff0c;学习过程中发现宝藏up 手写AI 3D卷积 3D卷积的作用&#xff1a;对于2DCNN&#xff0c;我们知道可以很好的处理单张图片中的信息&#xff0c;但是其对于视频这种由多帧图像组成的图…...

ubuntu18.4(后改为20.4)部署chatglm2并进行基于 P-Tuning v2 的微调

下载驱动 NVIDIA显卡驱动官方下载地址 下载好对应驱动并放在某个目录下&#xff0c; 在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。 禁用nouveau 首先&#xff0c;编辑黑名单配置。 vim /etc/modprobe.d/blacklist.conf 在文件的最后添加…...

爬虫-获取数据xpath

安装lxml pip3 install lxml基本用法 import reauests from lxml import etree url = xxx res = reuests.get(url).text html = etree.HTML(res) # 获取所有div标签 xpath = //div print(html.xpath(xpath)) #获取id=xx的div标签下的class=yy的span标签 xpath = //div[@id=&quo…...

SpringBoot中使用JdbcTemplate访问Oracle数据库

Oracle相信大家都不陌生吧&#xff0c;一个大型的数据库&#xff0c;至于数据库&#xff0c;我相信各位都比较熟悉了&#xff0c;一个软件系统&#xff0c;不论是我们常做的App、小程序、还是传统的web站点&#xff0c;我们都有用户的信息&#xff0c;相关业务的数据&#xff0…...

【Linux】权限完结

个人主页点击直达&#xff1a;小白不是程序媛 系列专栏&#xff1a;Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时&#xff0c;使用所属者身…...

计算机网络-应用层(3)

一、FTP 文件传输协议 (File Transfer Protocol,FTP) 简称为“文传协 议”,用于在Internet上控制文件的双向传输。 FTP 客户上传文 件时&#xff0c;通过服务器20号端口建立的连接是建立在TCP 之上的数 据连接&#xff0c;通过服务器21号端口建立的连接是建立在TCP 之上的控制连…...

虎去兔来(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

docker基础镜像定制

docker基础镜像定制 1 简言2.准备软件源文件sources.list3.制作基础镜像3.1 编写Dockerfile命令3.2 制作基础镜像k8sbase1.03.3 测试基础镜像1 简言 官方基础镜像一般自带的linux命令是比较少,tcpdump、telnet登等命令是没有的,这时,定制一套适合自己的基础镜像是必要的,在…...

解决git action定时任务执行失败的方法

为了测试git action定时任务是否有效&#xff0c;你可能选择一个最近的时间测试&#xff0c; 但是发现怎么也触发不了&#xff0c;是不是觉得很苦恼。但是同样的时间&#xff0c;在第二天的定时任务又能成功运行。 这是什么原因&#xff1f; 原因就在上图&#xff0c;git act…...

Node编写重置用户密码接口

目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章&#xff0c;本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…...

Day13力扣打卡

打卡记录 奖励最顶尖的 k 名学生(哈希表排序) 用哈希表对所有的positive与negative词条进行映射&#xff0c;然后遍历求解。tip&#xff1a;常用的分割字符串的操作&#xff1a;1.stringstream配合getline() [格式buf, string, char]2.string.find()[find未找到目标会返回npos…...

独立开发者知识贴

有一个github仓库&#xff0c;叫做独立开发变现周刊&#xff0c;很不错&#xff0c;作者能从21年能坚持更新到现在&#xff0c;我很佩服。 它里边有很多独立开发者成功的作品案例&#xff0c;我对这些很感兴趣。 在阅读时&#xff0c;我会问自己以下几个问题&#xff1a; 解…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...