项目中为什么建议使用日志,而不是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接口编程,而不需要管底下的日志系统到底是哪一种类型,日后更改日志系统的时候,非常方便。