给你的Java项目加入日志记录

让你的项目清晰条理

Posted by AchanYao on June 1, 2019

什么是日志

日志用来记录用户操作、系统运行状态等,是一个系统的重要组成部分。然而,由于日志通常不属于系统的核心功能,所以常常不被团队成员所重视。对于一些简单的小程序,可能并不需要在如何记录日志的问题上花费太多精力。但是对于作为基础平台为很多产品提供服务的后端程序,就必须要考虑如何依靠良好的日志来保证系统可靠的运行了。

日志的级别

日志基本分为以下几类(从低到高):

  1. TRACE - TRACE级别指定比DEBUG更细粒度的信息事件
  2. DEBUG - DEBUG级别指定对调试应用程序最有用的细粒度信息事件
  3. INFO - INFO级别指定信息性消息,突出显示粗粒度级别的应用程序进度
  4. WARN - WARN级别指定潜在的有害情况
  5. ERROR - ERROR级别指定可能仍允许应用程序继续运行的错误事件
  6. FATAL - FATAL级别指定非常严重的错误事件,可能会导致应用程序中止

LOG4J

Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。

加入log4j

在Maven中加入log4j包。

    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.11.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.11.2</version>
    </dependency>
    <!--如果要使用log4j1 需要加入以下依赖-->
    <!-- <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.6.4</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.6.4</version>
    </dependency> -->

或将其下载出来加入Java项目build path,(web项目的lib文件夹)

log4j的使用

  1. 配置log4j

在项目中新建文件log4j2.xml文件,log4j会自动找到它

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="ERROR" monitorInterval="600">
    <!-- configure.status 为设置日志输出级别,级别如下:OFF 、FATAL 、ERROR、WARN、INFO、DEBUG、TRACE、ALL,这里设置的是Log4j本身的日志级别 -->
    <!-- configure.monitorInterval 监控间隔 指log4j2每隔600秒(10分钟),自动监控该配置文件是否有变化,如果变化,则自动根据文件内容重新配置 -->

    <Properties>
        <property name="pattern">%d{yyyy/MM/dd HH:mm:ss.SSS} [%p] %t %c %m%n</property>
        <!--JavaSE项目可以使用相对路径如下,但JavaEE项目中只能使用绝对路径-->
        <!--可以通过服务器提供的系统设置来达到相对路径的效果-->
        <!--tomcat中 ${web:rootDir}表示根目录 ${sys:catalina.home}表示Tomcat根目录-->
        <property name="basePath">logs</property>
    </Properties>

    <!--配置appenders源:日志输出的地址-->
    <Appenders>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}"/>
        </Console>

        <!--filePattern 配置按天分存的命名格式-->
        <RollingRandomAccessFile name="fileLogger"
                                 fileName="${basePath}/log.log"
                                 filePattern="${basePath}/log-%d{yyyy-MM-dd}.log"
                                 append="true">
            <!--配置日志输出格式-->
            <PatternLayout pattern="${pattern}"/>

            <Policies>
            <!--interval 设置两次封存动作的时间间隔,以日志的命名精度来确定单位,比如 yyyy-MM-dd-HH单位为小时,yyyy-MM-dd单位为天-->
            <!--modulate 设置是否以0点作为边界进行偏移运算 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--设置单个日志文件大小-->
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>

    <!--配置logers:级别、使用的输出地 只有定义了logger并引入appender才能生效-->
    <Loggers>
    <!--配置输出的包 additivity 是否在父配置中输出(这里指的是root)-->
        <Logger name="com.achan" level="debug" additivity="true">
            <appender-ref ref="fileLogger" level="debug"/>
        </Logger>

        <!--配置root根作为默认输出-->
        <Root level="info" additivity="false">
            <appender-ref ref="console"/>
        </Root>
    </Loggers>
</Configuration>
  1. 在Java代码中使用
import org.apache.ibatis.session.SqlSession;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class App {

    private static final Logger LOGGER = LogManager.getLogger(App.class.getName());

    public static void main(String[] args) {
        LOGGER.info("start");
    }
}

mybatis集成log4j

配置完log4j后,在mybatis配置文件中加入以下代码:

    <settings>
        <!--如果需要使用log4j1 value="LOG4J"-->
        <setting name="logImpl" value="LOG4J2" />
    </settings>