java打日志

1,251 阅读2分钟

1.为什么要用日志?system.out.println()不好吗? system.out.println()只能用在控制台,在开发环境可以这样,但是项目上线到生产环境后,是没有控制台的。如果生产上出现问题,我们该怎么来找问题呢?数据该怎样恢复呢? 这时候就需要用到日志。

2.日志目的? 记录关键操作的轨迹。记录具体时间具体数据具体操作。万一生产出错方便排查。

3.日志门面框架(相当于日志框架的父类)? 很多时候我们做项目都是从简单到复杂,也就是我们很可能一开始使用的是 JDKLog,之后业务复杂了需要使用 Log4J,这时候我们如何将原来写好的日志用新的日志框架输出呢?

一个最死板的方法就是一行行代码修改,把之前用 JDKLog 的日志代码全部修改成 Log4J 的日志接口。 但是这种方式不仅效率低下,而且做的工作都是重复性的工作,这怎么能忍呢。

在实际的项目应用中,有时候可能会从一个日志框架切换到另外一个日志框架的需求,这时候往往需要在代码上进行很大的改动。为了避免切换日志组件时要改动代码,这时候一个叫做 SLF4J(Simple Logging Facade for Java,即Java简单日志记录接口集)的东西出现了。commons-loggin、slf4j 只是一种日志抽象门面,不是具体的日志框架。

4.日志框架? 用日志门面----->面向接口编程。代码中使用接口类,需要换日志框架时不用换代码。 日志框架实现了日志门面的吗?----->实现了的,如日志框架LOG4J,LOGBACK,是根据SLF4J门面来设计的

5.日志代码? 表面上用的日志门面框架的类,实际实现是日志框架。

6.日志框架的配置文件(比如说logback)?

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件输出的文件名-->
        <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
        <!--日志文件保留天数-->
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>

    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </encoder>
    <!--日志文件最大的大小-->
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
        <MaxFileSize>10MB</MaxFileSize>
    </triggeringPolicy>
</appender>

<!-- 日志输出级别 -->
<root level="INFO">
    <appender-ref ref="STDOUT" />
</root>

7.日志测试 注意:Logger,LoggerFactory为日志门面的类。

private final static Logger logger = LoggerFactory.getLogger(SpringbootStudyLoggerApplicationTests.class); @Test public void log() { logger.info("=============================================="); logger.error("=============================================="); logger.debug("=============================================="); }