Java案例怎么输出文件日志?

wen java案例 9

本文目录导读:

Java案例怎么输出文件日志?

  1. 使用原生Java IO(最简单)
  2. 使用 java.util.logging (JDK自带)
  3. 使用 Log4j 2(最常用)
  4. 使用 SLF4J + Logback(推荐方案)
  5. 实践建议

在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);
        }
    }
}

实践建议

  1. 生产环境:推荐使用 SLF4J + LogbackLog4j 2
  2. 小项目:可以使用 java.util.logging
  3. 配置管理:使用配置文件,便于修改
  4. 日志级别:开发用 DEBUG,生产用 INFO
  5. 文件管理:使用滚动文件避免日志过大
  6. 性能考虑:避免在循环中打印过多日志

选择哪种方案取决于你的项目规模和需求,对于企业级应用,强烈推荐使用 SLF4J + Logback 或 Log4j 2。

抱歉,评论功能暂时关闭!