一、選擇日志框架
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(強制立即執行)。