optionally count repeating wxLog messages instead of logging all (patch 1520815)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40294 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -87,6 +87,7 @@ All:
|
|||||||
- Fixed wxDb::Open(wxDbConnectInf) when using connection string (Hellwolf Misty)
|
- Fixed wxDb::Open(wxDbConnectInf) when using connection string (Hellwolf Misty)
|
||||||
- Fixed crash in wxDb::Open() in Unicode build (Massimiliano Marretta)
|
- Fixed crash in wxDb::Open() in Unicode build (Massimiliano Marretta)
|
||||||
- Fixed wxTimeSpan::Format() for negative time spans
|
- Fixed wxTimeSpan::Format() for negative time spans
|
||||||
|
- Optionally count repeating wxLog messages instead of logging all (Lauri Nurmi)
|
||||||
|
|
||||||
All (GUI):
|
All (GUI):
|
||||||
|
|
||||||
|
@@ -155,7 +155,9 @@ window on the corresponding error message. If you wish to enable it, please use
|
|||||||
\helpref{SetTimestamp}{wxlogsettimestamp}\\
|
\helpref{SetTimestamp}{wxlogsettimestamp}\\
|
||||||
\helpref{GetTimestamp}{wxloggettimestamp}\\
|
\helpref{GetTimestamp}{wxloggettimestamp}\\
|
||||||
\helpref{SetTraceMask}{wxlogsettracemask}\\
|
\helpref{SetTraceMask}{wxlogsettracemask}\\
|
||||||
\helpref{GetTraceMask}{wxloggettracemask}
|
\helpref{GetTraceMask}{wxloggettracemask}\\
|
||||||
|
\helpref{SetRepetitionCounting}{wxlogsetrepetitioncounting}\\
|
||||||
|
\helpref{GetRepetitionCounting}{wxloggetrepetitioncounting}
|
||||||
|
|
||||||
%%%%% MEMBERS HERE %%%%%
|
%%%%% MEMBERS HERE %%%%%
|
||||||
\helponly{\insertatlevel{2}{
|
\helponly{\insertatlevel{2}{
|
||||||
@@ -322,6 +324,21 @@ and not sent to the active log target.
|
|||||||
|
|
||||||
Returns the current log level limit.
|
Returns the current log level limit.
|
||||||
|
|
||||||
|
\membersection{wxLog::SetRepetitionCounting}\label{wxlogsetrepetitioncounting}
|
||||||
|
|
||||||
|
\func{static void}{SetRepetitionCounting}{\param{bool }{ repetCounting = true}}
|
||||||
|
|
||||||
|
Enables logging mode in which a log message is logged once, and in case exactly
|
||||||
|
the same message successively repeats one or more times, only the number of
|
||||||
|
repetitions is logged.
|
||||||
|
|
||||||
|
\membersection{wxLog::GetRepetitionCounting}\label{wxloggetrepetitioncounting}
|
||||||
|
|
||||||
|
\func{static bool}{GetRepetitionCounting}{\void}
|
||||||
|
|
||||||
|
Returns whether the repetition counting mode is enabled.
|
||||||
|
|
||||||
|
|
||||||
\membersection{wxLog::SetTimestamp}\label{wxlogsettimestamp}
|
\membersection{wxLog::SetTimestamp}\label{wxlogsettimestamp}
|
||||||
|
|
||||||
\func{void}{SetTimestamp}{\param{const char * }{ format}}
|
\func{void}{SetTimestamp}{\param{const char * }{ format}}
|
||||||
|
@@ -139,15 +139,7 @@ public:
|
|||||||
|
|
||||||
// static sink function - see DoLog() for function to overload in the
|
// static sink function - see DoLog() for function to overload in the
|
||||||
// derived classes
|
// derived classes
|
||||||
static void OnLog(wxLogLevel level, const wxChar *szString, time_t t)
|
static void OnLog(wxLogLevel level, const wxChar *szString, time_t t);
|
||||||
{
|
|
||||||
if ( IsEnabled() && ms_logLevel >= level )
|
|
||||||
{
|
|
||||||
wxLog *pLogger = GetActiveTarget();
|
|
||||||
if ( pLogger )
|
|
||||||
pLogger->DoLog(level, szString, t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// message buffering
|
// message buffering
|
||||||
|
|
||||||
@@ -195,6 +187,14 @@ public:
|
|||||||
// current is NULL?
|
// current is NULL?
|
||||||
static void DontCreateOnDemand();
|
static void DontCreateOnDemand();
|
||||||
|
|
||||||
|
// log the count of repeating messages instead of logging the messages
|
||||||
|
// multiple times
|
||||||
|
static void SetRepetitionCounting(bool bRepetCounting = true)
|
||||||
|
{ ms_bRepetCounting = bRepetCounting; }
|
||||||
|
|
||||||
|
// gets duplicate counting status
|
||||||
|
static bool GetRepetitionCounting() { return ms_bRepetCounting; }
|
||||||
|
|
||||||
// trace mask (see wxTraceXXX constants for details)
|
// trace mask (see wxTraceXXX constants for details)
|
||||||
static void SetTraceMask(wxTraceMask ulMask) { ms_ulTraceMask = ulMask; }
|
static void SetTraceMask(wxTraceMask ulMask) { ms_ulTraceMask = ulMask; }
|
||||||
|
|
||||||
@@ -242,7 +242,7 @@ public:
|
|||||||
static void TimeStamp(wxString *str);
|
static void TimeStamp(wxString *str);
|
||||||
|
|
||||||
// make dtor virtual for all derived classes
|
// make dtor virtual for all derived classes
|
||||||
virtual ~wxLog() { }
|
virtual ~wxLog();
|
||||||
|
|
||||||
|
|
||||||
// this method exists for backwards compatibility only, don't use
|
// this method exists for backwards compatibility only, don't use
|
||||||
@@ -259,10 +259,23 @@ protected:
|
|||||||
// you override DoLog() you might not need it at all
|
// you override DoLog() you might not need it at all
|
||||||
virtual void DoLogString(const wxChar *szString, time_t t);
|
virtual void DoLogString(const wxChar *szString, time_t t);
|
||||||
|
|
||||||
|
// log a line containing the number of times the previous message was
|
||||||
|
// repeated
|
||||||
|
// returns: the number
|
||||||
|
static unsigned DoLogNumberOfRepeats();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// static variables
|
// static variables
|
||||||
// ----------------
|
// ----------------
|
||||||
|
|
||||||
|
// traditional behaviour or counting repetitions
|
||||||
|
static bool ms_bRepetCounting;
|
||||||
|
static wxString ms_prevString; // previous message that was logged
|
||||||
|
// how many times the previous message was logged
|
||||||
|
static unsigned ms_prevCounter;
|
||||||
|
static time_t ms_prevTimeStamp;// timestamp of the previous message
|
||||||
|
static wxLogLevel ms_prevLevel; // level of the previous message
|
||||||
|
|
||||||
static wxLog *ms_pLogger; // currently active log sink
|
static wxLog *ms_pLogger; // currently active log sink
|
||||||
static bool ms_doLog; // false => all logging disabled
|
static bool ms_doLog; // false => all logging disabled
|
||||||
static bool ms_bAutoCreate; // create new log targets on demand?
|
static bool ms_bAutoCreate; // create new log targets on demand?
|
||||||
|
@@ -357,6 +357,62 @@ void WXDLLEXPORT wxLogSysError(long lErrCode, const wxChar *szFormat, ...)
|
|||||||
// wxLog class implementation
|
// wxLog class implementation
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
unsigned wxLog::DoLogNumberOfRepeats()
|
||||||
|
{
|
||||||
|
long retval = ms_prevCounter;
|
||||||
|
wxLog *pLogger = GetActiveTarget();
|
||||||
|
if ( pLogger && ms_prevCounter > 0 )
|
||||||
|
{
|
||||||
|
wxString msg;
|
||||||
|
msg.Printf(wxPLURAL("The previous message repeated once.",
|
||||||
|
"The previous message repeated %lu times.",
|
||||||
|
ms_prevCounter),
|
||||||
|
ms_prevCounter);
|
||||||
|
ms_prevCounter = 0;
|
||||||
|
ms_prevString.clear();
|
||||||
|
pLogger->DoLog(ms_prevLevel, msg.c_str(), ms_prevTimeStamp);
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxLog::~wxLog()
|
||||||
|
{
|
||||||
|
if ( ms_prevCounter > 0 )
|
||||||
|
{
|
||||||
|
// looks like the repeat count has not been logged yet,
|
||||||
|
// so let's do it now
|
||||||
|
wxLog::DoLogNumberOfRepeats();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* static */
|
||||||
|
void wxLog::OnLog(wxLogLevel level, const wxChar *szString, time_t t)
|
||||||
|
{
|
||||||
|
if ( IsEnabled() && ms_logLevel >= level )
|
||||||
|
{
|
||||||
|
wxLog *pLogger = GetActiveTarget();
|
||||||
|
if ( pLogger )
|
||||||
|
{
|
||||||
|
if ( GetRepetitionCounting() && ms_prevString == szString )
|
||||||
|
{
|
||||||
|
ms_prevCounter++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( GetRepetitionCounting() )
|
||||||
|
{
|
||||||
|
pLogger->DoLogNumberOfRepeats();
|
||||||
|
}
|
||||||
|
ms_prevString = szString;
|
||||||
|
ms_prevLevel = level;
|
||||||
|
ms_prevTimeStamp = t;
|
||||||
|
pLogger->DoLog(level, szString, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wxChar *wxLog::SetLogBuffer( wxChar *buf, size_t size)
|
wxChar *wxLog::SetLogBuffer( wxChar *buf, size_t size)
|
||||||
{
|
{
|
||||||
wxChar *oldbuf = s_szBuf;
|
wxChar *oldbuf = s_szBuf;
|
||||||
@@ -696,6 +752,12 @@ wxLogPassThrough::wxLogPassThrough()
|
|||||||
// static variables
|
// static variables
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
bool wxLog::ms_bRepetCounting = false;
|
||||||
|
wxString wxLog::ms_prevString;
|
||||||
|
size_t wxLog::ms_prevCounter = 0;
|
||||||
|
time_t wxLog::ms_prevTimeStamp= 0;
|
||||||
|
wxLogLevel wxLog::ms_prevLevel;
|
||||||
|
|
||||||
wxLog *wxLog::ms_pLogger = (wxLog *)NULL;
|
wxLog *wxLog::ms_pLogger = (wxLog *)NULL;
|
||||||
bool wxLog::ms_doLog = true;
|
bool wxLog::ms_doLog = true;
|
||||||
bool wxLog::ms_bAutoCreate = true;
|
bool wxLog::ms_bAutoCreate = true;
|
||||||
|
@@ -244,6 +244,12 @@ void wxLogGui::Flush()
|
|||||||
// do it right now to block any new calls to Flush() while we're here
|
// do it right now to block any new calls to Flush() while we're here
|
||||||
m_bHasMessages = false;
|
m_bHasMessages = false;
|
||||||
|
|
||||||
|
unsigned repeatCount = 0;
|
||||||
|
if ( wxLog::GetRepetitionCounting() )
|
||||||
|
{
|
||||||
|
repeatCount = wxLog::DoLogNumberOfRepeats();
|
||||||
|
}
|
||||||
|
|
||||||
wxString appName = wxTheApp->GetAppName();
|
wxString appName = wxTheApp->GetAppName();
|
||||||
if ( !appName.empty() )
|
if ( !appName.empty() )
|
||||||
appName[0u] = (wxChar)wxToupper(appName[0u]);
|
appName[0u] = (wxChar)wxToupper(appName[0u]);
|
||||||
@@ -281,6 +287,8 @@ void wxLogGui::Flush()
|
|||||||
{
|
{
|
||||||
#if wxUSE_LOG_DIALOG
|
#if wxUSE_LOG_DIALOG
|
||||||
|
|
||||||
|
if ( repeatCount > 0 )
|
||||||
|
m_aMessages[nMsgCount-1] += wxString::Format(wxT(" (%s)"), m_aMessages[nMsgCount-2].c_str());
|
||||||
wxLogDialog dlg(NULL,
|
wxLogDialog dlg(NULL,
|
||||||
m_aMessages, m_aSeverity, m_aTimes,
|
m_aMessages, m_aSeverity, m_aTimes,
|
||||||
title, style);
|
title, style);
|
||||||
|
Reference in New Issue
Block a user