首页主机资讯Ubuntu中Java日志管理怎么做

Ubuntu中Java日志管理怎么做

时间2025-12-02 22:18:04发布访客分类主机资讯浏览930
导读:Ubuntu 上 Java 日志管理实操指南 一 整体思路与分层 应用内使用成熟的日志框架(如 SLF4J + Logback 或 Log4j2)进行日志输出、格式化和滚动。 系统层用 logrotate 做文件轮转、压缩与清理,避免磁盘...

Ubuntu 上 Java 日志管理实操指南

一 整体思路与分层

  • 应用内使用成熟的日志框架(如 SLF4J + LogbackLog4j2)进行日志输出、格式化和滚动。
  • 系统层用 logrotate 做文件轮转、压缩与清理,避免磁盘被占满。
  • 运行在 systemd 的服务,用 journalctl 统一查看与检索服务日志。
  • 需要集中化时,搭建 ELK(Elasticsearch + Logstash + Kibana)Graylog 做检索与可视化。

二 应用内日志框架配置

  • 选择组合:推荐 SLF4J + Logback(性能与功能均衡),或 Log4j2(异步与丰富插件)。
  • 输出目标:同时支持 控制台滚动文件,便于本地排查与长期留存。
  • 滚动策略:按 时间/大小 滚动,设置保留天数与压缩,避免单文件过大。
  • 日志级别:生产以 INFO/WARN/ERROR 为主,调试阶段可临时开启 DEBUG
  • 结构化:尽量输出 JSON 或统一 Pattern,便于后续采集与检索。
  • 最小示例
    • 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>
          
      
    • Log4j2(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(java.util.logging) 并通过启动参数指定配置:
      java -Djava.util.logging.config.file=logging.properties -jar myapp.jar
      
      参考配置(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
      

以上做法覆盖 Log4j/Logback/SLF4JJUL 的常见用法与最小可用配置。

三 系统层日志轮转与清理

  • 使用 logrotate 管理应用日志文件(适合文件日志,而非 journald 日志)。
  • 放置配置:在 /etc/logrotate.d/ 创建应用专属配置,例如 /etc/logrotate.d/myapp
    /var/log/myapp/*.log {
        
        daily
        rotate 7
        compress
        delaycompress
        missingok
        notifempty
        create 0640 myapp myapp
        sharedscripts
        postrotate
            # 若应用支持信号重载;不支持时可省略或改为重启
            kill -USR1 $(cat /var/run/myapp.pid 2>
        /dev/null) 2>
    /dev/null || true
        endscript
    }
        
    
  • 测试与生效
    • 手动测试:sudo logrotate -vf /etc/logrotate.d/myapp
    • 通常每日由 cron 自动执行(查看 /etc/cron.daily/logrotate)。
  • 要点
    • 为运行用户设置合适的 文件权限(如 myapp:myapp)。
    • 若应用不支持信号重载,可在 postrotate 中执行服务重启或使用 copytruncate(有丢日志风险,谨慎使用)。 以上为 logrotate 的标准用法与注意事项。

四 systemd 服务日志与本地检索

  • 将 Java 应用托管为 systemd 服务(示例 /etc/systemd/system/myapp.service):
    [Unit]
    Description=My Java App
    After=network.target
    
    [Service]
    Type=simple
    User=myapp
    ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
    StandardOutput=journal
    StandardError=journal
    SuccessExitStatus=143
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
  • 常用检索
    • 实时查看:sudo journalctl -u myapp.service -f
    • 按时间:sudo journalctl -u myapp.service --since "2025-12-01 10:00:00" -u myapp.service --until "2025-12-01 12:00:00"
    • 按级别:sudo journalctl -u myapp.service -p err -b
  • 建议为服务设置 CPU/内存/重启 策略,避免异常退出影响可用性。 以上命令覆盖 journalctl 对 systemd 服务的常用检索场景。

五 集中化日志平台与可视化

  • 方案选型
    • ELK Stack(Elasticsearch + Logstash + Kibana):采集、存储、检索与可视化一体化。
    • Graylog:开箱即用的集中式日志平台,部署与运维相对简单。
  • 快速落地 ELK(示例)
    • 安装组件:sudo apt update & & sudo apt install elasticsearch logstash kibana
    • Logstash 采集文件示例(/etc/logstash/conf.d/java-log.conf)
      input {
      
        file {
          
          path =>
           "/var/log/myapp/*.log"
          start_position =>
           "beginning"
          sincedb_path =>
           "/var/lib/logstash/sincedb-myapp"
          codec =>
       "json_lines"   # 若应用输出 JSON;否则用 plain 并配合 grok
        }
      
      }
      
      filter {
      
        # 如非 JSON,可用 grok 解析;示例模式可按需调整
        # grok {
           match =>
       {
           "message" =>
       "%{
      COMBINEDAPACHELOG}
      " }
       }
      
        # date {
           match =>
       [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ] }
      
      }
      
      output {
      
        elasticsearch {
          
          hosts =>
           ["localhost:9200"]
          index =>
       "myapp-%{
      +YYYY.MM.dd}
      "
        }
      
        stdout {
           codec =>
       rubydebug }
      
      }
          
      
    • 启动服务:sudo systemctl start elasticsearch logstash kibana
    • Kibana 访问 http://localhost:5601 创建索引模式并可视化。
  • 适用场景
    • 多实例、多主机统一检索与告警。
    • 长期留存、报表与指标分析。 以上为 ELK 在 Ubuntu 上的基本部署与采集示例。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Ubuntu中Java日志管理怎么做
本文地址: https://pptw.com/jishu/761741.html
ubuntu ssh如何进行远程文件传输 Java在Ubuntu上如何使用Maven

游客 回复需填写必要信息