首先,是看了很多大牛的笔记,然后我还是没懂,看着一天就快完了,先总结下。
1. 说下我对Log文件的理解。简单点,大概就是记录一些错误信息,可以保存到文件或者直接窗口上显示,或者在调试的时候打印出一些变量的值啊什么的,方便参考。
2. 先说常用的几个函数,注意是函数(functions),不是类:
wxLogFatalError和wxLogError类似,不过它显示错误信息外,还调用系统abor
t函数返回错误代码3,结束这个程序运行。这个函数显示的消息没办法用
设置空什么的来屏蔽。
wxLogWarnning: 跟 wxLogError差不多,不过一个是显示警告信息,一个是错误信息;
wxLogMessage: 可以用来显示一些变量的值啊,或者提示信息之类;
wxLogVerbose: 用来显示那些信息很多很冗长的消息;
wxLogDebug 用来显示调试版本中的调试信息,必须先定义了 __WXDEBUG__宏才有效,发布版本一般应该没吧。
wxLogTrace 和wxLogDebug很像,不过嘛,他可以通过设置掩码过滤一些信息,比如:
void wxWindowBase::CaptureMouse()
{
wxLogTrance(wxT("mousecapture"),wxT((Capturemouse(%p),this));
...
}
bool MyApp::OnInit()
{
//Add mousecapture to the list of trace mask
wxLog::AddTraceMask(wxT("mousecapture"));
...
}
3. wxLog 的派生类,注意是类(class) ,不是函数;
wxLogStderr : 把所有信息输出到 FILE* 作为参数的文件中去,如果FILE* 为NULL,就输出到标准错误stderr
wxLogStream:和上面的很相似,但是使用的是C++ 的ostream和cerr流来代替了上面的C操作。
wxLogGui : 一点也没搞明白,不说了。
wxLogWindow: 提供一个跟踪窗口之类的东西,这个窗口将显示所有的输出信息,同时这些信息也将显示在之前的
log目标上,这个跟踪终端窗口提供了清除信息,关闭窗口以及把所有信息保存到文件中的功能,手动。
wxLogNull: 用来临时阻止某些错误信息的输出,比如你打开文件的时候将显示一个错误信息,有时你不希望显示这个错误
信息,可以在栈上建立一个wxLogNull的对象,在这个对象的作用域任何可以被屏蔽的错误信息全部去屎,不过出了
作用域有可以正常显示鸟。贴一点伪代码
wxFile file;//
if(XXX)
{
wxLogNull m_LogNo;
if( !file.Open("bar"))
...//出错,但是显示不了,处理了也一样
}
wxLogMessage("...");//OK,可以显示了,出了作用域正常工作。
不会用这个写代码的地方,太小了怎么写,谁告诉一下,一行差不多就能到10多个字母;
下面跟一段自己的测试代码,功能有限,只做了满足我的需求其他没实践额。
//wxiLog.h 头文件
#ifndef __M_LOG_H__
#define __M_LOG_H__
#include "wx/wx.h"
#include "wx/log.h"
#include "wx/stdpaths.h"
#include "wx/file.h"
#include "wx/filename.h"
class LogInfo
{
public:
/************************************************************************/
/*
LogInfo 构造函数构造一个日志信息对象,更加传入参数自动判断是那一类调试信息,
参数信息:
toFile : bool类型,为true信息将被保存到文件,为0将以window的形式显示信息,默认为true
info_flag : 调试信息类型参数必须是一个,条件 (info_flag >= -1)&&(info_flag <= 2),默认为-1
以2进制表示:
-1 表示打印wxLogMessage信息
0 表示打印wxLogWarnning信息
1 表示打印wxLogError信息
2 便是打印wxLogDebug信息,如果当toFile为false时,info_flag = 2 时但是toFile = false 参数无效
filename : 打印到到的文件名字,只有toFile为true方见效,如果toFile为false传递wxEmptyString,默认为log.txt
msg : 需要打印的信息内容;用户自定义传入
file_mode : 当toFile为true时起效,有r,w,a,w+,a+等,详见fopen()函数,默认为a+;
*/
/************************************************************************/
LogInfo( wxString msg,bool toFile = true,int info_flag = -1 ,wxString filename = wxT("log.txt"),char* file_mode = "a+");
~LogInfo();
/************************************************************************/
/*
LogPrintMsg()函数打印信息;每当创建一个LogPrintMsg时自动打印一条信息,若之后还需要打印信息
也可以直接调用该函数,打印方式除了参数设置之外,其他与上次创建对象的设置信息一样;
*/
/************************************************************************/
void ToFPrintMsg(int flag, wxString msg); //打印到文件,参数信息见构造函数
void ToWPrintMsg(int flag, wxString msg); //打印到窗口
private:
FILE* m_logFile;
// bool m_ctrl;
};
#endif
//wxiLog.cpp CPP文件
#include "wxiLog.h"
LogInfo::LogInfo(wxString msg, bool toFile, int info_flag, wxString fileName, char* file_mode)
:m_logFile(NULL)
{
wxString apppath;
wxStandardPathsBase& stpd = wxStandardPaths::Get();
wxFileName exeFile(stpd.GetExecutablePath());
apppath = exeFile.GetPath(wxPATH_GET_VOLUME|wxPATH_GET_SEPARATOR);
wxLog::SetTimestamp(wxT("%Y-%m-%d %H:%M:%S"));
wxLog::SetLogLevel(wxLOG_Debug);
if(toFile)
{
wxString file_path = apppath + fileName;
wxCharBuffer bf = file_path.ToUTF8();
const char* c_filepath = bf.data();
if((m_logFile = fopen(c_filepath, file_mode)) == NULL)
{
wxLogError(wxT("Open file failed!"));
}
ToFPrintMsg(info_flag, msg);
}
else
{
ToWPrintMsg(info_flag, msg);
}
}
LogInfo::~LogInfo()
{
if(m_logFile != NULL)
fclose(m_logFile);
}
void LogInfo::ToFPrintMsg(int flag, wxString msg)
{
delete wxLog::SetActiveTarget(new wxLogStderr(m_logFile));
if( flag == -1 ) //是-1表示Message信息
{
wxLogMessage(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else if( flag == 0)//是0表示Warnning信息
{
wxLogWarning(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else if( flag == 1)//是1表示Error信息
{
wxLogError(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else if( flag == 2)//是2表示Debug信息
{
wxLogDebug(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else
;
}
void LogInfo::ToWPrintMsg(int flag, wxString msg)
{
if( flag == -1 ) //是-1表示Message信息
{
wxLogMessage(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else if( flag == 0 )//是0表示Warnning信息
{
wxLogWarning(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else if( flag == 1)//是1表示Error信息
{
wxLogError(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else if( flag == 2)//是2表示Debug信息;该参数在toFile为false是无效的
{
;//wxLogDebug(wxString::Format(wxT("%s(%d):%s"),__TFILE__, __LINE__, msg));
}
else
;
}
5. 说下wxLog::SetActiveTarget();函数。
Note that you must put the new target on the heap when you call SetActiveTarget and you must delete the return value (which is the old target). Also, you must use wxLogMessage for release builds. Normally this sends the message to a messagbox, but since you changed the target it won't. You could also force messages to go to stderr by doing this:
delete wxLog::SetActiveTarget(new wxLogStderr(NULL));
类的使用:
#include "wxiLog.h"
bool MyApp::OnInit()
{
wxString s = wxT("Hello World");
wxiLogInfo log(s); //创建并打印了信息到文件
log.ToFPrintMsg(0,s);
//其实这里应该
log.ToWPrintMsg(0,s);//应该这个要实现,但是其实实现不了。也就是纠结的是如果我先输入文件,然后我第二次打算window输出,但是实现不了,怎么做呢,还要重新来?
}
还有一些不太清楚的地方:
1. SetActiveTarget(); 函数具体的作用是什么,谁能讲解下,还有就是调用的那些函数,是静态函数吗?比如wxLogError(...);什么的。