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
自动搜索并使用Log4j
(Log4j
是另一个流行的日志系统),如果没有找到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);
}
}