2022-01-15 04:38:04
根本原因:当程序以系统服务运行时,默认工作目录或日志文件路径可能位于只读文件系统(如Linux的/根目录或Windows的系统保护目录),导致无法创建或写入日志文件。
解决方案1. 指定可写日志路径将日志文件路径改为系统允许写入的目录,例如:
代码示例:
logPath := "/var/log/my_service/run.log" // Linux示例// 或 logPath := `C:logsrun.log` // Windows示例logFile, err := os.OpenFile(logPath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)if err != nil { log.Fatalf("Failed to open log file: %v", err)}defer logFile.Close()log.SetOutput(logFile)2. 检查服务配置中的工作目录在service.Config中显式设置工作目录为可写路径:
svcConfig := &service.Config{ Name: "MyService", DisplayName: "My Go Service", Description: "A test service", WorkingDirectory: "/var/lib/my_service", // 确保此目录存在且可写}3. 处理文件系统权限创建专用目录并设置权限:sudo mkdir -p /var/log/my_servicesudo chown -R $USER:$USER /var/log/my_service
或以root用户运行服务(不推荐,存在安全隐患)。
避免使用./run.log,改为绝对路径(如/var/log/my_service/run.log),因为服务运行时相对路径可能解析到只读位置。
5. 调试技巧在服务启动时打印当前工作目录,确认路径是否符合预期:
dir, _ := os.Getwd()log.Printf("Current working directory: %s", dir)验证步骤通过以上调整,日志应能正常输出到指定文件。