一、选择日志框架
Java应用在Debian上的日志配置需先选择合适的日志框架,常见选项包括:
二、配置日志框架(以Logback为例)
pom.xml中添加logback-classic依赖(包含SLF4J API与Logback实现);若使用Gradle,在build.gradle中添加对应实现。<!-- Maven 示例 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
src/main/resources目录下创建logback.xml,配置日志级别、输出格式、输出目标(控制台/文件)。<configuration>
<!-- 控制台输出配置 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>["是", "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n", "%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>logs/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/app-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 保留30天日志 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 根日志级别设置为INFO,输出到控制台和文件 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
注:pattern为日志格式模板,%d表示时间、%-5level表示日志级别(左对齐占5位)、%logger{36}表示类名(最长36字符)、%msg表示日志消息。三、设置环境变量(可选,针对java.util.logging)
若使用java.util.logging(JDK内置日志框架),需通过JAVA_OPTS环境变量指定配置文件路径(默认路径为/usr/share/java/logging.properties或$JAVA_HOME/lib/logging.properties)。
# 临时设置(当前终端有效)
export JAVA_OPTS="-Djava.util.logging.config.file=/path/to/logging.properties"
# 永久设置(添加到~/.bashrc或/etc/profile)
echo 'export JAVA_OPTS="-Djava.util.logging.config.file=/path/to/logging.properties"' >> ~/.bashrc
source ~/.bashrc
四、启动Java应用并验证
使用配置好的环境变量启动Java应用(如Spring Boot jar包):
java $JAVA_OPTS -jar your-application.jar
启动后,检查控制台输出或logs/app.log文件,确认日志是否按配置的格式(如时间、级别、类名)输出。
五、日志管理与归档
tail -f logs/app.log实时查看日志,grep "ERROR" logs/app.log过滤错误日志,less logs/app.log分页查看历史日志。sudo apt-get install logrotate(Debian自带);/etc/logrotate.d/java文件,添加以下规则(按天归档、保留30天、压缩旧日志):/path/to/java/logs/*.log {
daily
rotate 30
missingok
notifempty
compress
dateext
sharedscripts
postrotate
/bin/kill -USR1 `cat /path/to/java/logs/pid` 2>/dev/null || true
endscript
}
logrotate -v -d /etc/logrotate.d/java(模拟执行),logrotate -f /etc/logrotate.d/java(强制立即执行)。