回滚文件配置:
log4j.appender.RootFileAppender=org.apache.log4j.RollingFileAppender
log4j.appender.RootFileAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.RootFileAppender.layout.ConversionPattern=%d{} %t %p %c %m%n
log4j.appender.RootFileAppender.fileName=foo.log
log4j.appender.RootFileAppender.maxFileSize=11343143
log4j.appender.RootFileAppender.maxBackupIndex=2
核心代码:
假设日志文件为foo.log, 当文件长度达到maxFileSize,将要"回滚"。要么将foo.log清空,从而可以继续写入日志;要么备份foo.log文件,换成其他文件名,然后创建一个新的foo.log继续写入文件,这个机制是由maxBackupIndex来控制的:
若maxBackupIndex=2,则:
- foo.log第一次回滚,则将foo.log命名成foo.log.1来进行备份,然后创建新的foo.log,继续写入日志
- foo.log第二次回滚,将foo.log.1命名成foo.log.2,将foo.log命名成foo.log.1,然后创建新的foo.log,继续写入日志
- foo.log第三次回滚,由于备份的文件个数已经达到了maxBackupIndex(这个值为2),因此会删除foo.log.2,然后,将foo.log.1命名成foo.log.2,将foo.log命名成foo.log.1,然后创建新的foo.log,继续写入日志
- 以后的操作步骤都和第3步骤一致
从log4cpp中抓取出来的代码便是说明了上面4个步骤。里面用std::ostringstream配合std::string相当的漂亮(测试的时候源代码稍微改了一下,支持unicode)!