温馨提示×

Ubuntu Java日志记录怎么做

小樊
46
2025-12-28 02:21:58
栏目: 编程语言

Ubuntu Java 日志记录实操指南

一 整体思路与分层

  • 应用内使用成熟的日志框架进行输出、格式化和滚动:推荐 SLF4J + Logback(性能与功能均衡)或 Log4j 2(异步与插件丰富)。输出同时覆盖 控制台滚动文件,便于本地排查与长期留存。
  • 系统层用 logrotate 做文件轮转、压缩与清理,避免磁盘被占满。
  • 运行在 systemd 的服务,用 journalctl 统一查看与检索服务日志。
  • 需要集中化时,搭建 ELK(Elasticsearch + Logstash + Kibana)Graylog 做检索与可视化。
  • 日志级别建议:开发环境用 DEBUG,生产环境用 INFO/WARN/ERROR;尽量输出结构化(如 JSON)或统一 Pattern,便于后续采集与检索。

二 应用内日志框架配置

  • 选择组合:优先 SLF4J + Logback;或选择 Log4j 2;仅简单场景可用 JUL(java.util.logging)
  • 输出目标:同时配置 ConsoleRollingFile,滚动策略按 时间/大小 触发,设置保留天数与压缩。
  • 最小可用示例(resources 目录下放置配置文件,应用启动自动加载):
    • Logback(resources/logback.xml)
      <configuration>
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %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}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
              <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
          </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>
      </configuration>
      
    • Log4j 2(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 - %m%n"/>
          </Console>
          <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} %-5p %c{1}:%L - %m%n"/>
            <Policies>
              <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
              <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="20"/>
          </RollingFile>
        </Appenders>
        <Loggers>
          <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
          </Root>
        </Loggers>
      </Configuration>
      
    • JUL(使用默认 logging.properties 并通过启动参数指定)
      handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
      java.util.logging.FileHandler.pattern=/var/log/myapp/java.log
      java.util.logging.FileHandler.limit=10485760
      java.util.logging.FileHandler.count=5
      java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
      java.util.logging.ConsoleHandler.level=ALL
      java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
      .level=INFO
      
      启动命令示例:java -Djava.util.logging.config.file=logging.properties -jar myapp.jar。

三 系统层日志轮转与清理

  • 使用 logrotate 管理应用日志文件(适合与框架内置滚动配合或作为兜底策略)。
  • 创建配置:sudo nano /etc/logrotate.d/myapp
    /var/log/myapp/*.log {
        daily
        rotate 7
        compress
        missingok
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
            systemctl restart myapp.service  # 可选:确保应用重新打开新日志文件
        endscript
    }
    
  • 测试与生效:sudo logrotate -f /etc/logrotate.d/myapp(强制立即轮转)。

四 使用 Systemd 运行与 Journal 查看

  • 若以 systemd 管理服务(如 myapp.service),可用 journalctl 高效检索:
    • 查看服务日志:journalctl -u myapp.service
    • 实时跟踪:journalctl -u myapp.service -f
    • 按时间范围:journalctl -u myapp.service --since “2025-10-20” --until “2025-10-22”
    • 导出到文件:journalctl -u myapp.service > /var/log/myapp/journal.log
  • 调整系统级日志保留(/etc/systemd/journald.conf):
    • SystemMaxUse=500M;SystemKeepFree=100M;SystemMaxFileSize=50M;SystemMaxFiles=5
    • 生效:sudo systemctl restart systemd-journald

五 常用查看命令与集中化方案

  • 常用命令(快速排查):
    • 实时查看:tail -f /var/log/myapp/app.log
    • 关键字搜索:grep “ERROR/var/log/myapp/app.log;grep -i “exception/var/log/myapp/app.log
    • 分页查看:less /var/log/myapp/app.log
    • 头尾若干行:head -n 50;tail -n 50
  • 集中化日志(可选):搭建 ELKGraylog,将应用日志采集、存储、检索与可视化,适合多节点或需要深度分析的场景。

0