java log4j 的一个bug

java项目中使用log4j记录日志几乎成了标配,

最近一个项目中出了个问题  现象是这样的:  不连vpn程序一切正常,连上VPN启动程序 直接异常退出,

错误日志直接指向了 log4j 库

org.apache.logging.log4j.core.util.UuidUtil.clinit    

就是说在 UuidUtil 这个类初始化时出了问题

最终错误在此处

   

 

 数组index超界    

 

原因是在我的机器上不连vpn  mac是一个长度为6的数组   连vpn后长度为8 了

 

mac长度为8   则 length=6  index=2 

则等价于: 

mac=new byte[8];

node=new byte[8];

System.arraycopy(mac, 2, node, 2+ 2, 6);

于是java.lang.ArrayIndexOutOfBoundsException

 

作者的意图我想是:

如果mac长度小于等6 则将其复制到node从2开始的后面几位

如果mac长度大于 6 则复制最后六位到node从2开始的后6位 

则应该写成:

 System.arraycopy(mac,index, node,2,length); 

坑!

 

既然知道原因了 那么解决方案也很简单,直接修改UuidUtil.java 即可

 

 

最后附上异常信息和原类:

Exception in thread "main" java.lang.ExceptionInInitializerError
at org.apache.logging.log4j.core.util.WatchManager.<init>(WatchManager.java:53)
at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:135)
at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:179)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:153)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:78)
at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:65)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:148)
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:45)
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
at org.apache.commons.logging.LogAdapterLog4jLog.<clinit>(LogAdapter.java:155)atorg.apache.commons.logging.LogAdapterLog4jAdapter.createLog(LogAdapter.java:122)
at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59)


Caused by: java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at org.apache.logging.log4j.core.util.UuidUtil.<clinit>(UuidUtil.java:81)

   

posted @   dint  阅读(973)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示