📄 nlfileappender.h
字号:
/**
* 文件附加器类定义
* @file NLFileAppender.h
* @date 14-Jul-2005
* @author 胡春雨
* @version 1.0.0: 初始版本
*/
#ifndef _NL_FILE_APPENDER_H
#define _NL_FILE_APPENDER_H
#include "nlkit/NLAppender.h"
#include "nlkit/NLTime.h"
namespace nlkit
{
/**
* 文件附加器类
*/
class NLFileAppender : public NLAppender
{
public:
/**
* 构造函数
* @param filename: 文件名
* @param mode: 打开模式
* @param immediateFlush: 是否立即刷新,默认立即
* @param withAdorn: 是否带装饰语,默认带
* @return 无
*/
NLFileAppender(const std::string& filename,
const char* type = NLLOG_FILE_OPEN_MODE,
bool immediateFlush = true,
bool withAdorn = true);
/**
* 虚拟析构函数
* @param 无
* @return 无
*/
virtual ~NLFileAppender();
/**
* 关闭文件附加器
* @param 无
* @return 无
*/
virtual void close();
protected:
/**
* 文件附加器处理事件
* @param event: 事件
* @return 无
*/
virtual void append(const NLEvent& event);
/**
* 重新打开文件,并删除原文件
* @param filename: 文件名
* @param mode: 打开模式
* @return 无
*/
void reopen(const std::string& filename, const char* mode);
bool m_immediateFlush; /**< 是否立即刷新 */
bool m_withAdorn; /**< 是否带装饰语 */
FILE* m_out; /**< 文件输出流 */
std::string m_filename; /**< 文件名 */
private:
/**
* 初始化
* @param filename: 文件名
* @param mode: 打开模式
* @return 无
*/
void init(const std::string& filename, const char* mode);
NLFileAppender(const NLFileAppender&);
NLFileAppender& operator=(const NLFileAppender&);
};
/**
* 循环文件附加器类
*/
class NLRollingFileAppender : public NLFileAppender
{
public:
/**
* 构造函数
* @param filename: 文件名
* @param maxFileSize: 最大文件尺寸,默认10M
* @param maxBackupIndex: 最大备份索引值,默认10
* @param immediateFlush: 是否立即刷新,默认立即
* @param withAdorn: 是否带装饰语,默认带
* @return 无
*/
NLRollingFileAppender(const std::string& filename,
long long maxFileSize = NLLOG_MAX_FILE_SIZE, // 10 MB
int maxBackupIndex = NLLOG_MAX_INDEX,
bool immediateFlush = true,
bool withAdorn = true);
/**
* 虚拟析构函数
* @param 无
* @return 无
*/
virtual ~NLRollingFileAppender();
protected:
/**
* 循环文件附加器处理事件
* @param event: 事件
* @return 无
*/
virtual void append(const NLEvent& event);
/**
* 切换处理
* @param 无
* @return 无
*/
void rollover();
long long m_maxFileSize; /**< 最大的文件尺寸 */
int m_maxBackupIndex; /**< 最大备份索引值 */
private:
/**
* 初始化
* @param maxFileSize: 最大的文件尺寸
* @param maxBackupIndex: 最大备份索引值
* @return 无
*/
void init(long long maxFileSize, int maxBackupIndex);
};
/**
* 按时间切换循环文件附加器.
* 支持按天,周,月切换日志文件
*/
class NLDailyRollingFileAppender : public NLFileAppender
{
public:
/**
* 构造函数
* @param filename: 文件名
* @param schedule: 计划,默认按天
* @param immediateFlush: 是否立即刷新,默认立即
* @param maxBackupIndex: 最大备份索引值,默认10000
* @param withAdorn: 是否带装饰语,默认带
* @return 无
*/
NLDailyRollingFileAppender(const std::string& filename,
NLDailyRollingSchedule schedule = DAILY,
bool immediateFlush = true,
int maxBackupIndex = NLLOG_MAX_INDEX,
bool withAdorn = true);
/**
* 虚拟析构函数
* @param 无
* @return 无
*/
virtual ~NLDailyRollingFileAppender();
/**
* 关闭按时间切换循环文件附加器
* @param 无
* @return 无
*/
virtual void close();
protected:
/**
* 按时间切换循环文件附加器处理事件
* @param event: 事件
* @return 无
*/
virtual void append(const NLEvent& event);
/**
* 切换处理
* @param 无
* @return 无
*/
void rollover();
/**
* 取切换时的文件名
* @param t: 当前时间
* @return string: 文件名
*/
std::string getFilename(const NLTime& t) const;
/**
* 初始化
* @param schedule: 循环类型
* @return 无
*/
void init(NLDailyRollingSchedule schedule);
NLDailyRollingSchedule m_schedule; /**< 循环类型 */
std::string m_scheduledFilename; /**< 循环问文件名 */
NLTime m_nextRolloverTime; /**< 下一次切换时间 */
int m_maxBackupIndex; /**< 最大备份索引值 */
};
/**
* 并发进程文件附加器
*/
class NLParallelFileAppender : public NLDailyRollingFileAppender
{
public:
/**
* 构造函数
* @param filename: 文件名
* @param schedule: 计划,默认按天
* @param immediateFlush: 是否立即刷新,默认立即
* @param maxFileSize: 最大文件尺寸,默认10M
* @param maxBackupIndex: 最大备份索引值,默认10000
* @param withAdorn: 是否带装饰语,默认带
* @return 无
*/
NLParallelFileAppender(const std::string& filename,
NLDailyRollingSchedule schedule = DAILY,
bool immediateFlush = true,
long long maxFileSize = NLLOG_MAX_FILE_SIZE,
int maxBackupIndex = NLLOG_MAX_INDEX,
bool withAdorn = true);
/**
* 虚拟析构函数
* @param 无
* @return 无
*/
virtual ~NLParallelFileAppender();
/**
* 关闭并发进程文件附加器
* @param 无
* @return 无
*/
virtual void close();
protected:
/**
* 切换类型
*/
enum switchtype
{
TIME_SWITCH, /**< 时间造成切换 */
SIZE_SWITCH, /**< 文件大小造成切换 */
CLOSE_SWITCH /**< 关闭造成切换 */
};
/**
* 并发进程文件附加器处理事件
* @param event: 事件
* @return 无
*/
virtual void append(const NLEvent& event);
/**
* 切换处理
* @param type: 切换类型
* @return 无
*/
void rollover(switchtype type);
long long m_maxFileSize; /**< 最大文件尺寸,单位:字节 */
private:
/**
* 初始化
* @param 无
* @return 无
*/
void init();
/**
* 取当前的索引值
* @param 无
* @return int: 索引值
*/
int getCurIdx();
int m_curIdx; /**< 当前索引 */
};
}
#endif // !_NL_FILE_APPENDER_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -