// SPDX-FileCopyrightText: 2025 The Project Pterodactyl Developers // // SPDX-License-Identifier: MPL-2.0 import Foundation import Logging struct FileLogHandler: LogHandler { private let label: String private let fileHandle: FileHandle var logLevel: Logger.Level = .info var metadata: Logger.Metadata = [:] init(label: String, fileURL: URL) { self.label = label // Ensure file exists if !FileManager.default.fileExists(atPath: fileURL.path) { FileManager.default.createFile(atPath: fileURL.path, contents: nil) } // Open file for updating (read/write) self.fileHandle = try! FileHandle(forUpdating: fileURL) self.fileHandle.seekToEndOfFile() } subscript(metadataKey key: String) -> Logger.Metadata.Value? { get { metadata[key] } set { metadata[key] = newValue } } func log( level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata?, source: String, file: String, function: String, line: UInt ) { var fullMetadata = self.metadata metadata?.forEach { fullMetadata[$0] = $1 } let line = "[\(level)] \(message)\n" if let data = line.data(using: .utf8) { fileHandle.write(data) } } } extension Logger { static let shared: Self = { let logFile = URL(fileURLWithPath: "/tmp/pterodactyl-language-server.log") LoggingSystem.bootstrap { label in FileLogHandler(label: label, fileURL: logFile) } var logger = Logger(label: "org.pterodactyl.language-server") logger.logLevel = .debug return logger }() }