03-项目中为什么建议使用日志,而不是sysout

项目中为什么建议使用日志,而不是sysout

如果在实际开发中,所有想查看数值的地方都使用sysout方式打印,会给项目上线运行带来问题。

sysout本质是是一个IO操作,通常IO的操作是比较消耗性能的。如果项目的sysout很多,那么对性能的影响就比较大了。

即使上线前专门花时间删除代码中的sysout,也很有可能遗漏,而且非常麻烦。

而如果使用日志系统,那么通过修改日志级别,就可以批量地控制信息的打印。

优先级从高到低分别是ERROR、WARN、INFO、DEBUG

如果设置打印某一级别,则会打印当前级别,和比它级别高的日志

@Test
public void testLog(){
    Logger logger = LoggerFactory.getLogger(CrowdTest.class);
    //优先级从高到低分别是ERROR、WARN、INFO、DEBUG
    //如果设置打印某一级别,则会打印当前级别,和比它级别高的日志
    logger.debug("debug level!");
    logger.debug("debug level!");
    logger.debug("debug level!");

    logger.info("info level!");
    logger.info("info level!");
    logger.info("info level!");

    logger.error("error level!");
    logger.error("error level!");
    logger.error("error level!");

    logger.warn("warn level!");
    logger.warn("warn level!");
    logger.warn("warn level!");
}

一般使用slf4j接口,因为这是一个统一的接口

底层可以更换不同的日志系统。

我这里使用的是jcl-over-slf4j

在logback.xml中可以控制日志级别:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志输出的位置 -->
    <appender name="STDOUT"
              class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体
            内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}]
                [%-5level]
                [%thread]
                [%logger]
                [%msg]%n</pattern>
        </encoder>
    </appender>
    <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
    <root level="INFO">
        <!-- 指定打印日志的 appender,这里通过“STDOUT”引用了前面配置的 appender -->
        <appender-ref ref="STDOUT" />
    </root>
    <!-- 根据特殊需求指定局部日志级别 -->
    <logger name="top.bigking.crowd.mapper" level="DEBUG"/>
</configuration>

在这里涉及到三个东西:

<!-- 日志 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
<!-- 其他日志框架的中间转换包 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>

slf4j只是一个接口,没有具体的实现

logback是具体的日志系统,但是输出的日志,是logback自己的类型

所以我们引入了jcl-over-slf4j,把类型定向到slf4j

这样做的好处是:我们在顶端,只需要面向slf4j接口编程,而不需要管底下的日志系统到底是哪一种类型,日后更改日志系统的时候,非常方便。

金麟岂是池中物,一遇风云便化龙!
原文地址:https://www.cnblogs.com/ABKing/p/12492083.html