• 求求别再这么用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变量。
    希望看到这篇文章的朋友,不再疑惑。


    微信,加好友,不用付款
    二维码

  • 相关阅读:
    Angular 11 中 Schematics 的代码优化
    GoEasy使用阿里云OSS出现的问题
    易班模拟登录-Day1笔记
    类型别名与接口
    TypeScript中的数据类型
    Javascript类型系统
    手写Promise3
    手写Promise2
    手写Promise1
    Promise基础用法2
  • 原文地址:https://www.cnblogs.com/binblog/p/6307344.html
Copyright © 2020-2023  润新知