以Log4j2的2.14.1版本为例,分析Log4j2的代码分布情况,看看这个主流的开源日志库,其主要精力花在了哪里?其代码分布合理性如何?
统计口径:统计Java代码文件文本行数,注释、空行、纯代码都算在内。
一、Log4j各模块代码占比
模块名 | JAVA文本行 | JAVA文本行占比 |
log4j-1.2-api | 15449 | 5.45% |
log4j-api | 41926 | 14.79% |
log4j-api-java9 | 687 | 0.24% |
log4j-appserver | 448 | 0.16% |
log4j-cassandra | 699 | 0.25% |
log4j-core | 162398 | 57.28% |
log4j-core-its | 939 | 0.33% |
log4j-core-java9 | 374 | 0.13% |
log4j-couchdb | 251 | 0.09% |
log4j-docker | 964 | 0.34% |
log4j-flume-ng | 4259 | 1.50% |
log4j-iostreams | 4876 | 1.72% |
log4j-jcl | 406 | 0.14% |
log4j-jdbc-dbcp2 | 646 | 0.23% |
log4j-jmx-gui | 741 | 0.26% |
log4j-jpa | 3561 | 1.26% |
log4j-jpl | 334 | 0.12% |
log4j-jul | 2127 | 0.75% |
log4j-kubernetes | 743 | 0.26% |
log4j-layout-template-json | 14629 | 5.16% |
log4j-liquibase | 184 | 0.06% |
log4j-mongodb3 | 1136 | 0.40% |
log4j-mongodb4 | 949 | 0.33% |
log4j-osgi | 532 | 0.19% |
log4j-perf | 12055 | 4.25% |
log4j-samples | 1276 | 0.45% |
log4j-slf4j-impl | 1965 | 0.69% |
log4j-slf4j18-impl | 1698 | 0.60% |
log4j-spring-boot | 535 | 0.19% |
log4j-spring-cloud-config | 662 | 0.23% |
log4j-taglib | 2645 | 0.93% |
log4j-to-slf4j | 1031 | 0.36% |
log4j-web | 2387 | 0.84% |
二、log4j-core代码占比
包名 | 用途 | JAVA文本行 | JAVA文本行占比 |
org.apache.logging.log4j.core.appender | 日志附加器 | 22339 | 21.94% |
org.apache.logging.log4j.core.async | 低延迟异步日志支持 | 3728 | 3.66% |
org.apache.logging.log4j.core.config | 配置支持 | 15873 | 15.59% |
org.apache.logging.log4j.core.filter | 过滤器 | 4462 | 4.38% |
org.apache.logging.log4j.core.impl | 私有实现 | 4623 | 4.54% |
org.apache.logging.log4j.core.jackson | jackson序列化支持 | 2109 | 2.07% |
org.apache.logging.log4j.core.jmx | jmx支持 | 2080 | 2.04% |
org.apache.logging.log4j.core.layout | 布局 | 7026 | 6.90% |
org.apache.logging.log4j.core.lookup | 占位符变量替换查找 | 3474 | 3.41% |
org.apache.logging.log4j.core.message | 捕获线程信息 | 225 | 0.22% |
org.apache.logging.log4j.core.net | 支持网络传输与访问 | 4642 | 4.56% |
org.apache.logging.log4j.core.osgi | osgi支持 | 322 | 0.32% |
org.apache.logging.log4j.core.parser | 解码器 | 293 | 0.29% |
org.apache.logging.log4j.core.pattern | 格式串中的模式替换 | 7427 | 7.29% |
org.apache.logging.log4j.core.script | 脚本支持 | 607 | 0.60% |
org.apache.logging.log4j.core.selector | 上下文选择子 | 755 | 0.74% |
org.apache.logging.log4j.core.time | 特殊时钟包装实现 | 335 | 0.33% |
org.apache.logging.log4j.core.tools | 命令行工具支持与代码生成支持 | 6081 | 5.97% |
org.apache.logging.log4j.core.util | 12383 | 12.16% | |
org.apache.logging.log4j.core | 3036 | 2.98% |
log4j的core包中,包括了太多常见应用所不需要的高级特性,这些特性纳入core包之后,log4j的使用方会被动引入这些代码,而这些代码提供了非常强大的功能,配置文件未开启相关能力,也有可能被别人进行利用。这些代码更像是一个巨型工具集,围绕日志能力,形成了日志从打印开始,到内部传递,格式化,存储,传输,命令行,网络接口等一系列的工具集合,形成了丰富的log4j生态体系。
如果这些生态体系,能够在core之外,让应用开发人员按需引入,或者分层引入,应该会是更好的选择,而不是作为一个包一股脑搞进去,随用随取。在模块层级结构上省的力气,在应用引入jar包上省的力气,与因此而引入的风险相比,不值一提。
任性与取巧是要付出代价的,尤其在底层基础组件领域。