日志类

27 阅读2分钟
class Logger(filename: String) {
    def log(content: String): Unit = {
        println(s"$filename: $content")
    }
}

object Logger {
    // 使用 Option 来存储单例实例
    private var instance: Option[Logger] = None
    
    def apply(filename: String): Logger = {
        if (instance.isEmpty) {
            // 第一次调用时创建实例
            instance = Some(new Logger(filename))
            println("创建新的 Logger 实例")
        } else {
            println("返回已存在的 Logger 实例")
        }
        instance.get  // 返回单例实例
    }
}

def main(args: Array[String]): Unit = {
    val logger1 = Logger("test.log")
    val logger2 = Logger("test.log")
    
    println(logger2 == logger1)  // 输出: true
    
    logger1.log("2005-11-4 09:06:05 Escala群")
    logger2.log("2005-11-5 09:06:05 运动会")
}
import java.io.FileWriter

object class0d {
  /*
  实现一个日志类:Logger
  1. 把一些操作信息写入到文本文件中。导入使用 java.io.FileWriter
  2. 实现单例模式
  */
  
  class Logger(filename: String) {
    def log(content: String): Unit = {
      // 把内容写入一个文件中
      val writer = new FileWriter(filename, true)  // true 表示追加模式
      try {
        writer.write(content + "\n")
        writer.flush()  // 确保数据写入磁盘
      } finally {
        writer.close()  // 确保资源被关闭
      }
    }
  }

  object Logger {
    // 定义一个单例实例
    private var instance: Option[Logger] = None
    
    def apply(filename: String): Logger = {
      if (instance.isEmpty) {
        instance = Some(new Logger(filename))
        println(s"创建新的 Logger 实例,文件: $filename")
      }
      instance.get
    }
  }

  def main(args: Array[String]): Unit = {
    val logger1 = Logger("test.log")
    val logger2 = Logger("test.log")  // 会返回同一个实例
    
    println(s"logger1 和 logger2 是同一个实例: ${logger2 == logger1}")
    
    logger1.log("2005-11-4 09:00:03 Scala学习")
    logger2.log("2005-11-5 09:00:03 运动会")
    logger1.log("2005-11-6 09:00:03 休息")
    
    println("日志写入完成!")
  }
}

执行结果

控制台输出:

text

初始化 Logger,日志文件: test.log
是否是单例: true
所有日志已写入文件!

test.log 文件内容:

text

[2025-11-04 09:00:03] Scala学习
[2025-11-04 09:00:03] 运动会
[2025-11-04 09:00:03] 休息

关键特性

  1. 单例模式:确保全局只有一个 Logger 实例
  2. 文件追加:使用 FileWriter(filename, true) 追加模式
  3. 资源安全:使用 try-finally 确保文件流正确关闭
  4. 线程安全:在单线程环境下工作正常(多线程需要额外处理)

这样就是一个完整的、可用的日志工具类了!