面试题答案
一键面试设计思路
- 确定日志轮转策略:比如按时间(每天、每周等)或者按文件大小进行轮转。
- 实现归档功能:将旧的日志文件进行压缩或者移动到指定的归档目录。
- 考虑多线程安全:确保在多线程环境下日志操作的正确性。
主要类
- Logger类:
- 负责日志记录,提供不同级别的日志记录方法(如debug、info、warn、error)。
- 维护当前日志文件的写入流。
- LogRotator类:
- 负责检测是否需要进行日志轮转,根据设定的策略判断。
- 执行日志文件的轮转操作,比如关闭当前文件流,重命名旧文件,创建新文件。
- LogArchiver类:
- 负责将轮转后的旧日志文件进行归档处理,比如压缩成zip文件并移动到归档目录。
主要方法
- Logger类方法:
void debug(String message)
:记录调试级别的日志。void info(String message)
:记录信息级别的日志。void warn(String message)
:记录警告级别的日志。void error(String message)
:记录错误级别的日志。void init()
:初始化日志文件和写入流。void close()
:关闭日志文件写入流。
- LogRotator类方法:
boolean shouldRotate()
:判断是否应该进行日志轮转。void rotate()
:执行日志轮转操作。
- LogArchiver类方法:
void archive(String oldLogFilePath)
:将指定的旧日志文件进行归档。
文件操作逻辑
- 日志写入:
- Logger类在初始化时创建或打开当前日志文件,并获取文件写入流。
- 各个日志记录方法通过写入流将日志信息写入文件。
- 日志轮转:
- LogRotator类定期(可以通过定时任务)调用
shouldRotate
方法,根据时间或文件大小判断是否需要轮转。 - 当需要轮转时,调用
rotate
方法,关闭Logger类中的当前写入流,将当前日志文件重命名(例如加上时间戳)。 - 创建新的日志文件并重新初始化Logger类中的写入流。
- LogRotator类定期(可以通过定时任务)调用
- 日志归档:
- LogArchiver类在日志轮转后,获取轮转后的旧日志文件路径,调用
archive
方法。 - 在
archive
方法中,将旧日志文件压缩(如使用ZipOutputStream
),并移动到指定的归档目录。
- LogArchiver类在日志轮转后,获取轮转后的旧日志文件路径,调用