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变量。

希望看到这篇文章的朋友,不再疑惑。


微信,加好友,不用付款

求求别再这么用log4x了的更多相关文章

  1. 2年java,蚂蚁一面,卒

    其实我一个都没答上来.并不是因为我笨,是因为我不会.在大扰的帮助下,现在我会了,求求你再给我一个机会. TreeSet/HashSet 区别 顾名思义,首先是结构上的不同 1.TreeSet背后的结构 ...

  2. 面试被问烂的 Spring IOC(求求你别再问了)

    广义的 IOC IoC(Inversion of Control) 控制反转,即"不用打电话过来,我们会打给你". 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 D ...

  3. 这道Java基础题真的有坑!我求求你,认真思考后再回答。

    本文目录 一.题是什么题? 二.阿里Java开发规范. 2.1 正例代码. 2.2 反例代码. 三.层层揭秘,为什么发生异常了呢? 3.1 第一层:异常信息解读. 3.2 第二层:抛出异常的条件解读. ...

  4. 求求你,下次面试别再问我什么是 Spring AOP 和代理了!

    https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_9403056301388627935% ...

  5. 求求你们不要再用 RSA 私钥加密公钥解密了,这非常不安全!

    最近经常在网上看到有人说巨硬的 CNG(Cryptography Next Generation 即下一代加密技术) 只提供 RSA 公钥加密私钥解密,没有提供 RSA 私钥加密公钥解密,他们要自己封 ...

  6. 求求你,别再用wait和notify了!

    Condition 是 JDK 1.5 中提供的用来替代 wait 和 notify 的线程通讯方法,那么一定会有人问:为什么不能用 wait 和 notify 了? 哥们我用的好好的.老弟别着急,听 ...

  7. 求求你们了,别再写满屏的 if/ else 了!

    为什么我们写的代码都是 if-else? 程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进 ...

  8. 求求你们,别再刷 Star 了!这跟“爱国”没关系!

    这几年,随着几大互联网公司的强大,纷纷投入云计算产业的建设,开源项目作为维护潜在客户群体(开发者)的重要手段,是各大云计算厂商都在努力做的事. 这几年也诞生了很多真正优秀和看似优秀的开源项目.真正优秀 ...

  9. Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】

    D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...

随机推荐

  1. 关于配置Tomcat的URIEncoding

    遇到的问题: 程序需要发送http GET请求到服务器,请求的参数中包含了中文字符.程序中参数为UTF-8格式,且经过了UTF-8 URL编码再发送.使用的tomcat服务器,但服务器端后台程序中取到 ...

  2. [算法] trie树实现

    小写字母的字典树 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 1 ...

  3. Is it possible to run native sql with entity framework?

    For .NET Framework version 4 and above: use ObjectContext.ExecuteStoreCommand() if your query return ...

  4. 用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站

    用saxon框架对xml数据进行过滤 博客分类: Java   Saxon 是一个 XSLT 和XQuery处理器.它是使用 XML 文档和样式表作为输入,然后生成结果文档作为输出的程序,它还包括了一 ...

  5. Linux下gcc编译生成动态链接库*.so文件并调用它 是转载的

    动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...

  6. Objective-c学习笔记3

    objective-c代码块多并发 1.代码块对象是对C语言中函数的扩展,除了函数中的代码,代码块还包含有变量绑定,代码块有时也被称为闭包 2.代码块包含两种绑定类型,自动绑定使用的是栈空间,托管绑定 ...

  7. Ural Vol1(dif>=900)

    目前已AC:  2 1040.Airline Company(构造) 题目要求与每个顶点相连的所有边编号最大公约数为1,其实只要其中的两条边编号互质,所有边编号的最大公约数一定为1.我们知道相邻的数字 ...

  8. 《玩转Bootstrap(基础)》笔记

    基本的HTML模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. python threading模块中对于信号的抓取

    最近的物联网智能网关(树莓派)项目中遇到这样一个问题:要从多个底层串口读取发来的数据,并且做出相应的处理,对于每个串口的数据的读取我能想到的可以采用两种方式: 一种是采用轮询串口的方式,例如每3s向每 ...

  10. jdk1.8中的for循环

    jdk1.8 从语法角度,感觉发生的变化还是蛮大的.在此记录一下. for 循环 public static void main(String[] args) { List<Animal> ...