#!/bin/bash # 日志问题修复脚本 # 用于诊断和修复Docker容器中的日志问题 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查日志目录权限 check_log_directories() { log_info "检查日志目录权限..." local directories=("/app/logs" "/home/ruoyi/logs") for dir in "${directories[@]}"; do if [[ -d "$dir" ]]; then local owner=$(stat -c '%U:%G' "$dir" 2>/dev/null || stat -f '%Su:%Sg' "$dir" 2>/dev/null) local perms=$(stat -c '%a' "$dir" 2>/dev/null || stat -f '%A' "$dir" 2>/dev/null) log_info "目录 $dir - 所有者: $owner, 权限: $perms" # 检查是否可写 if [[ -w "$dir" ]]; then log_success "✓ $dir 可写" else log_error "✗ $dir 不可写" fi else log_warn "目录不存在: $dir" fi done } # 检查符号链接 check_symlinks() { log_info "检查符号链接..." if [[ -L "/home/ruoyi/logs" ]]; then local target=$(readlink "/home/ruoyi/logs") log_info "符号链接: /home/ruoyi/logs -> $target" if [[ -d "$target" ]]; then log_success "✓ 符号链接目标存在" else log_error "✗ 符号链接目标不存在: $target" fi else log_warn "符号链接不存在: /home/ruoyi/logs" fi } # 检查logback配置 check_logback_config() { log_info "检查logback配置..." local config_files=( "/app/config/logback-spring.xml" "BOOT-INF/classes/logback.xml" ) for config in "${config_files[@]}"; do if [[ -f "$config" ]]; then log_info "找到配置文件: $config" # 检查日志路径配置 if grep -q "/home/ruoyi/logs" "$config"; then log_warn "配置文件使用硬编码路径: /home/ruoyi/logs" fi if grep -q "\${LOG_PATH" "$config"; then log_success "✓ 配置文件使用变量路径: \${LOG_PATH}" fi fi done } # 检查环境变量 check_environment_variables() { log_info "检查环境变量..." local env_vars=("LOG_PATH" "LOG_LEVEL" "SPRING_PROFILES_ACTIVE") for var in "${env_vars[@]}"; do if [[ -n "${!var}" ]]; then log_success "✓ $var=${!var}" else log_warn "环境变量未设置: $var" fi done } # 创建测试日志文件 test_log_writing() { log_info "测试日志文件写入..." local test_dirs=("/app/logs" "/home/ruoyi/logs") for dir in "${test_dirs[@]}"; do if [[ -d "$dir" ]]; then local test_file="$dir/test-write.log" if echo "Test log entry $(date)" > "$test_file" 2>/dev/null; then log_success "✓ 可以写入 $dir" rm -f "$test_file" else log_error "✗ 无法写入 $dir" fi fi done } # 修复日志目录权限 fix_log_permissions() { log_info "修复日志目录权限..." # 确保目录存在 mkdir -p /app/logs # 创建符号链接(如果不存在) if [[ ! -L "/home/ruoyi/logs" ]]; then mkdir -p /home/ruoyi ln -sf /app/logs /home/ruoyi/logs log_success "创建符号链接: /home/ruoyi/logs -> /app/logs" fi # 设置正确的权限 chmod 755 /app/logs # 如果运行在容器中,设置正确的所有者 if [[ -n "$USER" && "$USER" != "root" ]]; then chown -R "$USER:$USER" /app/logs /home/ruoyi 2>/dev/null || true fi log_success "日志目录权限修复完成" } # 显示日志配置建议 show_recommendations() { log_info "日志配置建议:" echo "----------------------------------------" echo "1. 确保使用 logback-spring.xml 而不是 logback.xml" echo "2. 在启动参数中设置: -Dlogging.config=/app/config/logback-spring.xml" echo "3. 设置环境变量: LOG_PATH=/app/logs" echo "4. 使用符号链接兼容旧路径: /home/ruoyi/logs -> /app/logs" echo "5. 确保日志目录权限正确: 755" echo "----------------------------------------" } # 主函数 main() { local action=${1:-"check"} log_info "日志问题诊断和修复工具" echo "========================================" case $action in "check") check_log_directories echo "" check_symlinks echo "" check_logback_config echo "" check_environment_variables echo "" test_log_writing echo "" show_recommendations ;; "fix") fix_log_permissions echo "" check_log_directories echo "" test_log_writing ;; *) echo "用法: $0 [check|fix]" echo " check - 检查日志配置和权限" echo " fix - 修复日志目录权限问题" exit 1 ;; esac echo "========================================" log_success "操作完成!" } # 如果脚本被直接执行 if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then main "$@" fi