本文目录导读:

在Java中输出文件日志有多种方式,我为你介绍几种常用方法,从简单到专业:
使用原生Java IO(最简单)
基础文件写入
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class SimpleFileLogger {
public static void log(String message) {
try (FileWriter fw = new FileWriter("app.log", true);
PrintWriter pw = new PrintWriter(fw)) {
String timestamp = LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
pw.println(timestamp + " - " + message);
} catch (IOException e) {
System.err.println("日志写入失败: " + e.getMessage());
}
}
public static void main(String[] args) {
log("应用启动");
log("用户登录成功");
log("程序执行完毕");
}
}
使用 java.util.logging (JDK自带)
import java.util.logging.*;
import java.io.IOException;
public class JDKFileLogger {
private static final Logger logger = Logger.getLogger(JDKFileLogger.class.getName());
public static void setupLogger() {
try {
// 创建日志处理器
FileHandler fh = new FileHandler("app.log", true);
// 设置日志格式
fh.setFormatter(new SimpleFormatter() {
@Override
public String format(LogRecord record) {
return String.format("[%1$tF %1$tT] [%2$s] %3$s %n",
new java.util.Date(record.getMillis()),
record.getLevel().getName(),
record.getMessage()
);
}
});
// 设置日志级别
logger.setLevel(Level.ALL);
fh.setLevel(Level.ALL);
// 添加处理器
logger.addHandler(fh);
} catch (IOException e) {
System.err.println("日志设置失败: " + e.getMessage());
}
}
public static void main(String[] args) {
setupLogger();
logger.fine("详细调试信息");
logger.info("普通信息");
logger.warning("警告信息");
logger.severe("严重错误");
}
}
使用 Log4j 2(最常用)
添加Maven依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
log4j2.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- 控制台输出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- 文件输出 -->
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<!-- 滚动文件(按大小) -->
<RollingFile name="RollingFile"
fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
Java代码使用
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4j2Example {
private static final Logger logger = LogManager.getLogger(Log4j2Example.class);
public static void main(String[] args) {
logger.trace("最详细的跟踪信息");
logger.debug("调试信息");
logger.info("业务信息");
logger.warn("警告信息");
logger.error("错误信息");
logger.fatal("致命错误");
// 带参数的日志
logger.info("用户 {} 登录系统", "张三");
// 异常日志
try {
int result = 10 / 0;
} catch (Exception e) {
logger.error("计算异常", e);
}
}
}
使用 SLF4J + Logback(推荐方案)
Maven依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.11</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.9</version>
</dependency>
logback.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义日志文件路径 -->
<property name="LOG_PATH" value="logs" />
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 文件输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天滚动 -->
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 保留30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 日志级别设置 -->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
<!-- 特定包的日志级别 -->
<logger name="com.example" level="DEBUG" />
</configuration>
Java代码使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackExample {
private static final Logger logger = LoggerFactory.getLogger(LogbackExample.class);
public static void main(String[] args) {
// 基本使用
logger.info("应用启动完成");
logger.debug("正在初始化数据库连接");
logger.warn("磁盘空间不足,仅剩 {} GB", 2.5);
// 记录异常
try {
throw new RuntimeException("测试异常");
} catch (Exception e) {
logger.error("发生异常: ", e);
}
}
}
实践建议
- 生产环境:推荐使用 SLF4J + Logback 或 Log4j 2
- 小项目:可以使用
java.util.logging - 配置管理:使用配置文件,便于修改
- 日志级别:开发用 DEBUG,生产用 INFO
- 文件管理:使用滚动文件避免日志过大
- 性能考虑:避免在循环中打印过多日志
选择哪种方案取决于你的项目规模和需求,对于企业级应用,强烈推荐使用 SLF4J + Logback 或 Log4j 2。