]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/wx/log.h
Add test for absence of events from wxSpinCtrlDouble ctor.
[wxWidgets.git] / interface / wx / log.h
index df0ffcea372275dda2f235dc53e28e8247bb4b74..7dbed9bc561b2c939b3d90c371f1e5ca50082ca3 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
 // Name:        log.h
-// Purpose:     interface of wxLogWindow
+// Purpose:     interface of wxLog* classes
 // Author:      wxWidgets team
-// RCS-ID:      $Id$
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-/**
-    @class wxLogWindow
+#if wxUSE_BASE
 
-    This class represents a background log window: to be precise, it collects all
-    log messages in the log frame which it manages but also passes them on to the
-    log target which was active at the moment of its creation. This allows you, for
-    example, to show all the log messages in a frame but still continue to process
-    them normally by showing the standard log dialog.
+/**
+    Different standard log levels (you may also define your own) used with
+    by standard wxLog functions wxLogGeneric(), wxLogError(), wxLogWarning(), etc...
+*/
+enum wxLogLevelValues
+{
+    wxLOG_FatalError, //!< program can't continue, abort immediately
+    wxLOG_Error,      //!< a serious error, user must be informed about it
+    wxLOG_Warning,    //!< user is normally informed about it but may be ignored
+    wxLOG_Message,    //!< normal message (i.e. normal output of a non GUI app)
+    wxLOG_Status,     //!< informational: might go to the status line of GUI app
+    wxLOG_Info,       //!< informational message (a.k.a. 'Verbose')
+    wxLOG_Debug,      //!< never shown to the user, disabled in release mode
+    wxLOG_Trace,      //!< trace messages are also only enabled in debug mode
+    wxLOG_Progress,   //!< used for progress indicator (not yet)
+    wxLOG_User = 100, //!< user defined levels start here
+    wxLOG_Max = 10000
+};
 
-    @library{wxbase}
-    @category{logging}
+/**
+    The type used to specify a log level.
 
-    @see wxLogTextCtrl
+    Default values of ::wxLogLevel used by wxWidgets are contained in the
+    ::wxLogLevelValues enumeration.
 */
-class wxLogWindow : public wxLogInterposer
+typedef unsigned long wxLogLevel;
+
+/**
+    Information about a log record (unit of the log output).
+ */
+class wxLogRecordInfo
 {
 public:
-    /**
-        Creates the log frame window and starts collecting the messages in it.
+    /// The name of the file where this log message was generated.
+    const char *filename;
 
-        @param parent
-            The parent window for the log frame, may be @NULL
-        @param title
-            The title for the log frame
-        @param show
-            @true to show the frame initially (default), otherwise
-            Show() must be called later.
-        @param passToOld
-            @true to process the log messages normally in addition to
-            logging them in the log frame (default), @false to only log them in the
-            log frame.
-    */
-    wxLogWindow(wxFrame parent, const wxChar title, bool show = true,
-                bool passToOld = true);
+    /// The line number at which this log message was generated.
+    int line;
 
     /**
-        Returns the associated log frame window. This may be used to position or resize
-        it but use Show() to show or hide it.
-    */
-    wxFrame* GetFrame() const;
+        The name of the function where the log record was generated.
 
-    /**
-        Called if the user closes the window interactively, will not be
-        called if it is destroyed for another reason (such as when program
-        exits).
-        Return @true from here to allow the frame to close, @false to
-        prevent this from happening.
+        This field may be @NULL if the compiler doesn't support @c __FUNCTION__
+        (but most modern compilers do).
+     */
+    const char *func;
 
-        @see OnFrameDelete()
-    */
-    virtual bool OnFrameClose(wxFrame frame);
+    /// Time when the log message was generated.
+    time_t timestamp;
 
     /**
-        Called immediately after the log frame creation allowing for
-        any extra initializations.
-    */
-    virtual void OnFrameCreate(wxFrame frame);
+        Id of the thread in which the message was generated.
 
-    /**
-        Called right before the log frame is going to be deleted: will
-        always be called unlike OnFrameClose().
-    */
-    virtual void OnFrameDelete(wxFrame frame);
+        This field is only available if wxWidgets was built with threads
+        support (<code>wxUSE_THREADS == 1</code>).
 
-    /**
-        Shows or hides the frame.
-    */
-    void Show(bool show = true);
+        @see wxThread::GetCurrentId()
+     */
+    wxThreadIdType threadId;
 };
 
+/**
+    @class wxLogFormatter
 
+    wxLogFormatter class is used to format the log messages. It implements the
+    default formatting and can be derived from to create custom formatters.
 
-/**
-    @class wxLogInterposerTemp
+    The default implementation formats the message into a string containing
+    the time stamp, level-dependent prefix and the message itself.
+
+    To change it, you can derive from it and override its Format() method. For
+    example, to include the thread id in the log messages you can use
+    @code
+        class LogFormatterWithThread : public wxLogFormatter
+        {
+            virtual wxString Format(wxLogLevel level,
+                                    const wxString& msg,
+                                    const wxLogRecordInfo& info) const
+            {
+                return wxString::Format("[%d] %s(%d) : %s",
+                    info.threadId, info.filename, info.line, msg);
+            }
+        };
+    @endcode
+    And then associate it with wxLog instance using its SetFormatter(). Then,
+    if you call:
 
-    A special version of wxLogChain which uses itself as the
-    new log target. It forwards log messages to the previously installed one in
-    addition to
-    processing them itself. Unlike wxLogInterposer, it doesn't
-    delete the old target which means it can be used to temporarily redirect log
-    output.
+    @code
+        wxLogMessage(_("*** Application started ***"));
+    @endcode
 
-    As per wxLogInterposer, this class must be derived from to implement
-    wxLog::DoLog
-    and/or wxLog::DoLogString methods.
+    the log output could be something like:
+
+    @verbatim
+        [7872] d:\testApp\src\testApp.cpp(85) : *** Application started ***
+    @endverbatim
 
     @library{wxbase}
     @category{logging}
+
+    @see @ref overview_log
+
+    @since 2.9.4
 */
-class wxLogInterposerTemp : public wxLogChain
+class wxLogFormatter
 {
 public:
     /**
-        The default constructor installs this object as the current active log target.
+        The default ctor does nothing.
     */
-};
+    wxLogFormatter();
 
 
+    /**
+        This function creates the full log message string.
+
+        Override it to customize the output string format.
+
+        @param level
+            The level of this log record, e.g. ::wxLOG_Error.
+        @param msg
+            The log message itself.
+        @param info
+            All the other information (such as time, component, location...)
+            associated with this log record.
+
+        @return
+            The formated message.
+
+        @note
+            Time stamping is disabled for Visual C++ users in debug builds by
+            default because otherwise it would be impossible to directly go to the line
+            from which the log message was generated by simply clicking in the debugger
+            window on the corresponding error message. If you wish to enable it, override
+            FormatTime().
+    */
+    virtual wxString Format(wxLogLevel level,
+                            const wxString& msg,
+                            const wxLogRecordInfo& info) const;
 
-/**
-    @class wxLogChain
+protected:
+    /**
+        This function formats the time stamp part of the log message.
 
-    This simple class allows you to chain log sinks, that is to install a new sink but
-    keep passing log messages to the old one instead of replacing it completely as
-    wxLog::SetActiveTarget does.
+        Override this function if you need to customize just the time stamp.
 
-    It is especially useful when you want to divert the logs somewhere (for
-    example to a file or a log window) but also keep showing the error messages
-    using the standard dialogs as wxLogGui does by default.
+        @param time
+            Time to format.
 
-    Example of usage:
+        @return
+            The formated time string, may be empty.
+    */
+    virtual wxString FormatTime(time_t time) const;
+};
 
-    @code
-    wxLogChain *logChain = new wxLogChain(new wxLogStderr);
 
-    // all the log messages are sent to stderr and also processed as usually
-    ...
+/**
+    @class wxLog
 
-    // don't delete logChain directly as this would leave a dangling
-    // pointer as active log target, use SetActiveTarget() instead
-    delete wxLog::SetActiveTarget(...something else or NULL...);
-    @endcode
+    wxLog class defines the interface for the <em>log targets</em> used by wxWidgets
+    logging functions as explained in the @ref overview_log.
+
+    The only situations when you need to directly use this class is when you want
+    to derive your own log target because the existing ones don't satisfy your
+    needs.
+
+    Otherwise, it is completely hidden behind the @ref group_funcmacro_log "wxLogXXX() functions"
+    and you may not even know about its existence.
+
+    @note For console-mode applications, the default target is wxLogStderr, so
+          that all @e wxLogXXX() functions print on @c stderr when @c wxUSE_GUI = 0.
 
     @library{wxbase}
     @category{logging}
+
+    @see @ref overview_log, @ref group_funcmacro_log "wxLogXXX() functions"
 */
-class wxLogChain : public wxLog
+class wxLog
 {
 public:
     /**
-        Sets the specified @c logger (which may be @NULL) as the default log
-        target but the log messages are also passed to the previous log target if any.
+        @name Trace mask functions
     */
-    wxLogChain(wxLog* logger);
+    //@{
 
     /**
-        Destroys the previous log target.
+        Add the @a mask to the list of allowed masks for wxLogTrace().
+
+        @see RemoveTraceMask(), GetTraceMasks()
     */
-    ~wxLogChain();
+    static void AddTraceMask(const wxString& mask);
 
     /**
-        Detaches the old log target so it won't be destroyed when the wxLogChain object
-        is destroyed.
+        Removes all trace masks previously set with AddTraceMask().
+
+        @see RemoveTraceMask()
     */
-    void DetachOldLog();
+    static void ClearTraceMasks();
 
     /**
-        Returns the pointer to the previously active log target (which may be @NULL).
+        Returns the currently allowed list of string trace masks.
+
+        @see AddTraceMask().
     */
-    wxLog* GetOldLog() const;
+    static const wxArrayString& GetTraceMasks();
 
     /**
-        Returns @true if the messages are passed to the previously active log
-        target (default) or @false if PassMessages()
-        had been called.
+        Returns @true if the @a mask is one of allowed masks for wxLogTrace().
+
+        See also: AddTraceMask(), RemoveTraceMask()
     */
-    bool IsPassingMessages() const;
+    static bool IsAllowedTraceMask(const wxString& mask);
 
     /**
-        By default, the log messages are passed to the previously active log target.
-        Calling this function with @false parameter disables this behaviour
-        (presumably temporarily, as you shouldn't use wxLogChain at all otherwise) and
-        it can be reenabled by calling it again with @a passMessages set to @true.
+        Remove the @a mask from the list of allowed masks for
+        wxLogTrace().
+
+        @see AddTraceMask()
     */
-    void PassMessages(bool passMessages);
+    static void RemoveTraceMask(const wxString& mask);
+
+    //@}
+
+
 
     /**
-        Sets another log target to use (may be @NULL). The log target specified
-        in the wxLogChain(wxLog*) constructor or in a previous call to
-        this function is deleted.
-        This doesn't change the old log target value (the one the messages are
-        forwarded to) which still remains the same as was active when wxLogChain
-        object was created.
+        @name Log target functions
     */
-    void SetLog(wxLog* logger);
-};
+    //@{
 
+    /**
+        Instructs wxLog to not create new log targets on the fly if there is none
+        currently (see GetActiveTarget()).
 
+        (Almost) for internal use only: it is supposed to be called by the
+        application shutdown code (where you don't want the log target to be
+        automatically created anymore).
 
-/**
-    @class wxLogGui
+        Note that this function also calls ClearTraceMasks().
+    */
+    static void DontCreateOnDemand();
 
-    This is the default log target for the GUI wxWidgets applications.
+    /**
+        Returns the pointer to the active log target (may be @NULL).
 
-    Please see @ref overview_log_customize for explanation of how to change the
-    default log target.
+        Notice that if SetActiveTarget() hadn't been previously explicitly
+        called, this function will by default try to create a log target by
+        calling wxAppTraits::CreateLogTarget() which may be overridden in a
+        user-defined traits class to change the default behaviour. You may also
+        call DontCreateOnDemand() to disable this behaviour.
+
+        When this function is called from threads other than main one,
+        auto-creation doesn't happen. But if the thread has a thread-specific
+        log target previously set by SetThreadActiveTarget(), it is returned
+        instead of the global one. Otherwise, the global log target is
+        returned.
+    */
+    static wxLog* GetActiveTarget();
 
-    An object of this class is used by default to show the log messages created
-    by using wxLogMessage(), wxLogError() and other logging functions. It
-    doesn't display the messages logged by them immediately however but
-    accumulates all messages logged during an event handler execution and then
-    shows them all at once when its Flush() method is called during the idle
-    time processing. This has the important advantage of showing only a single
-    dialog to the user even if several messages were logged because of a single
-    error as it often happens (e.g. a low level function could log a message
-    because it failed to open a file resulting in its caller logging another
-    message due to the failure of higher level operation requiring the use of
-    this file). If you need to force the display of all previously logged
-    messages immediately you can use wxLog::FlushActive() to force the dialog
-    display.
+    /**
+        Sets the specified log target as the active one.
 
-    Also notice that if an error message is logged when several informative
-    messages had been already logged before, the informative messages are
-    discarded on the assumption that they are not useful -- and may be
-    confusing and hence harmful -- any more after the error. The warning
-    and error messages are never discarded however and any informational
-    messages logged after the first error one are also kept (as they may
-    contain information about the error recovery). You may override DoLog()
-    method to change this behaviour.
+        Returns the pointer to the previous active log target (may be @NULL).
+        To suppress logging use a new instance of wxLogNull not @NULL.  If the
+        active log target is set to @NULL a new default log target will be
+        created when logging occurs.
 
-    At any rate, it is possible that that several messages were accumulated
-    before this class Flush() method is called. If this is the case, Flush()
-    uses a custom dialog which shows the last message directly and allows the
-    user to view the previously logged ones by expanding the "Details"
-    wxCollapsiblePane inside it. This custom dialog also provides the buttons
-    for copying the log messages to the clipboard and saving them to a file.
+        @see SetThreadActiveTarget()
+    */
+    static wxLog* SetActiveTarget(wxLog* logtarget);
 
-    However if only a single message is present when Flush() is called, just a
-    wxMessageBox() is used to show it. This has the advantage of being closer
-    to the native behaviour but it doesn't give the user any possibility to
-    copy or save the message (except for the recent Windows versions where @c
-    Ctrl-C may be pressed in the message box to copy its contents to the
-    clipboard) so you may want to override DoShowSingleMessage() to customize
-    wxLogGui -- the dialogs sample shows how to do this.
+    /**
+        Sets a thread-specific log target.
+
+        The log target passed to this function will be used for all messages
+        logged by the current thread using the usual wxLog functions. This
+        shouldn't be called from the main thread which never uses a thread-
+        specific log target but can be used for the other threads to handle
+        thread logging completely separately; instead of buffering thread log
+        messages in the main thread logger.
+
+        Notice that unlike for SetActiveTarget(), wxWidgets does not destroy
+        the thread-specific log targets when the thread terminates so doing
+        this is your responsibility.
+
+        This method is only available if @c wxUSE_THREADS is 1, i.e. wxWidgets
+        was compiled with threads support.
+
+        @param logger
+            The new thread-specific log target, possibly @NULL.
+        @return
+            The previous thread-specific log target, initially @NULL.
+
+        @since 2.9.1
+     */
+    static wxLog *SetThreadActiveTarget(wxLog *logger);
 
-    @library{wxcore}
-    @category{logging}
-*/
-class wxLogGui : public wxLog
-{
-public:
     /**
-        Default constructor.
+        Flushes the current log target if any, does nothing if there is none.
+
+        When this method is called from the main thread context, it also
+        flushes any previously buffered messages logged by the other threads.
+        When it is called from the other threads it simply calls Flush() on the
+        currently active log target, so it mostly makes sense to do this if a
+        thread has its own logger set with SetThreadActiveTarget().
     */
-    wxLogGui();
+    static void FlushActive();
 
     /**
-        Presents the accumulated log messages, if any, to the user.
+        Resumes logging previously suspended by a call to Suspend().
+        All messages logged in the meanwhile will be flushed soon.
+    */
+    static void Resume();
 
-        This method is called during the idle time and should show any messages
-        accumulated in wxLogGui#m_aMessages field to the user.
+    /**
+        Suspends the logging until Resume() is called.
+
+        Note that the latter must be called the same number of times as the former
+        to undo it, i.e. if you call Suspend() twice you must call Resume() twice as well.
+
+        Note that suspending the logging means that the log sink won't be flushed
+        periodically, it doesn't have any effect if the current log target does the
+        logging immediately without waiting for Flush() to be called (the standard
+        GUI log target only shows the log dialog when it is flushed, so Suspend()
+        works as expected with it).
+
+        @see Resume(), wxLogNull
+    */
+    static void Suspend();
+
+    //@}
+
+
+
+    /**
+        @name Log level functions
+    */
+    //@{
+
+    /**
+        Returns the current log level limit.
+
+        All messages at levels strictly greater than the value returned by this
+        function are not logged at all.
+
+        @see SetLogLevel(), IsLevelEnabled()
+    */
+    static wxLogLevel GetLogLevel();
+
+    /**
+        Returns true if logging at this level is enabled for the current thread.
+
+        This function only returns @true if logging is globally enabled and if
+        @a level is less than or equal to the maximal log level enabled for the
+        given @a component.
+
+        @see IsEnabled(), SetLogLevel(), GetLogLevel(), SetComponentLevel()
+
+        @since 2.9.1
      */
-    virtual void Flush();
+    static bool IsLevelEnabled(wxLogLevel level, wxString component);
 
-protected:
     /**
-        Returns the appropriate title for the dialog.
+        Sets the log level for the given component.
 
-        The title is constructed from wxApp::GetAppDisplayName() and the
-        severity string (e.g. "error" or "warning") appropriate for the current
-        wxLogGui#m_bErrors and wxLogGui#m_bWarnings values.
+        For example, to disable all but error messages from wxWidgets network
+        classes you may use
+        @code
+            wxLog::SetComponentLevel("wx/net", wxLOG_Error);
+        @endcode
+
+        SetLogLevel() may be used to set the global log level.
+
+        @param component
+            Non-empty component name, possibly using slashes (@c /) to separate
+            it into several parts.
+        @param level
+            Maximal level of log messages from this component which will be
+            handled instead of being simply discarded.
+
+        @since 2.9.1
      */
-    wxString GetTitle() const;
+    static void SetComponentLevel(const wxString& component, wxLogLevel level);
 
     /**
-        Returns wxICON_ERROR, wxICON_WARNING or wxICON_INFORMATION depending on
-        the current maximal severity.
+        Specifies that log messages with level greater (numerically) than
+        @a logLevel should be ignored and not sent to the active log target.
 
-        This value is suitable to be used in the style parameter of
-        wxMessageBox() function.
+        @see SetComponentLevel()
+    */
+    static void SetLogLevel(wxLogLevel logLevel);
+
+    //@}
+
+
+
+    /**
+        @name Enable/disable features functions
+    */
+    //@{
+
+    /**
+        Globally enable or disable logging.
+
+        Calling this function with @false argument disables all log messages
+        for the current thread.
+
+        @see wxLogNull, IsEnabled()
+
+        @return
+            The old state, i.e. @true if logging was previously enabled and
+            @false if it was disabled.
      */
-    int GetSeverityIcon() const;
+    static bool EnableLogging(bool enable = true);
 
     /**
-        Forgets all the currently stored messages.
+        Returns true if logging is enabled at all now.
 
-        If you override Flush() (and don't call the base class version), you
-        must call this method to avoid messages being logged over and over
-        again.
+        @see IsLevelEnabled(), EnableLogging()
      */
-    void Clear();
+    static bool IsEnabled();
 
+    /**
+        Returns whether the repetition counting mode is enabled.
+    */
+    static bool GetRepetitionCounting();
 
     /**
-        Method called by Flush() to show a single log message.
+        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.
+    */
+    static void SetRepetitionCounting(bool repetCounting = true);
 
-        This function can be overridden to show the message in a different way.
-        By default a simple wxMessageBox() call is used.
+    /**
+        Returns the current timestamp format string.
 
-        @param message
-            The message to show (it can contain multiple lines).
-        @param title
-            The suggested title for the dialog showing the message, see
-            GetTitle().
-        @param style
-            One of @c wxICON_XXX constants, see GetSeverityIcon().
+        Notice that the current time stamp is only used by the default log
+        formatter and custom formatters may ignore this format.
+    */
+    static const wxString& GetTimestamp();
+
+    /**
+        Sets the timestamp format prepended by the default log targets to all
+        messages. The string may contain any normal characters as well as %
+        prefixed format specifiers, see @e strftime() manual for details.
+        Passing an empty string to this function disables message time stamping.
+
+        Notice that the current time stamp is only used by the default log
+        formatter and custom formatters may ignore this format. You can also
+        define a custom wxLogFormatter to customize the time stamp handling
+        beyond changing its format.
+    */
+    static void SetTimestamp(const wxString& format);
+
+    /**
+        Disables time stamping of the log messages.
+
+        Notice that the current time stamp is only used by the default log
+        formatter and custom formatters may ignore calls to this function.
+
+        @since 2.9.0
+    */
+    static void DisableTimestamp();
+
+    /**
+        Returns whether the verbose mode is currently active.
+    */
+    static bool GetVerbose();
+
+    /**
+        Activates or deactivates verbose mode in which the verbose messages are
+        logged as the normal ones instead of being silently dropped.
+
+        The verbose messages are the trace messages which are not disabled in the
+        release mode and are generated by wxLogVerbose().
+
+        @see @ref overview_log
+    */
+    static void SetVerbose(bool verbose = true);
+
+    //@}
+
+
+    /**
+        Sets the specified formatter as the active one.
+
+        @param formatter
+            The new formatter. If @NULL, reset to the default formatter.
+
+        Returns the pointer to the previous formatter. You must delete it
+        if you don't plan to attach it again to a wxLog object later.
+
+        @since 2.9.4
+    */
+    wxLogFormatter *SetFormatter(wxLogFormatter* formatter);
+
+
+    /**
+        Some of wxLog implementations, most notably the standard wxLogGui class,
+        buffer the messages (for example, to avoid showing the user a zillion of modal
+        message boxes one after another -- which would be really annoying).
+        This function shows them all and clears the buffer contents.
+        If the buffer is already empty, nothing happens.
+
+        If you override this method in a derived class, call the base class
+        version first, before doing anything else.
+    */
+    virtual void Flush();
+
+    /**
+        Log the given record.
+
+        This function should only be called from the DoLog() implementations in
+        the derived classes if they need to call DoLogRecord() on another log
+        object (they can, of course, just use wxLog::DoLogRecord() call syntax
+        to call it on the object itself). It should not be used for logging new
+        messages which can be only sent to the currently active logger using
+        OnLog() which also checks if the logging (for this level) is enabled
+        while this method just directly calls DoLog().
+
+        Example of use of this class from wxLogChain:
+        @code
+        void wxLogChain::DoLogRecord(wxLogLevel level,
+                                     const wxString& msg,
+                                     const wxLogRecordInfo& info)
+        {
+            // let the previous logger show it
+            if ( m_logOld && IsPassingMessages() )
+                m_logOld->LogRecord(level, msg, info);
+
+            // and also send it to the new one
+            if ( m_logNew && m_logNew != this )
+                m_logNew->LogRecord(level, msg, info);
+        }
+        @endcode
+
+        @since 2.9.1
      */
-    virtual void DoShowSingleLogMessage(const wxString& message,
-                                        const wxString& title,
-                                        int style);
+    void LogRecord(wxLogLevel level, const wxString& msg, const wxLogRecordInfo& info);
 
+protected:
     /**
-        Method called by Flush() to show multiple log messages.
+        @name Logging callbacks.
 
-        This function can be overridden to show the messages in a different way.
-        By default a special log dialog showing the most recent message and
-        allowing the user to expand it to view the previously logged ones is
-        used.
+        The functions which should be overridden by custom log targets.
 
-        @param messages
-            Array of messages to show; it contains more than one element.
-        @param severities
-            Array of message severities containing @c wxLOG_XXX values.
-        @param times
-            Array of time_t values indicating when each message was logged.
-        @param title
-            The suggested title for the dialog showing the message, see
-            GetTitle().
-        @param style
-            One of @c wxICON_XXX constants, see GetSeverityIcon().
+        When defining a new log target, you have a choice between overriding
+        DoLogRecord(), which provides maximal flexibility, DoLogTextAtLevel()
+        which can be used if you don't intend to change the default log
+        messages formatting but want to handle log messages of different levels
+        differently or, in the simplest case, DoLogText().
      */
-    virtual void DoShowMultipleLogMessages(const wxArrayString& messages,
-                                           const wxArrayInt& severities,
-                                           const wxArrayLong& times,
-                                           const wxString& title,
-                                           int style);
+    //@{
+
+    /**
+        Called to log a new record.
+
+        Any log message created by wxLogXXX() functions is passed to this
+        method of the active log target. The default implementation prepends
+        the timestamp and, for some log levels (e.g. error and warning), the
+        corresponding prefix to @a msg and passes it to DoLogTextAtLevel().
+
+        You may override this method to implement custom formatting of the
+        log messages or to implement custom filtering of log messages (e.g. you
+        could discard all log messages coming from the given source file).
+     */
+    virtual void DoLogRecord(wxLogLevel level,
+                             const wxString& msg,
+                             const wxLogRecordInfo& info);
+
+    /**
+        Called to log the specified string at given level.
+
+        The base class versions logs debug and trace messages on the system
+        default debug output channel and passes all the other messages to
+        DoLogText().
+    */
+    virtual void DoLogTextAtLevel(wxLogLevel level, const wxString& msg);
+
+    /**
+        Called to log the specified string.
+
+        A simple implementation might just send the string to @c stdout or
+        @c stderr or save it in a file (of course, the already existing
+        wxLogStderr can be used for this).
+
+        The base class version of this function asserts so it must be
+        overridden if you don't override DoLogRecord() or DoLogTextAtLevel().
+    */
+    virtual void DoLogText(const wxString& msg);
+
+    //@}
+};
+
+
+
+/**
+    @class wxLogChain
+
+    This simple class allows you to chain log sinks, that is to install a new sink but
+    keep passing log messages to the old one instead of replacing it completely as
+    wxLog::SetActiveTarget does.
+
+    It is especially useful when you want to divert the logs somewhere (for
+    example to a file or a log window) but also keep showing the error messages
+    using the standard dialogs as wxLogGui does by default.
+
+    Example of usage:
+
+    @code
+    wxLogChain *logChain = new wxLogChain(new wxLogStderr);
+
+    // all the log messages are sent to stderr and also processed as usually
+    ...
+
+    // don't delete logChain directly as this would leave a dangling
+    // pointer as active log target, use SetActiveTarget() instead
+    delete wxLog::SetActiveTarget(...something else or NULL...);
+    @endcode
+
+    @library{wxbase}
+    @category{logging}
+*/
+class wxLogChain : public wxLog
+{
+public:
+    /**
+        Sets the specified @c logger (which may be @NULL) as the default log
+        target but the log messages are also passed to the previous log target if any.
+    */
+    wxLogChain(wxLog* logger);
+
+    /**
+        Destroys the previous log target.
+    */
+    virtual ~wxLogChain();
+
+    /**
+        Detaches the old log target so it won't be destroyed when the wxLogChain object
+        is destroyed.
+    */
+    void DetachOldLog();
+
+    /**
+        Returns the pointer to the previously active log target (which may be @NULL).
+    */
+    wxLog* GetOldLog() const;
+
+    /**
+        Returns @true if the messages are passed to the previously active log
+        target (default) or @false if PassMessages() had been called.
+    */
+    bool IsPassingMessages() const;
 
+    /**
+        By default, the log messages are passed to the previously active log target.
+        Calling this function with @false parameter disables this behaviour
+        (presumably temporarily, as you shouldn't use wxLogChain at all otherwise) and
+        it can be reenabled by calling it again with @a passMessages set to @true.
+    */
+    void PassMessages(bool passMessages);
 
     /**
-        All currently accumulated messages.
+        Sets another log target to use (may be @NULL).
 
-        This array may be empty if no messages were logged.
+        The log target specified in the wxLogChain(wxLog*) constructor or in a
+        previous call to this function is deleted.
+        This doesn't change the old log target value (the one the messages are
+        forwarded to) which still remains the same as was active when wxLogChain
+        object was created.
+    */
+    void SetLog(wxLog* logger);
+};
 
-        @see m_aSeverity, m_aTimes
-     */
-    wxArrayString m_aMessages;
 
-    /**
-        The severities of each logged message.
 
-        This array is synchronized with wxLogGui#m_aMessages, i.e. the n-th
-        element of this array corresponds to the severity of the n-th message.
-        The possible severity values are @c wxLOG_XXX constants, e.g.
-        wxLOG_Error, wxLOG_Warning, wxLOG_Message etc.
-     */
-    wxArrayInt m_aSeverity;
+/**
+    @class wxLogInterposer
 
-    /**
-        The time stamps of each logged message.
+    A special version of wxLogChain which uses itself as the new log target.
+    It forwards log messages to the previously installed one in addition to
+    processing them itself.
 
-        The elements of this array are time_t values corresponding to the time
-        when the message was logged.
-     */
-    wxArrayLong m_aTimes;
+    Unlike wxLogChain which is usually used directly as is, this class must be
+    derived from to implement wxLog::DoLog and/or wxLog::DoLogString methods.
 
-    /**
-        True if there any error messages.
-     */
-    bool m_bErrors;
+    wxLogInterposer destroys the previous log target in its destructor.
+    If you don't want this to happen, use wxLogInterposerTemp instead.
 
+    @library{wxbase}
+    @category{logging}
+*/
+class wxLogInterposer : public wxLogChain
+{
+public:
     /**
-        True if there any warning messages.
+        The default constructor installs this object as the current active log target.
+    */
+    wxLogInterposer();
+};
 
-        If both wxLogGui#m_bErrors and this member are false, there are only
-        informational messages to be shown.
-     */
-    bool m_bWarnings;
 
-    /**
-        True if there any messages to be shown to the user.
 
-        This variable is used instead of simply checking whether
-        wxLogGui#m_aMessages array is empty to allow blocking further calls to
-        Flush() while a log dialog is already being shown, even if the messages
-        array hasn't been emptied yet.
-     */
-    bool m_bHasMessages;
-};
+/**
+    @class wxLogInterposerTemp
+
+    A special version of wxLogChain which uses itself as the new log target.
+    It forwards log messages to the previously installed one in addition to
+    processing them itself. Unlike wxLogInterposer, it doesn't delete the old
+    target which means it can be used to temporarily redirect log output.
+
+    As per wxLogInterposer, this class must be derived from to implement
+    wxLog::DoLog and/or wxLog::DoLogString methods.
 
+    @library{wxbase}
+    @category{logging}
+*/
+class wxLogInterposerTemp : public wxLogChain
+{
+public:
+    /**
+        The default constructor installs this object as the current active log target.
+    */
+    wxLogInterposerTemp();
+};
 
 
 /**
@@ -397,7 +755,7 @@ public:
         Constructs a log target which sends all the log messages to the given
         output stream. If it is @NULL, the messages are sent to @c cerr.
     */
-    wxLogStream(std::ostream ostr = NULL);
+    wxLogStream(std::ostream *ostr = NULL);
 };
 
 
@@ -406,8 +764,10 @@ public:
     @class wxLogStderr
 
     This class can be used to redirect the log messages to a C file stream (not to
-    be confused with C++ streams). It is the default log target for the non-GUI
-    wxWidgets applications which send all the output to @c stderr.
+    be confused with C++ streams).
+
+    It is the default log target for the non-GUI wxWidgets applications which
+    send all the output to @c stderr.
 
     @library{wxbase}
     @category{logging}
@@ -421,7 +781,7 @@ public:
         Constructs a log target which sends all the log messages to the given
         @c FILE. If it is @NULL, the messages are sent to @c stderr.
     */
-    wxLogStderr(FILE fp = NULL);
+    wxLogStderr(FILE* fp = NULL);
 };
 
 
@@ -436,8 +796,7 @@ public:
     by the new lines.
 
     All the messages collected so far can be shown to the user (and the current
-    buffer cleared) by calling the overloaded wxLogBuffer::Flush
-    method.
+    buffer cleared) by calling the overloaded wxLogBuffer::Flush method.
 
     @library{wxbase}
     @category{logging}
@@ -445,6 +804,11 @@ public:
 class wxLogBuffer : public wxLog
 {
 public:
+    /**
+        The default ctor does nothing.
+    */
+    wxLogBuffer();
+
     /**
         Shows all the messages collected so far to the user (using a message box in the
         GUI applications or by printing them out to the console in text mode) and
@@ -455,481 +819,374 @@ public:
     /**
         Returns the current buffer contains. Messages from different log function calls
         are separated with the new lines in the buffer.
-        The buffer can be cleared by Flush() which will
-        also show the current contents to the user.
+        The buffer can be cleared by Flush() which will also show the current
+        contents to the user.
     */
-    const wxString GetBuffer();
+    const wxString& GetBuffer() const;
 };
 
 
 
 /**
-    @class wxLogInterposer
+    @class wxLogNull
 
-    A special version of wxLogChain which uses itself as the
-    new log target. It forwards log messages to the previously installed one in
-    addition to
-    processing them itself.
+    This class allows you to temporarily suspend logging. All calls to the log
+    functions during the life time of an object of this class are just ignored.
 
-    Unlike wxLogChain which is usually used directly as is,
-    this class must be derived from to implement wxLog::DoLog
-    and/or wxLog::DoLogString methods.
+    In particular, it can be used to suppress the log messages given by wxWidgets
+    itself but it should be noted that it is rarely the best way to cope with this
+    problem as @b all log messages are suppressed, even if they indicate a
+    completely different error than the one the programmer wanted to suppress.
 
-    wxLogInterposer destroys the previous log target in its destructor. If you
-    don't want this to happen, use wxLogInterposerTemp instead.
+    For instance, the example of the overview:
 
-    @library{wxbase}
-    @category{logging}
-*/
-class wxLogInterposer : public wxLogChain
-{
-public:
-    /**
-        The default constructor installs this object as the current active log target.
-    */
-};
+    @code
+      wxFile file;
 
+      // wxFile.Open() normally complains if file can't be opened, we don't want it
+      {
+        wxLogNull logNo;
+        if ( !file.Open("bar") )
+          ... process error ourselves ...
+      } // ~wxLogNull called, old log sink restored
 
+      wxLogMessage("..."); // ok
+    @endcode
 
-/**
-    @class wxLogTextCtrl
+    would be better written as:
+
+    @code
+      wxFile file;
+
+      // don't try to open file if it doesn't exist, we are prepared to deal with
+      // this ourselves - but all other errors are not expected
+      if ( wxFile::Exists("bar") )
+      {
+          // gives an error message if the file couldn't be opened
+          file.Open("bar");
+      }
+      else
+      {
+          ...
+      }
+    @endcode
 
-    Using these target all the log messages can be redirected to a text control.
-    The text control must have been created with @c wxTE_MULTILINE style by the
-    caller previously.
 
     @library{wxbase}
     @category{logging}
-
-    @see wxTextCtrl, wxStreamToTextRedirector
 */
-class wxLogTextCtrl : public wxLog
+class wxLogNull
 {
 public:
     /**
-        Constructs a log target which sends all the log messages to the given text
-        control. The @a textctrl parameter cannot be @NULL.
+        Suspends logging.
+    */
+    wxLogNull();
+
+    /**
+        Resumes logging.
     */
-    wxLogTextCtrl(wxTextCtrl textctrl);
+    ~wxLogNull();
 };
 
+#endif // wxUSE_BASE
 
+#if wxUSE_GUI
 
 /**
-    @class wxLog
-
-    wxLog class defines the interface for the @e log targets used by wxWidgets
-    logging functions as explained in the @ref overview_log.
-    The only situations when you need to directly use this class is when you want
-    to derive your own log target because the existing ones don't satisfy your
-    needs. Another case is if you wish to customize the behaviour of the standard
-    logging classes (all of which respect the wxLog settings): for example, set
-    which trace messages are logged and which are not or change (or even remove
-    completely) the timestamp on the messages.
-
-    Otherwise, it is completely hidden behind the @e wxLogXXX() functions and
-    you may not even know about its existence.
-
-     @section overview_wxLog_deriving Deriving your own log target
-     
-        There are two functions which must be implemented by any derived class to
-        actually process the log messages: DoLog() and
-        DoLogString(). The second function receives a string
-        which just has to be output in some way and the easiest way to write a new log
-        target is to override just this function in the derived class. If more control
-        over the output format is needed, then the first function must be overridden
-        which allows to construct custom messages depending on the log level or even
-        do completely different things depending on the message severity (for example,
-        throw away all messages except warnings and errors, show warnings on the
-        screen and forward the error messages to the user's (or programmer's) cell
-        phone - maybe depending on whether the timestamp tells us if it is day or
-        night in the current time zone).
-        There also functions to support message buffering. Why are they needed?
-        Some of wxLog implementations, most notably the standard wxLogGui class,
-        buffer the messages (for example, to avoid showing the user a zillion of modal
-        message boxes one after another -- which would be really annoying).
-        Flush() shows them all and clears the buffer contents.
-        This function doesn't do anything if the buffer is already empty.
-        See also:
-        @li Flush()
-        @li FlushActive()
-
-     @section overview_wxLog_Trace_Masks Using trace masks
-
-        The functions below allow some limited customization of wxLog behaviour
-        without writing a new log target class (which, aside from being a matter of
-        several minutes, allows you to do anything you want).
-        The verbose messages are the trace messages which are not disabled in the
-        release mode and are generated by wxLogVerbose(). They
-        are not normally shown to the user because they present little interest, but
-        may be activated, for example, in order to help the user find some program
-        problem.
-        As for the (real) trace messages, their handling depends on the settings of
-        the (application global) @e trace mask which can either be specified using
-        SetTraceMask(), GetTraceMask() and wxLogTrace() which takes an integer mask
-        or using AddTraceMask() for string trace masks.
-        The difference between bit-wise and string trace masks is that a message using
-        integer trace mask will only be logged if all bits of the mask are set in the
-        current mask while a message using string mask will be logged simply if the
-        mask had been added before to the list of allowed ones.
-        For example,
-        
-        @code
-        wxLogTrace( wxTraceRefCount|wxTraceOleCalls, "Active object ref count: %d", nRef );
-        @endcode
-
-        will do something only if the current trace mask contains both
-        @c wxTraceRefCount and @c wxTraceOle, but
-
-        @code
-        wxLogTrace( wxTRACE_OleCalls, "IFoo::Bar() called" );
-        @endcode
-        
-        will log the message if it was preceded by
-        
-        @code
-        wxLog::AddTraceMask( wxTRACE_OleCalls);
-        @endcode
+    @class wxLogWindow
 
-        Using string masks is simpler and allows you to easily add custom ones, so this is
-        the preferred way of working with trace messages. The integer trace mask is
-        kept for compatibility and for additional (but very rarely needed) flexibility
-        only.
-        The standard trace masks are given in wxLogTrace() documentation.
-        Finally, the @e wxLog::DoLog() function automatically prepends a time stamp
-        to all the messages. The format of the time stamp may be changed: it can be
-        any string with % specifications fully described in the documentation of the
-        standard @e strftime() function. For example, the default format is
-        "[%d/%b/%y %H:%M:%S] " which gives something like "[17/Sep/98 22:10:16] "
-        (without quotes) for the current date. Setting an empty string as the time
-        format disables timestamping of the messages completely.
-        See also
-        @li AddTraceMask()
-        @li RemoveTraceMask()
-        @li ClearTraceMasks()
-        @li GetTraceMasks()
-        @li IsAllowedTraceMask()
-        @li SetVerbose()
-        @li GetVerbose()
-        @li SetTimestamp()
-        @li GetTimestamp()
-        @li SetTraceMask()
-        @li GetTraceMask()
-        @li SetRepetitionCounting()
-        @li GetRepetitionCounting()
-
-        @note Timestamping is disabled for Visual C++ users in debug builds by
-        default because otherwise it would be impossible to directly go to the line
-        from which the log message was generated by simply clicking in the debugger
-        window on the corresponding error message. If you wish to enable it, please
-        use SetTimestamp() explicitly. 
-        
-     @section overview_wxLog_Target Manipulating the log target
-
-        The functions in this section work with and manipulate the active log
-        target. The OnLog() is called by the @e wxLogXXX() functions
-        and invokes the DoLog() of the active log target if any.
-        Get/Set methods are used to install/query the current active target and,
-        finally, DontCreateOnDemand() disables the automatic creation of a standard
-        log target if none actually exists. It is only useful when the application
-        is terminating and shouldn't be used in other situations because it may
-        easily lead to a loss of messages. See also
-        @li OnLog()
-        @li GetActiveTarget()
-        @li SetActiveTarget()
-        @li DontCreateOnDemand()
-        @li Suspend()
-        @li Resume()
+    This class represents a background log window: to be precise, it collects all
+    log messages in the log frame which it manages but also passes them on to the
+    log target which was active at the moment of its creation. This allows you, for
+    example, to show all the log messages in a frame but still continue to process
+    them normally by showing the standard log dialog.
 
     @library{wxcore}
     @category{logging}
 
-    @see @ref overview_log
+    @see wxLogTextCtrl
 */
-class wxLog
+class wxLogWindow : public wxLogInterposer
 {
 public:
     /**
-        Add the @a mask to the list of allowed masks for
-        wxLogTrace().
+        Creates the log frame window and starts collecting the messages in it.
 
-        @see RemoveTraceMask(), GetTraceMasks()
+        @param pParent
+            The parent window for the log frame, may be @NULL
+        @param szTitle
+            The title for the log frame
+        @param show
+            @true to show the frame initially (default), otherwise
+            Show() must be called later.
+        @param passToOld
+            @true to process the log messages normally in addition to logging them
+            in the log frame (default), @false to only log them in the log frame.
+            Note that if no targets were set using wxLog::SetActiveTarget() then
+            wxLogWindow simply becomes the active one and messages won't be passed
+            to other targets.
     */
-    static void AddTraceMask(const wxString& mask);
+    wxLogWindow(wxWindow* pParent, const wxString& szTitle, bool show = true,
+                bool passToOld = true);
 
     /**
-        Removes all trace masks previously set with
-        AddTraceMask().
-
-        @see RemoveTraceMask()
+        Returns the associated log frame window. This may be used to position or resize
+        it but use Show() to show or hide it.
     */
-    static void ClearTraceMasks();
+    wxFrame* GetFrame() const;
 
     /**
-        Disables time stamping of the log messages.
-        This function is new since wxWidgets version 2.9
-    */
-    void SetTimestamp(const wxString& format);
+        Called if the user closes the window interactively, will not be
+        called if it is destroyed for another reason (such as when program
+        exits).
 
-    /**
-        Called to process the message of the specified severity. @a msg is the text
-        of the message as specified in the call of @e wxLogXXX() function which
-        generated it and @a timestamp is the moment when the message was generated.
-        The base class version prepends the timestamp to the message, adds a prefix
-        corresponding to the log level and then calls
-        DoLogString() with the resulting string.
-    */
-    virtual void DoLog(wxLogLevel level, const wxString& msg,
-                       time_t timestamp);
+        Return @true from here to allow the frame to close, @false to
+        prevent this from happening.
 
-    /**
-        Called to log the specified string. The timestamp is already included in the
-        string but still passed to this function.
-        A simple implementation may just send the string to @c stdout or, better,
-        @c stderr.
+        @see OnFrameDelete()
     */
-    virtual void DoLogString(const wxString& msg, time_t timestamp);
+    virtual bool OnFrameClose(wxFrame* frame);
 
     /**
-        Instructs wxLog to not create new log targets on the fly if there is none
-        currently. (Almost) for internal use only: it is supposed to be called by the
-        application shutdown code.
-        Note that this function also calls
-        ClearTraceMasks().
+        Called right before the log frame is going to be deleted: will
+        always be called unlike OnFrameClose().
     */
-    static void DontCreateOnDemand();
+    virtual void OnFrameDelete(wxFrame* frame);
 
     /**
-        Shows all the messages currently in buffer and clears it. If the buffer
-        is already empty, nothing happens.
+        Shows or hides the frame.
     */
-    virtual void Flush();
+    void Show(bool show = true);
+};
 
-    /**
-        Flushes the current log target if any, does nothing if there is none.
 
-        @see Flush()
-    */
-    static void FlushActive();
 
-    /**
-        Returns the pointer to the active log target (may be @NULL).
-    */
-    static wxLog* GetActiveTarget();
+/**
+    @class wxLogGui
 
-    /**
-        Returns the current log level limit.
-    */
-    static wxLogLevel GetLogLevel();
+    This is the default log target for the GUI wxWidgets applications.
+
+    Please see @ref overview_log_customize for explanation of how to change the
+    default log target.
+
+    An object of this class is used by default to show the log messages created
+    by using wxLogMessage(), wxLogError() and other logging functions. It
+    doesn't display the messages logged by them immediately however but
+    accumulates all messages logged during an event handler execution and then
+    shows them all at once when its Flush() method is called during the idle
+    time processing. This has the important advantage of showing only a single
+    dialog to the user even if several messages were logged because of a single
+    error as it often happens (e.g. a low level function could log a message
+    because it failed to open a file resulting in its caller logging another
+    message due to the failure of higher level operation requiring the use of
+    this file). If you need to force the display of all previously logged
+    messages immediately you can use wxLog::FlushActive() to force the dialog
+    display.
+
+    Also notice that if an error message is logged when several informative
+    messages had been already logged before, the informative messages are
+    discarded on the assumption that they are not useful -- and may be
+    confusing and hence harmful -- any more after the error. The warning
+    and error messages are never discarded however and any informational
+    messages logged after the first error one are also kept (as they may
+    contain information about the error recovery). You may override DoLog()
+    method to change this behaviour.
+
+    At any rate, it is possible that that several messages were accumulated
+    before this class Flush() method is called. If this is the case, Flush()
+    uses a custom dialog which shows the last message directly and allows the
+    user to view the previously logged ones by expanding the "Details"
+    wxCollapsiblePane inside it. This custom dialog also provides the buttons
+    for copying the log messages to the clipboard and saving them to a file.
 
-    /**
-        Returns whether the repetition counting mode is enabled.
-    */
-    static bool GetRepetitionCounting();
+    However if only a single message is present when Flush() is called, just a
+    wxMessageBox() is used to show it. This has the advantage of being closer
+    to the native behaviour but it doesn't give the user any possibility to
+    copy or save the message (except for the recent Windows versions where @c
+    Ctrl-C may be pressed in the message box to copy its contents to the
+    clipboard) so you may want to override DoShowSingleLogMessage() to
+    customize wxLogGui -- the dialogs sample shows how to do this.
 
+    @library{wxcore}
+    @category{logging}
+*/
+class wxLogGui : public wxLog
+{
+public:
     /**
-        Returns the current timestamp format string.
+        Default constructor.
     */
-    static const wxString GetTimestamp();
+    wxLogGui();
 
     /**
-        Returns the current trace mask, see Customization() section
-        for details.
-    */
-    static wxTraceMask GetTraceMask();
+        Presents the accumulated log messages, if any, to the user.
+
+        This method is called during the idle time and should show any messages
+        accumulated in wxLogGui#m_aMessages field to the user.
+     */
+    virtual void Flush();
 
+protected:
     /**
-        Returns the currently allowed list of string trace masks.
+        Returns the appropriate title for the dialog.
 
-        @see AddTraceMask().
-    */
-    static const wxArrayString GetTraceMasks();
+        The title is constructed from wxApp::GetAppDisplayName() and the
+        severity string (e.g. "error" or "warning") appropriate for the current
+        wxLogGui#m_bErrors and wxLogGui#m_bWarnings values.
+     */
+    wxString GetTitle() const;
 
     /**
-        Returns whether the verbose mode is currently active.
-    */
-    static bool GetVerbose();
+        Returns wxICON_ERROR, wxICON_WARNING or wxICON_INFORMATION depending on
+        the current maximal severity.
 
-    /**
-        Returns @true if the @a mask is one of allowed masks for
-        wxLogTrace().
-        
-        See also: AddTraceMask(), RemoveTraceMask()
-    */
-    static bool IsAllowedTraceMask(const wxString& mask);
+        This value is suitable to be used in the style parameter of
+        wxMessageBox() function.
+     */
+    int GetSeverityIcon() const;
 
     /**
-        There are two functions which must be implemented by any derived class to
-        actually process the log messages: DoLog() and
-        DoLogString(). The second function receives a string
-        which just has to be output in some way and the easiest way to write a new log
-        target is to override just this function in the derived class. If more control
-        over the output format is needed, then the first function must be overridden
-        which allows you to construct custom messages depending on the log level or even
-        do completely different things depending on the message severity (for example,
-        throw away all messages except warnings and errors, show warnings on the
-        screen and forward the error messages to the user's (or programmer's) cell
-        phone - maybe depending on whether the timestamp tells us if it is day or
-        night in the current time zone).
-        There also functions to support message buffering. Why are they needed?
-        Some of wxLog implementations, most notably the standard wxLogGui class,
-        buffer the messages (for example, to avoid showing the user a zillion of modal
-        message boxes one after another -- which would be really annoying).
-        Flush() shows them all and clears the buffer contents.
-        This function doesn't do anything if the buffer is already empty.
-        Flush()
+        Forgets all the currently stored messages.
 
-        FlushActive()
-    */
+        If you override Flush() (and don't call the base class version), you
+        must call this method to avoid messages being logged over and over
+        again.
+     */
+    void Clear();
 
 
     /**
-        Forwards the message at specified level to the @e DoLog() function of the
-        active log target if there is any, does nothing otherwise.
-    */
-    static void OnLog(wxLogLevel level, const wxString& message);
+        All currently accumulated messages.
 
-    /**
-        Remove the @a mask from the list of allowed masks for
-        wxLogTrace().
-        See also: AddTraceMask()
-    */
-    static void RemoveTraceMask(const wxString& mask);
+        This array may be empty if no messages were logged.
 
-    /**
-        Resumes logging previously suspended by a call to Suspend().
-        All messages logged in the meanwhile will be flushed soon.
-    */
-    static void Resume();
+        @see m_aSeverity, m_aTimes
+     */
+    wxArrayString m_aMessages;
 
     /**
-        Sets the specified log target as the active one.
+        The severities of each logged message.
 
-        Returns the pointer to the previous active log target (may be @NULL).
-        To suppress logging use a new instance of wxLogNull not @NULL.  If the
-        active log target is set to @NULL a new default log target will be
-        created when logging occurs.
-    */
-    static wxLog* SetActiveTarget(wxLog* logtarget);
+        This array is synchronized with wxLogGui#m_aMessages, i.e. the n-th
+        element of this array corresponds to the severity of the n-th message.
+        The possible severity values are @c wxLOG_XXX constants, e.g.
+        wxLOG_Error, wxLOG_Warning, wxLOG_Message etc.
+     */
+    wxArrayInt m_aSeverity;
 
     /**
-        Specifies that log messages with level  logLevel should be ignored
-        and not sent to the active log target.
-    */
-    static void SetLogLevel(wxLogLevel logLevel);
+        The time stamps of each logged message.
 
-    /**
-        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.
-    */
-    static void SetRepetitionCounting(bool repetCounting = true);
+        The elements of this array are time_t values corresponding to the time
+        when the message was logged.
+     */
+    wxArrayLong m_aTimes;
 
     /**
-        Sets the timestamp format prepended by the default log targets to all
-        messages. The string may contain any normal characters as well as %
-        prefixed format specificators, see @e strftime() manual for details.
-        Passing an empty string to this function disables message time stamping.
-    */
-    static void SetTimestamp(const wxString& format);
+        True if there any error messages.
+     */
+    bool m_bErrors;
 
     /**
-        Sets the trace mask, see Customization()
-        section for details.
-    */
-    static void SetTraceMask(wxTraceMask mask);
+        True if there any warning messages.
 
-    /**
-        Activates or deactivates verbose mode in which the verbose messages are
-        logged as the normal ones instead of being silently dropped.
-    */
-    static void SetVerbose(bool verbose = true);
+        If both wxLogGui#m_bErrors and this member are false, there are only
+        informational messages to be shown.
+     */
+    bool m_bWarnings;
 
     /**
-        Suspends the logging until Resume() is called. Note that
-        the latter must be called the same number of times as the former to undo it,
-        i.e. if you call Suspend() twice you must call Resume() twice as well.
-        Note that suspending the logging means that the log sink won't be be flushed
-        periodically, it doesn't have any effect if the current log target does the
-        logging immediately without waiting for Flush() to be
-        called (the standard GUI log target only shows the log dialog when it is
-        flushed, so Suspend() works as expected with it).
-
-        @see Resume(), wxLogNull
-    */
-    static void Suspend();
-};
-
-
+        True if there any messages to be shown to the user.
 
-/**
-    @class wxLogNull
+        This variable is used instead of simply checking whether
+        wxLogGui#m_aMessages array is empty to allow blocking further calls to
+        Flush() while a log dialog is already being shown, even if the messages
+        array hasn't been emptied yet.
+     */
+    bool m_bHasMessages;
 
-    This class allows you to temporarily suspend logging. All calls to the log
-    functions during the life time of an object of this class are just ignored.
+private:
+    /**
+        Method called by Flush() to show a single log message.
 
-    In particular, it can be used to suppress the log messages given by wxWidgets
-    itself but it should be noted that it is rarely the best way to cope with this
-    problem as @b all log messages are suppressed, even if they indicate a
-    completely different error than the one the programmer wanted to suppress.
+        This function can be overridden to show the message in a different way.
+        By default a simple wxMessageBox() call is used.
 
-    For instance, the example of the overview:
+        @param message
+            The message to show (it can contain multiple lines).
+        @param title
+            The suggested title for the dialog showing the message, see
+            GetTitle().
+        @param style
+            One of @c wxICON_XXX constants, see GetSeverityIcon().
+     */
+    virtual void DoShowSingleLogMessage(const wxString& message,
+                                        const wxString& title,
+                                        int style);
 
-    @code
-    wxFile file;
+    /**
+        Method called by Flush() to show multiple log messages.
 
-      // wxFile.Open() normally complains if file can't be opened, we don't want it
-      {
-        wxLogNull logNo;
-        if ( !file.Open("bar") )
-          ... process error ourselves ...
-      } // ~wxLogNull called, old log sink restored
+        This function can be overridden to show the messages in a different way.
+        By default a special log dialog showing the most recent message and
+        allowing the user to expand it to view the previously logged ones is
+        used.
 
-      wxLogMessage("..."); // ok
-    @endcode
+        @param messages
+            Array of messages to show; it contains more than one element.
+        @param severities
+            Array of message severities containing @c wxLOG_XXX values.
+        @param times
+            Array of time_t values indicating when each message was logged.
+        @param title
+            The suggested title for the dialog showing the message, see
+            GetTitle().
+        @param style
+            One of @c wxICON_XXX constants, see GetSeverityIcon().
+     */
+    virtual void DoShowMultipleLogMessages(const wxArrayString& messages,
+                                           const wxArrayInt& severities,
+                                           const wxArrayLong& times,
+                                           const wxString& title,
+                                           int style);
+};
 
-    would be better written as:
 
-    @code
-    wxFile file;
 
-      // don't try to open file if it doesn't exist, we are prepared to deal with
-      // this ourselves - but all other errors are not expected
-      if ( wxFile::Exists("bar") )
-      {
-          // gives an error message if the file couldn't be opened
-          file.Open("bar");
-      }
-      else
-      {
-          ...
-      }
-    @endcode
+/**
+    @class wxLogTextCtrl
 
+    Using these target all the log messages can be redirected to a text control.
+    The text control must have been created with @c wxTE_MULTILINE style by the
+    caller previously.
 
-    @library{wxbase}
+    @library{wxcore}
     @category{logging}
+
+    @see wxTextCtrl, wxStreamToTextRedirector
 */
-class wxLogNull : public wxLog
+class wxLogTextCtrl : public wxLog
 {
 public:
     /**
-        Suspends logging.
-    */
-    wxLogNull();
-
-    /**
-        Resumes logging.
+        Constructs a log target which sends all the log messages to the given text
+        control. The @a textctrl parameter cannot be @NULL.
     */
+    wxLogTextCtrl(wxTextCtrl* pTextCtrl);
 };
 
 
+#endif // wxUSE_GUI
+
+#if wxUSE_BASE
+
 
 // ============================================================================
 // Global functions/macros
 // ============================================================================
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 
 /**
@@ -975,7 +1232,19 @@ const wxChar* wxSysErrorMsg(unsigned long errCode = 0);
 
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
+//@{
+/**
+    Logs a message with the given wxLogLevel.
+    E.g. using @c wxLOG_Message as first argument, this function behaves like wxLogMessage().
+
+    @header{wx/log.h}
+*/
+void wxLogGeneric(wxLogLevel level, const char* formatString, ... );
+void wxVLogGeneric(wxLogLevel level, const char* formatString, va_list argPtr);
+//@}
+
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     For all normal, informational messages. They also appear in a message box
@@ -987,7 +1256,7 @@ void wxLogMessage(const char* formatString, ... );
 void wxVLogMessage(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     For verbose output. Normally, it is suppressed, but might be activated if
@@ -1000,7 +1269,7 @@ void wxLogVerbose(const char* formatString, ... );
 void wxVLogVerbose(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     For warnings - they are also normally shown to the user, but don't
@@ -1012,7 +1281,7 @@ void wxLogWarning(const char* formatString, ... );
 void wxVLogWarning(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     Like wxLogError(), but also terminates the program with the exit code 3.
@@ -1025,7 +1294,7 @@ void wxLogFatalError(const char* formatString, ... );
 void wxVLogFatalError(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     The functions to use for error messages, i.e. the messages that must be
@@ -1038,38 +1307,25 @@ void wxLogError(const char* formatString, ... );
 void wxVLogError(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
-    Like wxLogDebug(), trace functions only do something in debug builds and
-    expand to nothing in the release one. The reason for making it a separate
-    function is that usually there are a lot of trace messages, so it might
-    make sense to separate them from other debug messages.
+    Log a message at @c wxLOG_Trace log level (see ::wxLogLevelValues enum).
 
-    wxLogDebug(const char*,const char*,...) and
-    wxLogDebug(wxTraceMask,const char*,...) can be used instead if you would
-    like to be able to separate trace messages into different categories which
-    can be enabled or disabled with the static functions provided in wxLog.
-
-    @header{wx/log.h}
-*/
-void wxLogTrace(const char* formatString, ... );
-void wxVLogTrace(const char* formatString, va_list argPtr);
-//@}
+    Notice that the use of trace masks is not recommended any more as setting
+    the log components (please see @ref overview_log_enable) provides a way to
+    do the same thing for log messages of any level, and not just the tracing
+    ones.
 
-/** @ingroup group_funcmacro_log */
-//@{
-/**
     Like wxLogDebug(), trace functions only do something in debug builds and
     expand to nothing in the release one. The reason for making it a separate
     function is that usually there are a lot of trace messages, so it might
     make sense to separate them from other debug messages.
 
-    In this version of wxLogTrace(), trace messages can be separated into
-    different categories and calls using this function only log the message if
-    the given @a mask is currently enabled in wxLog. This lets you selectively
-    trace only some operations and not others by enabling the desired trace
-    masks with wxLog::AddTraceMask() or by setting the
+    Trace messages can be separated into different categories; these functions in facts
+    only log the message if the given @a mask is currently enabled in wxLog. 
+    This lets you selectively trace only some operations and not others by enabling the 
+    desired trace masks with wxLog::AddTraceMask() or by setting the
     @ref overview_envvars "@c WXTRACE environment variable".
 
     The predefined string trace masks used by wxWidgets are:
@@ -1082,25 +1338,13 @@ void wxVLogTrace(const char* formatString, va_list argPtr);
     @itemdef{ wxTRACE_OleCalls, Trace OLE method calls (Win32 only) }
     @endDefList
 
-    @note Since both the mask and the format string are strings, this might
-          lead to function signature confusion in some cases: if you intend to
-          call the format string only version of wxLogTrace(), add a "%s"
-          format string parameter and then supply a second string parameter for
-          that "%s", the string mask version of wxLogTrace() will erroneously
-          get called instead, since you are supplying two string parameters to
-          the function. In this case you'll unfortunately have to avoid having
-          two leading string parameters, e.g. by adding a bogus integer (with
-          its "%d" format string).
-
     @header{wx/log.h}
 */
 void wxLogTrace(const char* mask, const char* formatString, ... );
-void wxVLogTrace(const char* mask,
-                  const char* formatString,
-                  va_list argPtr);
+void wxVLogTrace(const char* mask, const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     Like wxLogDebug(), trace functions only do something in debug builds and
@@ -1108,10 +1352,11 @@ void wxVLogTrace(const char* mask,
     function is that usually there are a lot of trace messages, so it might
     make sense to separate them from other debug messages.
 
+    @deprecated
     This version of wxLogTrace() only logs the message if all the bits
     corresponding to the @a mask are set in the wxLog trace mask which can be
     set by calling wxLog::SetTraceMask(). This version is less flexible than
-    wxLogDebug(const char*,const char*,...) because it doesn't allow defining
+    wxLogTrace(const char*,const char*,...) because it doesn't allow defining
     the user trace masks easily. This is why it is deprecated in favour of
     using string trace masks.
 
@@ -1131,7 +1376,7 @@ void wxLogTrace(wxTraceMask mask, const char* formatString, ... );
 void wxVLogTrace(wxTraceMask mask, const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     The right functions for debug output. They only do something in debug mode
@@ -1144,7 +1389,7 @@ void wxLogDebug(const char* formatString, ... );
 void wxVLogDebug(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     Messages logged by this function will appear in the statusbar of the
@@ -1161,12 +1406,12 @@ void wxLogStatus(const char* formatString, ... );
 void wxVLogStatus(const char* formatString, va_list argPtr);
 //@}
 
-/** @ingroup group_funcmacro_log */
+/** @addtogroup group_funcmacro_log */
 //@{
 /**
     Mostly used by wxWidgets itself, but might be handy for logging errors
     after system call (API function) failure. It logs the specified message
-    text as well as the last system error code (@e errno or @e ::GetLastError()
+    text as well as the last system error code (@e errno or @e GetLastError()
     depending on the platform) and the corresponding error message. The second
     form of this function takes the error code explicitly as the first
     argument.
@@ -1179,3 +1424,25 @@ void wxLogSysError(const char* formatString, ... );
 void wxVLogSysError(const char* formatString, va_list argPtr);
 //@}
 
+/** @addtogroup group_funcmacro_debug */
+//@{
+
+/**
+    @def wxDISABLE_DEBUG_LOGGING_IN_RELEASE_BUILD()
+
+    Use this macro to disable logging at debug and trace levels in release
+    build when not using wxIMPLEMENT_APP().
+
+    @see wxDISABLE_DEBUG_SUPPORT(),
+         wxDISABLE_ASSERTS_IN_RELEASE_BUILD(),
+         @ref overview_debugging
+
+    @since 2.9.1
+
+    @header{wx/log.h}
+ */
+#define wxDISABLE_DEBUG_LOGGING_IN_RELEASE_BUILD()
+
+//@}
+
+#endif // wxUSE_BASE