20. 日志

t。例如,只输出错误日志;

  • 可以被重定向到文件,这样可以在程序运行结束后查看日志;
  • 可以按包名控制日志级别,只输出某些包打的日志;

1.2使用

package logger;

import java.util.logging.Logger;

public class LoggerClass {
    public static void log() {
        Logger logger = Logger.getLogger("Main");
        logger.warning("warning message");
        logger.info("info message");
        logger.fine("fine message");
        logger.severe("serve message");
    }
}

5月 28, 2025 1:59:50 下午 logger.LoggerClass log
警告: warning message
5月 28, 2025 1:59:50 下午 logger.LoggerClass log
信息: info message
5月 28, 2025 1:59:50 下午 logger.LoggerClass log
严重: serve message

1.3 输出级别

使用日志级别的好处在于,调整级别,就可以屏蔽掉很多调试相关的日志输出。默认级别是INFO
从严重到轻微依次为:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

2. Commons Logging

Commons Logging是一个第三方日志库,它是由Apache创建的日志模块。
它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Loggin自动搜索并使用Log4jLog4j是另一个流行的日志系统),如果没有找到Log4j,再使用JDK Logging

2.1 下载

下载地址
下载后,解压,找到commons-logging-*.jar这个文件,将文件放入到项目jar包目录下,然后加入classpath

2.2 使用

步骤如下:

  • 引入b包;
  • 通过LogFactory获取Log类的实例;
  • 使用Log实例的方法打日志。
import logger.LoggerCommon;
...
public static void main(String[] args) {
    LoggerCommon.log("common logger");
}

#logger.LoggerCommon.java
package logger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LoggerCommon {
    static final Log log = LogFactory.getLog(LoggerCommon.class);
    //protected final Log log = LogFactory.getLog(getClass());
    public static void log(String msg) {
        log.info(msg);
        log.warn(msg);
    }
}

5月 28, 2025 2:44:54 下午 logger.LoggerCommon log
信息: common logger
5月 28, 2025 2:44:54 下午 logger.LoggerCommon log
警告: common logger

如果在静态方法中引用Log,通常直接定义一个静态类型变量:static final Log log = LogFactory.getLog(LoggerCommon.class);
在实例方法中引用Log,通常定义一个实例变量:protected final Log log = LogFactory.getLog(getClass());

2.3 日志级别

默认级别是INFO。

  • FATAL
  • ERROR
  • WARNING
  • INFO
  • DEBUG
  • TRACE

3. Log4j

3.1 简介

上面第二项介绍Commons Logging,可以作为“日志接口”来使用。而真正的“日志实现”可以使用Log4j,目前版本2.24.3
Log4j是一个组件化设计的日志系统,它的架构大致如下:

log.info("User signed in.");
 │
 │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 ├──>│ Appender │───>│  Filter  │───>│  Layout  │───>│ Console  │
 │   └──────────┘    └──────────┘    └──────────┘    └──────────┘
 │
 │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 ├──>│ Appender │───>│  Filter  │───>│  Layout  │───>│   File   │
 │   └──────────┘    └──────────┘    └──────────┘    └──────────┘
 │
 │   ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
 └──>│ Appender │───>│  Filter  │───>│  Layout  │───>│  Socket  │
     └──────────┘    └──────────┘    └──────────┘    └──────────┘

Filter过滤日志级别,Layout格式化日志。
它也可以支持多种输出模式:

  • console:输出到屏幕;
  • file:输出到文件;
  • socket:通过网络输出到远程计算机;
  • jdbc:输出到数据库

3.2 下载

下载地址,下载Binaries,解压出来将log4j-api-2.x.jar,log4j-core-2.x.jar,log4j-jcl-2.x.jar放到classpath

3.2 配置

Log4j是通过配置管理的,将下面的log4j2.xml放到classpath就可以配置来输出日志了:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <!-- 定义日志格式 -->
        <Property name="log.pattern">%d{MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36}%n%msg%n%n</Property>
        <!-- 定义文件名变量 -->
        <Property name="file.err.filename">log/err.log</Property>
        <Property name="file.err.pattern">log/err.%i.log.gz</Property>
    </Properties>
    <!-- 定义Appender,即目的地 -->
    <Appenders>
        <!-- 定义输出到屏幕 -->
        <Console name="console" target="SYSTEM_OUT">
            <!-- 日志格式引用上面定义的log.pattern -->
            <PatternLayout pattern="${log.pattern}" />
        </Console>
        <!-- 定义输出到文件,文件名引用上面定义的file.err.filename -->
        <RollingFile name="err" bufferedIO="true" fileName="${file.err.filename}" filePattern="${file.err.pattern}">
            <PatternLayout pattern="${log.pattern}" />
            <Policies>
                <!-- 根据文件大小自动切割日志 -->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <!-- 保留最近10份 -->
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <!-- 对info级别的日志,输出到console -->
            <AppenderRef ref="console" level="info" />
            <!-- 对error级别的日志,输出到err,即上面定义的RollingFile -->
            <AppenderRef ref="err" level="error" />
        </Root>
    </Loggers>
</Configuration>

需要将log4j2.xml加入classpath中,我是放在 Main.java同级目录,如果放到其他目录,可以参考如下步骤:

  • 右键项目 → Open Module Settings (或按F4)
  • 选择Modules → 选择你的模块
  • 切换到Sources标签页
  • 找到包含log4j2.xml的目录,右键选择Resources
  • 点击Apply和OK
package logger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class LoggerCommon {
    static final Log log = LogFactory.getLog(LoggerCommon.class);
    public static void log(String msg) {
        log.trace("Trace级别消息");
        log.debug("Debug级别消息");
        log.info("Info级别消息");
        log.warn("Warn级别消息");
        log.error("Error级别消息");
        log.fatal("Fatal级别消息");
        log.info(msg);
        log.warn(msg);
    }
}
image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容