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] 休息
关键特性
- 单例模式:确保全局只有一个 Logger 实例
- 文件追加:使用
FileWriter(filename, true)追加模式 - 资源安全:使用 try-finally 确保文件流正确关闭
- 线程安全:在单线程环境下工作正常(多线程需要额外处理)
这样就是一个完整的、可用的日志工具类了!