Skip to content

日志集成

log4j2

POM

xml
<!-- commons-logging 与 log4j2 集成 -->
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.2</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-jcl</artifactId>
    <version>2.2</version>
</dependency>

配置文件 log4j2.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="180" packages="">
    <properties>
        <property name="logdir">logs</property>
        <property name="PATTERN">%date{YYYY-MM-dd HH:mm:ss,SSS} %level [%thread][%file:%line] - %msg%n%throwable</property>
    </properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="${PATTERN}"/>
        </Console>

        <RollingFile name="ErrorAppender" fileName="${logdir}/error.log"
                     filePattern="${logdir}/$${date:yyyy-MM-dd}/error.%d{yyyy-MM-dd-HH}.log" append="true">
            <PatternLayout pattern="${PATTERN}"/>
            <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <RollingFile name="DebugAppender" fileName="${logdir}/info.log"
                     filePattern="${logdir}/$${date:yyyy-MM-dd}/info.%d{yyyy-MM-dd-HH}.log" append="true">
            <PatternLayout pattern="${PATTERN}"/>
            <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="200 MB"/>
            </Policies>
        </RollingFile>

        <!--异步appender-->
        <Async name="AsyncAppender" includeLocation="true">
            <AppenderRef ref="ErrorAppender"/>
            <AppenderRef ref="DebugAppender"/>
        </Async>
    </Appenders>

    <Loggers>
        <!--过滤掉spring和mybatis的一些无用的debug信息-->
        <logger name="org.springframework" level="INFO" />
        <logger name="org.mybatis" level="INFO" />
        <logger name="cn.itcast.wanxinp2p.consumer.mapper" level="DEBUG" />
        <logger name="springfox" level="INFO" />
        <logger name="org.apache.http" level="INFO" />
        <logger name="com.netflix.discovery" level="INFO" />
        <logger name="RocketmqCommon"  level="INFO" />
        <logger name="RocketmqRemoting" level="INFO" />
        <logger name="RocketmqClient" level="WARN" />
        <logger name="org.dromara.hmily" level="WARN" />
        <logger name="org.dromara.hmily.lottery" level="WARN" />
        <logger name="org.dromara.hmily.bonuspoint" level="WARN" />
        <!--OFF   0-->
        <!--FATAL   100-->
        <!--ERROR   200-->
        <!--WARN   300-->
        <!--INFO   400-->
        <!--DEBUG   500-->
        <!--TRACE   600-->
        <!--ALL   Integer.MAX_VALUE-->
        <Root level="DEBUG" includeLocation="true">
            <AppenderRef ref="AsyncAppender"/>
            <AppenderRef ref="Console"/>
            <AppenderRef ref="DebugAppender"/>
        </Root>
    </Loggers>
</Configuration>

日志使用

java
package top.wlpnz.log;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * <h1>使用 log4j2</h1>
 * */
public class UseLog4j2 {
    private static final Log logger = LogFactory.getLog(UseLog4j2.class);
    // 使用log4j2
    private static final Logger logger2 = LogManager.getLogger(UseLog4j2.class);
    // 这样做有什么好处呢 ?
    // 在子类中可以直接使用logger3 不需要声明
    protected final Log logger3 = LogFactory.getLog(getClass());
    /**
     * <h2>log4j2 支持占位符, jcl 不支持</h2>
     * */
    public static void placeholder() {

        logger2.info("use placeholder, not: [{}]", "abcde");
    }

    /**
     * <h2>打印异常栈</h2>
     * */
    public static void logWithException() {

        try {
            System.out.println(Integer.parseInt("a"));
        } catch (NumberFormatException ex) {
            logger.error("parse int has some error", ex);
        }
    }
    public static void main(String[] args) {
        // 最基本的打印方法
        logger.error("use jcl + log4j2 to log");
        logger.info("use jcl + log4j2 to log");
        logger2.info("use lo4j2 to log");
    }
}

logback

POM

xml
 <!-- slf4j 与 logback 集成 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

简易配置文件

xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>

    <logger name="top.wlpnz.log" level="info" additivity="false">
        <appender-ref ref="STDOUT"/>
    </logger>
</configuration>

代码

java
package top.wlpnz.log;

import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * <h1>Logback 的使用</h1>
 * */
public class UseLogback {
    private static final Logger logger = LoggerFactory.getLogger(UseLogback.class);
    /**
     * <h2>支持占位符</h2>
     * */
    private static void log() {
        logger.info("this is slf4j + logback: [{}]", UseLogback.class.getName());
    }
    private static void levelLog() {
        logger.trace("slf4j + logback: [{}]", "trace");
        logger.debug("slf4j + logback: [{}]", "debug");
        logger.info("slf4j + logback: [{}]", "info");
        logger.warn("slf4j + logback: [{}]", "warn");
    }
    /**
     * <h2>打印 logback 的内部状态</h2>
     * */
    private static void printLogbackStatus() {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        StatusPrinter.print(loggerContext);
    }

    public static void main(String[] args) {
        levelLog();
    }
}

lombok

POM

xml
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
</dependency>

lombok底层使用logback,可以使用logback的配置文件

在idea中开发java项目,且使用lombok的话,需要安装lombok插件

代码

java
//@Slf4j(topic = "wlpnz")
@Slf4j  //topic在日志中将默认的全类名替换成topic的值
public class UseLombok {
    private static void levelLog() {
        log.trace("lombok : [{}]", "trace");
        log.debug("lombok : [{}]", "debug");
        log.info("lombok : [{}]", "info");
        log.warn("lombok : [{}]", "warn");
    }
    public static void main(String[] args) {
        levelLog();
    }
}

Last updated:

开发者笔记仓库