Java使用java -jar启动并按日分包日志的最佳实践

 更新时间:2025年07月14日 09:54:44   作者:码农阿豪@新空间  
在生产环境中,Java应用程序通常以java -jar方式运行,而日志管理是运维的重要部分,如果日志文件过大,不仅影响性能,还会增加排查问题的难度,因此,按日分包日志成为常见的需求,本文将介绍4种实现方式,并提供详细配置和代码示例,需要的朋友可以参考下

1. 引言

在生产环境中,Java应用程序通常以java -jar方式运行,而日志管理是运维的重要部分。如果日志文件过大,不仅影响性能,还会增加排查问题的难度。因此,按日分包日志成为常见的需求。本文将介绍4种实现方式,并提供详细配置和代码示例。

2. 为什么需要日志分包?

  • 防止单个日志文件过大:日志文件过大会影响读写性能,甚至导致磁盘空间不足。
  • 便于日志归档和检索:按日期分割后,可以快速定位某一天的日志。
  • 符合日志管理规范:许多企业要求日志必须按天存储,并保留一定周期(如30天)。

3. 日志管理方案对比

方案适用场景优点缺点
LogbackSpring Boot项目原生支持,配置简单需依赖Logback
Log4j2高性能日志需求异步日志,性能好配置稍复杂
logrotateLinux服务器不依赖应用代码需额外安装
Shell+Cron简单应用无需修改代码不够可靠

4. 方案1:使用Logback实现日志按日分包

4.1 Logback简介

Logback是Log4j的改进版,Spring Boot默认使用它。它支持基于时间的滚动策略,非常适合日志分包。

4.2 配置logback.xml

src/main/resources/logback.xml中添加:

<configuration>
    <!-- 定义日志存储目录 -->
    <property name="LOG_DIR" value="logs" />
    
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 当前日志文件 -->
        <file>${LOG_DIR}/app.log</file>
        
        <!-- 滚动策略:按天分割 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 文件名格式 -->
            <fileNamePattern>${LOG_DIR}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 保留30天日志 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        
        <!-- 日志格式 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 设置日志级别 -->
    <root level="INFO">
        <appender-ref ref="ROLLING_FILE" />
    </root>
</configuration>

4.3 启动方式

直接运行:

java -jar your-app.jar

日志会自动按天存储:

logs/
├── app.log           # 当前日志
├── app.2023-10-01.log # 前一天的日志
└── app.2023-10-02.log # 更早的日志

5. 方案2:使用Log4j2实现日志按日分包

5.1 Log4j2简介

Log4j2是Log4j的升级版,支持异步日志,性能优于Logback。

5.2 配置log4j2.xml

src/main/resources/log4j2.xml中配置:

<Configuration>
    <Appenders>
        <!-- 按天滚动日志 -->
        <RollingFile name="RollingFile" 
                     fileName="logs/app.log"
                     filePattern="logs/app.%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <Pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n</Pattern>
            </PatternLayout>
            <Policies>
                <!-- 每天滚动一次 -->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
            <!-- 最多保留30天 -->
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>
    </Appenders>
    
    <Loggers>
        <Root level="info">
            <AppenderRef ref="RollingFile"/>
        </Root>
    </Loggers>
</Configuration>

5.3 启动方式

java -jar your-app.jar

日志存储结构:

logs/
├── app.log           # 当前日志
├── app.2023-10-01.log # 历史日志
└── app.2023-10-02.log

6. 方案3:使用Linux logrotate管理日志

6.1 logrotate简介

logrotate是Linux自带的日志管理工具,可定时压缩、删除旧日志。

6.2 配置logrotate规则

/etc/logrotate.d/myapp中添加:

/path/to/logs/app.log {
    daily              # 按天分割
    missingok          # 如果日志不存在,不报错
    rotate 30          # 保留30天
    compress           # 压缩旧日志
    delaycompress      # 延迟一天压缩
    notifempty         # 空日志不处理
    copytruncate       # 复制后清空原日志(避免重启应用)
}

6.3 启动方式

java -jar your-app.jar > /path/to/logs/app.log 2>&1 &

logrotate会每天自动分割日志:

/path/to/logs/
├── app.log       # 当前日志
├── app.log.1.gz  # 昨天的日志(压缩)
└── app.log.2.gz  # 前天的日志

7. 方案4:使用Shell脚本+Cron定时任务

7.1 Shell脚本实现日志分割

#!/bin/bash
LOG_DIR="/path/to/logs"
TODAY=$(date +%Y-%m-%d)

# 如果日志文件存在,则重命名
if [ -f "$LOG_DIR/app.log" ]; then
    mv "$LOG_DIR/app.log" "$LOG_DIR/app-$TODAY.log"
fi

# 重新启动应用(可选)
# kill现有进程并重启
pkill -f "java -jar your-app.jar"
nohup java -jar your-app.jar > "$LOG_DIR/app.log" 2>&1 &

7.2 结合Cron定时执行

# 每天0点执行
0 0 * * * /path/to/rotate_logs.sh

8. 方案对比与选择建议

方案适用场景推荐指数
LogbackSpring Boot项目⭐⭐⭐⭐⭐
Log4j2高性能需求⭐⭐⭐⭐
logrotateLinux服务器管理⭐⭐⭐
Shell+Cron简单临时方案⭐⭐

推荐选择:

  • Spring Boot项目 → Logback
  • 需要高性能日志 → Log4j2
  • 非Java管理(如纯Shell部署) → logrotate

9. 最佳实践与注意事项

  1. 日志目录权限:确保应用有写入权限。
  2. 磁盘空间监控:避免日志占满磁盘。
  3. 日志清理策略:建议保留30天,避免无限增长。
  4. 日志格式统一:方便后续分析(如ELK)。

10. 总结

本文介绍了4种java -jar启动的日志分包方案:

  1. Logback(推荐Spring Boot使用)
  2. Log4j2(适合高性能需求)
  3. logrotate(适合Linux运维)
  4. Shell+Cron(临时方案)

最佳选择取决于项目架构,但Logback/Log4j2是最可靠的方式。

以上就是Java使用java -jar启动并按日分包日志的最佳实践的详细内容,更多关于Java java -jar按日分包日志的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot进行参数校验的方法详解

    SpringBoot进行参数校验的方法详解

    在日常的接口开发中,为了防止非法参数对业务造成影响,经常需要对接口的参数进行校验。本文通过示例详细讲解了SpringBoot如何进行参数校验的,感兴趣的可以学习一下
    2022-04-04
  • SpringBoot 使用 Sa-Token 完成权限认证的操作方法

    SpringBoot 使用 Sa-Token 完成权限认证的操作方法

    Sa-Token是一款轻量级Java权限认证框架,适用于快速搭建权限系统,它提供了丰富的功能,下面给大家介绍SpringBoot 使用 Sa-Token 完成权限认证的相关操作,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • Java中实现用户之间的通讯方式

    Java中实现用户之间的通讯方式

    在Java中实现用户间通讯主要有两种方法:Socket编程和WebSocket,Socket编程允许两个设备间进行数据交换,适用于基本的网络通讯,本文提供了两种方法的基本实现代码和相关配置,帮助开发者根据需求选择合适的通讯方式
    2024-09-09
  • Java中的for循环结构及实例

    Java中的for循环结构及实例

    这篇文章主要介绍了Java中的for循环结构及实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程的三种方法详解

    这篇文章主要介绍了Mybatis 逆向工程的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 对Java的面对对象编程中对象和引用以及内部类的理解

    对Java的面对对象编程中对象和引用以及内部类的理解

    这篇文章主要介绍了对Java的面对对象编程中对象和引用以及内部类的理解,需要的朋友可以参考下
    2016-01-01
  • 浅谈线性表的原理及简单实现方法

    浅谈线性表的原理及简单实现方法

    下面小编就为大家带来一篇浅谈线性表的原理及简单实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java Maven Settings配置参考教程

    Java Maven Settings配置参考教程

    这篇文章主要介绍了Java Maven Settings配置参考,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Springboot编写CRUD时访问对应数据函数返回null的问题及解决方法

    Springboot编写CRUD时访问对应数据函数返回null的问题及解决方法

    我在学习springboot,其中在编写CRUD时发现访问数据的函数执行下去返回值是null但是其它部分正常,这篇文章主要介绍了Springboot在编写CRUD时,访问对应数据函数返回null,需要的朋友可以参考下
    2024-02-02
  • 将Java程序包打包为.exe文件的操作步骤

    将Java程序包打包为.exe文件的操作步骤

    将Java程序打包为为.exe文件分为俩个步骤:将Java程序打包成Jar包和打包为.exe文件,文中通过图文结合的方式给大家讲解的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-06-06

最新评论