Veritas NetBackup 并行流框架 SDK 开发人员指南
- 使用 NetBackup Parallel Streaming Framework保护工作负载
- NetBackup Parallel Streaming Framework插件体系结构
- 部署 NetBackup Parallel Streaming Framework SDK
- 插件开发准备
- 使用示例插件
- 开发工作负载插件
- 部署工作负载插件
- NetBackup Parallel Streaming Framework API 参考
- 日志记录和故障排除
启用插件的日志记录
本节包含以下主题:
NetBackup 在日志目录中记录有关各种 NetBackup 服务器和客户端进程的信息。NetBackup 管理员可以配置日志记录级别以确定要包括在日志中的详细信息。日志记录级别的范围为 0 至 5,其中更高的数字对应于更详细的日志。
BigData 策略操作的所有日志都写在以下位置的子目录中:
对于 Windows:
<install_path>\NetBackup\logs
对于 UNIX:
/usr/openv/netbackup/logs
注意:
日志文件夹必须已存在,以便写入日志。如果这些文件夹不存在,则必须手动进行创建。
有关日志和日志记录的更多信息,请参考以下信息:
下表列出了有关适用于 NetBackup 插件的日志的信息:
表:适用于 NetBackup 插件的日志
日志目录 | 日志消息相关内容 | 日志可用位置 |
---|---|---|
对于 Windows:
UNIX:
| 策略配置和验证 | 备份主机 |
对于 Windows:
UNIX:
| PSF 框架、搜索、前后进程和插件日志 | 备份主机 |
对于 Windows:
UNIX:
| 策略验证、备份和还原操作 | 介质服务器 |
对于 Windows:
UNIX:
| 备份进程 | 备份主机 |
对于 Windows:
UNIX:
| 还原进程 | 备份主机 |
NetBackup PSF SDK API 以与其他 NetBackup 进程一致的方式允许插件日志信息。该插件使用 aapi_session_def_t->sd_log 函数将消息记录在与 NetBackup 相同的文件中。例如,将整理搜索应用程序和插件的搜索会话的日志消息,并将其放在位于 <install_path>/NetBackup/logs/nbaapidiscv
目录的同一文件中。合并日志消息按顺序显示相关信息,并帮助您对插件问题进行故障排除。日志消息包含当多个进程同时运行时有用的时间戳和进程 ID。
不同的调试级别适用于日志文件,适用于插件开发人员的级别在 aapi_common.h 文件中加以定义。在 sd_log 方法的严重性参数中使用这些级别之一。确保使用正确的调试严重性级别,使日志对故障排除有意义。
以下列表显示日志级别及其描述:
日志级别值 | 描述 |
---|---|
AAPI_ESINFO | 指示信息 |
AAPI_ESWARN | 指示警告 |
AAPI_ESDEBUG | 指示调试 |
AAPI_ESERROR | 指示错误 |
AAPI_ESCRITICAL | 指示严重故障 |
即使您将日志记录级别设置为最小,也会记录严重故障、错误和警告。
有关日志记录级别的信息,请参考以下文章:
您可以启用该插件,以在现有的相关 NetBackup 日志中添加日志信息条目,以进行搜索、备份或还原操作。插件必须调用会话对象提供的 sd_log 方法,该方法标识特定于操作的日志记录方法。会话对象可用于初始 aapi_pgn_open_server API,插件使用该 API 与工作负载进行通信。
下面是一个示例,显示如何使用插件中的会话对象启用日志记录:
const aapi_session_def_t *g_session_definition; //holds the session object globally void setGlobalSessionDef(const aapi_session_def_t * sd) { g_session_definition = sd; } const aapi_session_def_t * getGlobalSessionDef() { return g_session_definition; } #define INFO getGlobalSessionDef(), AAPI_ESINFO, __FUNCTION__ #define WARNING getGlobalSessionDef(), AAPI_ESWARN, __FUNCTION__ #define DEBUG getGlobalSessionDef(), AAPI_ESDEBUG, __FUNCTION__ #define ERROR getGlobalSessionDef(), AAPI_ESERROR, __FUNCTION__ #define CRITICAL getGlobalSessionDef(), AAPI_ESCRITICAL, __FUNCTION__ #define SAMPLEPGN_LOG(x) LogMsg x; //open_server implementation gets the session object stored in the global session instance pgn_open_server (const aapi_session_def_t *session, const aapi_server_name_t aapi_server_name, const aapi_cred_t *credentials, aapi_pgn_server_handle_t *sh) { setGlobalSessionDef(session); SAMPLEPGN_LOG(DEBUG,"entering"); ... } //The wrapper log method is used to write to NetBackup logs. //This method can either directly use the global session object, or //accept the session instance as an input parameter for log writing void LogMsg (const aapi_session_def_v1_t *sd, aapi_severity_v1_t severity_level, char *function, char *fmt, ...) { //format the log message //log to NetBackup logs using session’s sd_log method sd->sd_log("PLUGIN_APPTYPE_VERSION", formatted_message, severity_level); }
有关日志记录代码的实施,请参考关于示例插件主题。
我们建议您为插件使用唯一且特定的字符串(理想情况下为插件类型和版本)作为 sd_log 调用中的第一个参数。此指定字符串以每条日志消息为前缀,以便更容易标识日志文件中的插件特定条目