求求别再这么用log4x了
sl4j或者log4j中,推荐的记录方式是:
private Logger log = Logger.getLogger(getClass());
//或者
private static final Logger log = Logger.getLogger(XXX.class);
//调用
log.debug();
log.info();
然后很多人就觉得不爽了,这特么这里声明一个log变量,那里声明一个log变量,多傻呀,于是就产生了下面的记录方式:
LogHelper.debug();//或者LogUtil.debug()
LogHelper.info();
在这里,我不是针对谁,这么用的人,根本没有掌握log4x的意义所在!!!
日志记录解决方案#
阶段一##
最开始,是Console.Write,打印到控制台,看看内容是什么
阶段二##
console有两个弊端:
1)影响正常的输出——生产版本需要将这些打印代码去掉;
2)需要看的时候又一下刷过去了
于是变成文件记录
阶段三##
发现有些信息放在一起,总是从一大段无用的信息中去查找一些信息,于是产生了日志级别,根据不同的级别,记录到不同的地方
发现了Trace, Debug,Info, Warn, Error等级别。
阶段四##
发现调试信息特别多,记录起来没什么意义,要输出还影响程序性能。
但是有些问题,只能在生产环境下重现问题。
于是一种可以灵活控制日志输出的解决方案——log4x出现了。
log4x的用法#
可能很多人的用法仅限于,设置一个root的log配置
<root level="INFO">
<appender-ref ref="console" />
<appender-ref ref="rollingFile" />
</root>
但实际上,还有如下的方式
<logger name="com.abc.www.LogTest" level="DEBUG" />
<logger name="com.abc.www" level="DEBUG" />
<logger name="com.abc" level="DEBUG" />
当有如下logger的实例时
package com.abc.www;
public class LogTest{
private Logger log = LoggerFactory.getLogger(getClass());
}
会优先寻找最匹配的logger配置
如果找到 name="com.abc.www.LogTest"
的logger配置,则使用该配置,否则往上找 name="com.abc.www"
的logger配置,一直到最终root配置。
这才是log4x的最好用的地方!!!
所以,下面这种用法是不是有问题?
//LogHelper中
private static Logger log = LoggerFactory.getLogger("myLogger");
//使用
LogHelper.debug();
LogHelper.info();
其它#
以前我也疑惑log4j的用法,为什么要这么用,为什么要定义这么多log变量。
希望看到这篇文章的朋友,不再疑惑。
微信,加好友,不用付款
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库