slf4j、Log4j、Log4j2与Logback关系详解和相关用法
作为一名 Java 开发程序员,我们对项目中的日志打印肯定不会陌生,但是有没有发现,Java 的日志框架有很多,琳罗满目,这些框架有什么区别呢?有什么关系呢?在了解之后,仅以本文做一点粗浅的记录。
作为一名 Java 开发程序员,我们对项目中的日志打印肯定不会陌生,但是有没有发现,Java 的日志框架有很多,琳罗满目,这些框架有什么区别呢?有什么关系呢?在了解之后,仅以本文做一点粗浅的记录。
在 Proxmox 6.5.11-8 中,偶发性会出现以下报错,尤其是在进行大文件传输后:
1 | [97377.240263] e1000e 0000:00:1f eno1: Detected Hardware Unit Hang: |
一旦出现该问题,Synology NAS 就会进入不可用的状态。
错误信息表明网络接口卡(NIC)在进行数据传输时遇到了硬件单元挂起的问题。这种情况在重网络负载时更容易发生。
这是多年来 I219-V、I218-V… 网卡型号及其驱动程序的一个已知错误。不仅在 proxmox 上,在 xcp-ng 上也是如此。
这个问题,截止 Proxmox 6.5.11-8 仍未被彻底解决,只能通过禁用 TCP 校验和卸载。
通过执行命令:ethtool -K eno1 tso off gso off gro off
即可解决,但是每次重启机器或者网卡,都会失效。具体含义下方会说明。
如何长期解决?
在 /etc/network/interfaces
中,添加以下代码:
1 | iface eno1 inet manual |
eno1
接口启动之后执行一系列动作。logger
程序,将一条调试级别(debug
)的信息写入系统日志。日志内容为 "Disabling offload for eno1"
,标记为 ifup
。这样做的目的是记录接口启动时禁用某些功能的动作,方便日后查看系统日志,了解配置是否按预期执行。(可通过 journalctl -t ifup -p debug
查看日志)ethtool
工具来关闭网络接口的一些“硬件卸载(offload)”功能。具体地:[!info] 信息
- TSO、GSO 和 GRO 分别用于控制 TCP 分段、通用分段和接收卸载,这三个是针对传输层和网络层的优化。
- tx off 和 rx off 是更通用的选项,用于关闭整个发送(TX)和接收(RX)的卸载功能。
如果已经关闭了 TSO、GSO 和 GRO,那么
tx off
和rx off
可能会显得多余,因为这些设置会影响整个数据包的处理,而不只是特定的卸载功能。在大多数情况下,只需关闭 TSO、GSO 和 GRO 就可以了,
tx off
和rx off
可以根据需要选择是否使用。如果需要彻底禁用卸载功能,可以使用它们,但通常只关闭 TSO、GSO 和 GRO 是足够的。
[!note] 注意
这对于一些系统可能没有生效,那么可以尝试通过注册 Service 的方式执行。这里不赘述。
如何查看 tso、gso、gro 是否已经关闭:ethtool -k eno1 | grep -E 'tso|gso|gro'
均为 off,说明已经关闭。
如何查看 TCP 校验和卸载是否开启:ethtool -a eno1
些参数主要用于控制网络接口的流量控制,以减少数据包丢失,确保在网络拥堵时网络的稳定性。
配置后,Synology NAS 终于不会再“突发恶疾”了!!!
当 NGINX 的日志文件变得过大时,通常的做法是进行日志切片(log rotation),这样可以防止单个日志文件过大,便于管理和存储。
而 NGINX 自身或者其扩展的模块均不支持类似的功能。 所以 NGINX 日志切片通常需要依赖外部工具来实现,比如 Linux 系统中常用的 logrotate
。以下是如何使用 logrotate
对 NGINX 日志进行切片的步骤:
OpenMediaVault (OMV) 是一款基于 Debian 的开源网络附加存储(NAS)解决方案,它通过易于使用的界面提供数据存储、备份和共享服务。结合 Nextcloud,用户可以在 OMV 平台上搭建一个功能强大的私人网盘,实现文件同步、分享和协作。这种组合不仅增强了数据的可访问性和安全性,也为个人和小型企业提供了一个成本效益高、隐私保护好的云存储解决方案。通过 Docker 容器或直接安装,OMV 与 Nextcloud 的整合可以轻松完成,满足现代数字生活的存储需求。
当我使用 Windows 11 下的 VSCode 启动 Vue 项目时,出现以下报错:
1 | ERROR error when starting dev server: |
在 Apache ServiceComb 中,Highway
, Vertx
, 和 HTTP
都与微服务间的通信有关,但它们之间的角色和关系是不同的。下面是一个简要的描述来解释它们之间的关系:
Highway:
Vertx:
HTTP:
关系总结:
基于以上的描述,我们可以看到,Highway 和 HTTP 都是通信协议,但目标和设计思路略有不同,而 Vert.x 是提供通信框架和异步处理能力的库。
Java 语言普遍用于开发各种类型的软件系统、应用程序和 Web 服务,包括财务软件系统、社交网络软件、移动应用程序(虽然现在多用 Kotlin)、虚拟现实系统、嵌入式系统、大数据应用程序等。
此外,Java 还常用于开发游戏服务器和游戏客户端、智能家居软件和安全相关软件。
Go 语言很适合构建高性能的高并发的服务,可以在游戏、金融、物联网、系统工具等方面得到应用。Go 语言还可以开发分布式系统,构建容器、虚拟化、存储等云计算基础架构。因此 Go 语言可以用于以下任务:
此外,Go 易学快捷,而且可以完成高效的字节码编译,所以适合建立大型应用系统和分布式系统。
Python 语言常用来做程序开发/应用开发、桌面开发(PyQt)、网络编程、Web 开发、科学计算、自动化测试、人工智能、大数据等任务。
此外,Python 还可以用来编写游戏,移动应用等,但很少被用来做这类事情。
docker 导入镜像 tar 包报错,报错信息如下:
通过报错信息可以看出,是导入的时候,docker 对 SHA256 哈希码进行校验,没有校验通过,说明这个镜像 tar 包被修改过。为了验证,我们可以利用 MD5 对镜像进行比对
在通过 docker save 镜像名称/id -o demo.tar
命令导出镜像 tar 包后,计算出 tar 包的 MD5 值
1 | md5sum demo.tar # md5sum 是 Linux 自带的命令 |
将 demo.tar 从 Linux 下载下来后,再次对 demo.tar 计算 MD5 值
1 | certutil -hashfile demo.tar MD5 # certutil 是 Windows 自带的程序 |
计算后,对比上面两步的 MD5 值,如果不一致,说明从 Linux 将 demo.tar 包下载下来时,可能因为网络等原因,导致数据发生了改变,从而产生这个错误。只需要重新从 Linux 下载 demo.tar 即可,下载后再次计算 MD5 进行对比,直到一致。
在使用 Spring 集成的 cglib 手动对某个类进行代理增强时报了以下错误:
Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not “opens java.lang” to unnamed module @5c29bfd
我的代码为:
1 | public class CglibProxyForMultiInterfacesTest { |
貌似是高版本的 JDK 禁用了反射权限,需要添加 JVM 参数去开启
1 | --add-opens java.base/java.lang=ALL-UNNAMED |