diff --git a/lib/inc/sai_redis.h b/lib/inc/sai_redis.h index 8099c3ab3f..a298e3da55 100644 --- a/lib/inc/sai_redis.h +++ b/lib/inc/sai_redis.h @@ -50,6 +50,8 @@ extern void clear_local_state(); extern void setRecording(bool record); extern sai_status_t setRecordingOutputDir( _In_ const sai_attribute_t &attr); +extern sai_status_t setRecordingOutputFile( + _In_ const sai_attribute_t &attr); extern void recordLine(std::string s); extern std::string joinFieldValues( _In_ const std::vector &values); diff --git a/lib/inc/sairedis.h b/lib/inc/sairedis.h index a971a3e61d..3cafa4baf5 100644 --- a/lib/inc/sairedis.h +++ b/lib/inc/sairedis.h @@ -123,6 +123,18 @@ typedef enum _sai_redis_switch_attr_t */ SAI_REDIS_SWITCH_ATTR_SYNC_MODE, + /** + * @brief Recording log filename. + * + * Default valus is sairedis.rec + * + * @type sai_s8_list_t + * @flags CREATE_AND_SET + * @default sairedis.rec + */ + SAI_REDIS_SWITCH_ATTR_RECORDING_FILENAME, + + } sai_redis_switch_attr_t; /* diff --git a/lib/src/sai_redis_record.cpp b/lib/src/sai_redis_record.cpp index 45b525ce07..5a8efaa01c 100644 --- a/lib/src/sai_redis_record.cpp +++ b/lib/src/sai_redis_record.cpp @@ -3,6 +3,7 @@ #include std::string logOutputDir = "."; +std::string logOutputFile = "sairedis.rec"; std::string getTimestamp() { @@ -80,7 +81,7 @@ void startRecording() { SWSS_LOG_ENTER(); - recfile = logOutputDir + "/sairedis.rec"; + recfile = logOutputDir + "/" + logOutputFile ; recording.open(recfile, std::ofstream::out | std::ofstream::app); @@ -187,3 +188,46 @@ sai_status_t setRecordingOutputDir( return SAI_STATUS_SUCCESS; } + +sai_status_t setRecordingOutputFile( + _In_ const sai_attribute_t &attr) +{ + SWSS_LOG_ENTER(); + + if (attr.value.s8list.count == 0) + { + SWSS_LOG_NOTICE("setting recording filename to default filename: %s", logOutputFile.c_str()); + + return true; + } + + if (attr.value.s8list.list == NULL) + { + SWSS_LOG_ERROR("list pointer is NULL"); + + return false; + } + + size_t len = strnlen((const char *)attr.value.s8list.list, attr.value.s8list.count); + + if (len != (size_t)attr.value.s8list.count) + { + SWSS_LOG_ERROR("count (%u) is different than strnlen (%zu)", attr.value.s8list.count, len); + + return false; + } + + std::string filename((const char*)attr.value.s8list.list, len); + + /// Stop the recording with old file before updating the filename + stopRecording(); + + logOutputFile = filename; + + SWSS_LOG_NOTICE("setting recording filename : %s", logOutputFile.c_str()); + + /// Start recording with new file + startRecording(); + return SAI_STATUS_SUCCESS; + +} \ No newline at end of file diff --git a/lib/src/sai_redis_switch.cpp b/lib/src/sai_redis_switch.cpp index e1e8f8b15e..bf99cfafef 100644 --- a/lib/src/sai_redis_switch.cpp +++ b/lib/src/sai_redis_switch.cpp @@ -297,6 +297,8 @@ sai_status_t redis_set_switch_attribute( case SAI_REDIS_SWITCH_ATTR_RECORDING_OUTPUT_DIR: return setRecordingOutputDir(*attr); + case SAI_REDIS_SWITCH_ATTR_RECORDING_FILENAME: + return setRecordingOutputFile(*attr); default: break; }