温馨提示×

Linux下Java日志如何配置

小樊
42
2026-01-04 21:07:45
栏目: 编程语言

Linux下Java日志配置全流程

一 选择日志框架与放置配置

  • 常见方案与适用场景
    • SLF4J + Logback:SLF4J为门面,Logback为默认高性能实现,配置简单、功能完备,适合大多数项目。
    • Log4j 2:性能与功能强,支持异步、过滤器等,适合复杂或高吞吐场景。
    • JUL(java.util.logging):JDK自带,轻量,适合对外部依赖敏感的环境。
  • 配置文件放置与加载
    • 将配置文件放在classpath 根目录(如 Maven/Gradle 工程的src/main/resources)。
    • 常见命名:logback.xmllog4j2.xmllogging.properties(JUL)。应用启动时会自动加载同名配置。

二 常用框架最小可用配置示例

  • SLF4J + Logback(推荐)
    • Maven依赖
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
      </dependency>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.13</version>
      </dependency>
      
    • src/main/resources/logback.xml
      <configuration>
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
          </encoder>
        </appender>
      
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>logs/app.log</file>
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
          </rollingPolicy>
          <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
          </encoder>
        </appender>
      
        <root level="INFO">
          <appender-ref ref="CONSOLE"/>
          <appender-ref ref="FILE"/>
        </root>
      </configuration>
      
  • 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>
      
    • src/main/resources/log4j2.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration status="WARN">
        <Appenders>
          <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %msg%n"/>
          </Console>
          <File name="File" fileName="logs/app.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %msg%n"/>
          </File>
        </Appenders>
        <Loggers>
          <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="File"/>
          </Root>
        </Loggers>
      </Configuration>
      
  • JUL(java.util.logging)
    • 配置 src/main/resources/logging.properties
      handlers= java.util.logging.ConsoleHandler, java.util.logging.FileHandler
      .level= INFO
      java.util.logging.ConsoleHandler.level = INFO
      java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
      java.util.logging.FileHandler.level = INFO
      java.util.logging.FileHandler.pattern = logs/app.log
      java.util.logging.FileHandler.limit = 50000
      java.util.logging.FileHandler.count = 1
      java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
      
    • 启动时指定:-Djava.util.logging.config.file=classpath:logging.properties

三 Linux系统层面的日志轮转与输出管理

  • 使用 logrotate 做按天/按大小滚动、压缩与保留
    • 新建配置:/etc/logrotate.d/myapp
      /opt/myapp/logs/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 640 appuser appgroup
        sharedscripts
        postrotate
          systemctl reload myapp.service >/dev/null 2>&1 || true
        endscript
      }
      
    • 测试与生效:logrotate -vf /etc/logrotate.d/myapp
  • systemd 服务运行并重定向标准输出
    • /etc/systemd/system/myapp.service
      [Unit]
      Description=My Java App
      After=network.target
      
      [Service]
      ExecStart=/usr/bin/java -jar /opt/myapp/app.jar
      StandardOutput=append:/opt/myapp/logs/stdout.log
      StandardError=append:/opt/myapp/logs/stderr.log
      User=appuser
      Group=appgroup
      Restart=on-failure
      
      [Install]
      WantedBy=multi-user.target
      
    • 使配置生效:systemctl daemon-reload && systemctl enable --now myapp
  • 传统方式(不使用 systemd)
    • 前台输出到文件:nohup java -jar app.jar > run.out 2>&1 &
    • 仅输出错误:nohup java -jar app.jar >/dev/null 2>&1 &

四 运行与维护命令

  • 实时查看日志
    • 应用日志:tail -f logs/app.log
    • 控制台输出:tail -f logs/stdout.log
  • 按时间查看:grep "2026-01-04" logs/app.log
  • 按级别筛选:grep " ERROR " logs/app.log
  • 查看进程与日志占用:ps -ef | grep javalsof | grep logs

五 最佳实践与排错要点

  • 使用SLF4J门面解耦代码与实现;在开发与生产可采用不同实现而无需改代码。
  • 统一日志格式(时间、级别、线程、类名/行号等),便于检索与分析。
  • 合理设置日志级别:开发环境用DEBUG,生产建议INFO/WARN,避免过量日志影响性能。
  • 启用异步日志(Log4j 2、Logback均支持)以提升高并发场景吞吐。
  • 配置滚动与保留策略(按天/按大小、压缩、保留天数),防止磁盘被占满。
  • 避免依赖System.out/err;使用日志框架输出结构化信息(如MDC/请求ID)。
  • 注意权限与目录:确保运行用户对日志目录有写权限;建议使用绝对路径
  • 依赖冲突排查:避免同时存在多套日志实现(如 log4j-to-slf4j 与 log4j-slf4j-impl 冲突),保持桥接链条单一。

0