版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一、定义类
class FileLog : public rtc::LogSink {
public:
FileLog(const std::string& LogPath)
:logfile_(NULL),
log_path_(LogPath){}
virtual ~FileLog() {
if (logfile_) {
fclose(logfile_);
logfile_ = NULL;
}
}
inline void FileDate() {
QString timeString = QDateTime::currentDateTime().toString("yyyy-MM-dd_hhmmss");
logfileName_ = log_path_+"/webrtc_"+timeString.toStdString()+".log";
}
inline size_t Size()
{
size_t size = 0;
if (logfile_ != NULL) {
size = filelength(fileno(logfile_));
}
return size;
}
inline void Start(void)
{
#define MAX_LOG_FILE_SIZE (1024*1024)
if (NULL == logfile_) {
FileDate();
logfile_ = fopen(logfileName_.c_str(), "w");
}
else if (Size() > MAX_LOG_FILE_SIZE)
{
Close();
FileDate();
logfile_ = fopen(logfileName_.c_str(), "w");
}
}
inline void Close(void)
{
if(logfile_) {
fclose(logfile_);
logfile_ = NULL;
}
}
virtual void OnLogMessage(const std::string& message) {
rtc::CritScope lock(&log_crit_);
Start();
if (NULL == logfile_)
return;
QString timeString = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");
string msgString;
msgString = timeString.toStdString() + message;
if(fwrite(msgString.c_str(), 1, msgString.length(), logfile_) < 0) {
Close();
} else if(fflush(logfile_) < 0) {
Close();
}
}
private:
FILE* logfile_;
const std::string log_path_;
std::string logfileName_;
rtc::CriticalSection log_crit_;
};
二、调用类
rtc::LoggingSeverity min_sev = rtc::LS_ERROR;
switch (webrtc_log_level)
{
case 1 :
min_sev = rtc::LS_ERROR;
break;
case 2 :
min_sev = rtc::LS_WARNING;
break;
case 3 :
min_sev = rtc::LS_INFO;
break;
}
FileLog* _LogStream = new FileLog("logs");
rtc::LogMessage::AddLogToStream(_LogStream, min_sev);