ACE/FAQ/APG/Logging

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
ViGOur (Обсуждение | вклад)
(Новая страница: «__TOC__ Категория:ACE FAQ == Callback.h == <source lang="cpp"> // $Id: Callback.h 80826 2008-03-04 14:51:23Z wotte $ #ifndef APG_CALLBACK_H #define AP…»)

Текущая версия на 18:52, 6 февраля 2012

Содержание


[править] Callback.h

// $Id: Callback.h 80826 2008-03-04 14:51:23Z wotte $
 
#ifndef APG_CALLBACK_H
#define APG_CALLBACK_H
 
#include "ace/streams.h"
#include "ace/Log_Msg.h"
#include "ace/Log_Msg_Callback.h"
#include "ace/Log_Record.h"
 
class Callback : public ACE_Log_Msg_Callback
{
public:
  void log (ACE_Log_Record &log_record) {
#  if defined (ACE_LACKS_IOSTREAM_TOTALLY)
    log_record.print (ACE_TEXT (""), 0, stderr);
    log_record.print (ACE_TEXT (""), ACE_Log_Msg::VERBOSE, stderr);
#  else
    log_record.print (ACE_TEXT (""), 0, cerr);
    log_record.print (ACE_TEXT (""), ACE_Log_Msg::VERBOSE, cerr);
#  endif /* ACE_LACKS_IOSTREAM_TOTALLY */
  }
};
 
#endif /* APG_CALLBACK_H */

[править] Callback-2.h

// $Id: Callback-2.h 81978 2008-06-16 16:57:12Z sowayaa $
 
#ifndef APG_CALLBACK2_H
#define APG_CALLBACK2_H
 
#include "ace/OS_NS_time.h"
#include "ace/streams.h"
#include "ace/Log_Msg_Callback.h"
#include "ace/Log_Record.h"
#include "ace/SString.h"
#include "ace/Time_Value.h"
 
class Callback : public ACE_Log_Msg_Callback
{
public:
  void log (ACE_Log_Record &log_record)
    {
      cerr << "Log Message Received:" << endl;
      unsigned long msg_severity = log_record.type ();
      ACE_Log_Priority prio =
        static_cast<ACE_Log_Priority> (msg_severity);
      const ACE_TCHAR *prio_name =
        ACE_Log_Record::priority_name (prio);
      cerr << "\tType:        "
           << ACE_TEXT_ALWAYS_CHAR (prio_name)
           << endl;
 
      cerr << "\tLength:      " << log_record.length () << endl;
 
      const time_t epoch = log_record.time_stamp ().sec ();
      cerr << "\tTime_Stamp:  "
           << ACE_TEXT_ALWAYS_CHAR (ACE_OS::ctime (&epoch))
           << flush;
 
      cerr << "\tPid:         " << log_record.pid () << endl;
 
      ACE_CString data (">> ");
      data += ACE_TEXT_ALWAYS_CHAR (log_record.msg_data ());
 
      cerr << "\tMsgData:     " << data.c_str () << endl;
    }
};
 
#endif /* APG_CALLBACK2_H */

[править] Callback-3.h

// $Id: Callback-3.h 91762 2010-09-14 12:08:05Z shuston $
 
#ifndef APG_CALLBACK3_H
#define APG_CALLBACK3_H
 
#include "ace/streams.h"
#include "ace/CDR_Stream.h"
#include "ace/Log_Msg.h"
#include "ace/Log_Msg_Callback.h"
#include "ace/Log_Record.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
 
#define LOGGER_PORT 20009
 
class Callback : public ACE_Log_Msg_Callback
{
public:
  Callback ()
    {
      this->logger_ = new ACE_SOCK_Stream;
      ACE_SOCK_Connector connector;
      ACE_INET_Addr addr (LOGGER_PORT, ACE_DEFAULT_SERVER_HOST);
 
      if (connector.connect (*(this->logger_), addr) == -1)
        {
          delete this->logger_;
          this->logger_ = 0;
        }
    }
 
  virtual ~Callback ()
    {
      if (this->logger_)
        {
          this->logger_->close ();
        }
      delete this->logger_;
    }
 
  void log (ACE_Log_Record &log_record)
    {
      if (!this->logger_)
        {
#  if defined (ACE_LACKS_IOSTREAM_TOTALLY)
          log_record.print (ACE_TEXT (""), ACE_Log_Msg::VERBOSE, stderr);
#  else
          log_record.print(ACE_TEXT (""), ACE_Log_Msg::VERBOSE, cerr);
#  endif /* ACE_LACKS_IOSTREAM_TOTALLY */
          return;
        }
 
      ACE_OutputCDR cdr;
      cdr << log_record;
      if (this->logger_->send_n (cdr.begin ()) == -1)
        {
          delete this->logger_;
          this->logger_ = 0;
        }
    }
 
private:
  ACE_SOCK_Stream *logger_;
};
 
#endif /* APG_CALLBACK3_H */

[править] Trace.h

// $Id: Trace.h 92376 2010-10-27 17:52:49Z johnnyw $
 
#ifndef TRACE_H
#define TRACE_H
 
#include "ace/Log_Msg.h"
 
// Listing 1 code/ch03
class Trace
{
public:
  Trace (const ACE_TCHAR *prefix,
   const ACE_TCHAR *name,
   int line,
   const ACE_TCHAR *file)
    {
      this->prefix_ = prefix;
      this->name_   = name;
      this->line_   = line;
      this->file_   = file;
 
      ACE_Log_Msg *lm = ACE_LOG_MSG;
      if (lm->tracing_enabled ()
          && lm->trace_active () == 0)
        {
          lm->trace_active (1);
          ACE_DEBUG
            ((LM_TRACE,
              ACE_TEXT ("%s%*s(%t) calling %s in file `%s'")
              ACE_TEXT (" on line %d\n"),
              this->prefix_,
              Trace::nesting_indent_ * lm->inc (),
              ACE_TEXT (""),
              this->name_,
              this->file_,
              this->line_));
          lm->trace_active (0);
        }
    }
 
  void setLine (int line)
    {
      this->line_ = line;
    }
 
  ~Trace (void)
    {
      ACE_Log_Msg *lm = ACE_LOG_MSG;
      if (lm->tracing_enabled ()
          && lm->trace_active () == 0)
        {
          lm->trace_active (1);
          ACE_DEBUG
            ((LM_TRACE,
              ACE_TEXT ("%s%*s(%t) leaving %s in file `%s'")
              ACE_TEXT (" on line %d\n"),
              this->prefix_,
              Trace::nesting_indent_ * lm->dec (),
              ACE_TEXT (""),
              this->name_,
              this->file_,
              this->line_));
          lm->trace_active (0);
        }
    }
 
private:
  enum { nesting_indent_ = 3 };
 
  const ACE_TCHAR *prefix_;
  const ACE_TCHAR *name_;
  const ACE_TCHAR *file_;
  int line_;
};
// Listing 1
 
// Listing 2 code/ch03
#define TRACE_PREFIX       ACE_TEXT ("TRACE ")
 
#if defined (TRACE)
#undef TRACE
#endif /* TRACE */
 
#if (ACE_NTRACE == 1)
#    define TRACE(X)
#    define TRACE_RETURN(V)     return V;
#    define TRACE_RETURN_VOID()
#else
#    define TRACE(X)                           \
            Trace ____ (TRACE_PREFIX,          \
                        ACE_TEXT (X),          \
                        __LINE__,              \
                        ACE_TEXT (__FILE__))
 
#    define TRACE_RETURN(V)                    \
            do { ____.setLine(__LINE__); return V; } while (0)
 
#    define TRACE_RETURN_VOID()                \
            do { ____.setLine(__LINE__); } while (0)
#endif
// Listing 2
 
//////////////////////////////////////////////////
 
// Listing 3 code/ch03
 
#define DEBUG_PREFIX       ACE_TEXT ("DEBUG%I")
#define INFO_PREFIX        ACE_TEXT ("INFO%I")
#define NOTICE_PREFIX      ACE_TEXT ("NOTICE%I")
#define WARNING_PREFIX     ACE_TEXT ("WARNING%I")
#define ERROR_PREFIX       ACE_TEXT ("ERROR%I")
#define CRITICAL_PREFIX    ACE_TEXT ("CRITICAL%I")
#define ALERT_PREFIX       ACE_TEXT ("ALERT%I")
#define EMERGENCY_PREFIX   ACE_TEXT ("EMERGENCY%I")
 
#define MY_DEBUG(X)     \
        ACE_DEBUG(( LM_DEBUG,  \
                    DEBUG_PREFIX \
                    X))
#define MY_INFO(X)     \
        ACE_DEBUG(( LM_INFO,  \
                    INFO_PREFIX \
                    X))
#define MY_NOTICE(X)     \
        ACE_DEBUG(( LM_NOTICE,  \
                    NOTICE_PREFIX \
                    X))
#define MY_WARNING(X)     \
        ACE_DEBUG(( LM_WARNING,  \
                    WARNING_PREFIX \
                    X))
#define MY_ERROR(X)     \
        ACE_DEBUG(( LM_ERROR,  \
                    ERROR_PREFIX \
                    X))
#define MY_CRITICAL(X)     \
        ACE_DEBUG(( LM_CRITICAL,  \
                    CRITICAL_PREFIX \
                    X))
#define MY_ALERT(X)     \
        ACE_DEBUG(( LM_ALERT,  \
                    ALERT_PREFIX \
                    X))
#define MY_EMERGENCY(X)     \
        ACE_DEBUG(( LM_EMERGENCY,  \
                    EMERGENCY_PREFIX \
                    X))
// Listing 3
 
#endif /* TRACE_H */

[править] LogManager.h

// $Id: LogManager.h 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/streams.h"
#include "ace/Synch.h"
#include "ace/Singleton.h"
#include "ace/Log_Msg.h"
#include "ace/Log_Msg_Callback.h"
 
#ifndef LOG_MANAGER_H
#define LOG_MANAGER_H
 
// Listing 1 code/ch03
class LogManager
{
public:
  LogManager ();
  ~LogManager ();
 
  void redirectToDaemon
    (const ACE_TCHAR *prog_name = ACE_TEXT (""));
  void redirectToSyslog
    (const ACE_TCHAR *prog_name = ACE_TEXT (""));
  void redirectToOStream (ACE_OSTREAM_TYPE *output);
  void redirectToFile (const char *filename);
  void redirectToStderr (void);
  ACE_Log_Msg_Callback * redirectToCallback
    (ACE_Log_Msg_Callback *callback);
 
  // Exclude 1
private:
  ofstream *log_stream_;
  ACE_OSTREAM_TYPE *output_stream_;
  // Exclude 1
};
// Listing 1
 
// Listing 2 code/ch03
LogManager::LogManager ()
  : log_stream_ (0), output_stream_ (0)
{ }
 
LogManager::~LogManager ()
{
  if (log_stream_)
    log_stream_->close ();
  delete log_stream_;
}
 
void LogManager::redirectToSyslog (const ACE_TCHAR *prog_name)
{
  ACE_LOG_MSG->open (prog_name, ACE_Log_Msg::SYSLOG, prog_name);
}
 
void LogManager::redirectToDaemon (const ACE_TCHAR *prog_name)
{
  ACE_LOG_MSG->open (prog_name, ACE_Log_Msg::LOGGER,
                     ACE_DEFAULT_LOGGER_KEY);
}
 
void LogManager::redirectToOStream (ACE_OSTREAM_TYPE *output)
{
  output_stream_ = output;
  ACE_LOG_MSG->msg_ostream (this->output_stream_);
  ACE_LOG_MSG->clr_flags
    (ACE_Log_Msg::STDERR | ACE_Log_Msg::LOGGER);
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
}
 
void LogManager::redirectToFile (const char *filename)
{
  log_stream_ = new ofstream ();
  log_stream_->open (filename, ios::out | ios::app);
  this->redirectToOStream ((ACE_OSTREAM_TYPE *)log_stream_);
}
 
void LogManager::redirectToStderr (void)
{
  ACE_LOG_MSG->clr_flags
    (ACE_Log_Msg::OSTREAM | ACE_Log_Msg::LOGGER);
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::STDERR);
}
 
ACE_Log_Msg_Callback *
LogManager::redirectToCallback (ACE_Log_Msg_Callback * callback)
{
  ACE_Log_Msg_Callback *previous =
    ACE_LOG_MSG->msg_callback (callback);
  if (callback == 0)
    ACE_LOG_MSG->clr_flags (ACE_Log_Msg::MSG_CALLBACK);
  else
    ACE_LOG_MSG->set_flags (ACE_Log_Msg::MSG_CALLBACK);
  return previous;
}
// Listing 2
 
// Listing 3 code/ch03
typedef ACE_Singleton<LogManager, ACE_Null_Mutex>
        LogManagerSingleton;
#define LOG_MANAGER LogManagerSingleton::instance()
// Listing 3
 
#endif /* LOG_MANAGER_H */

[править] Log_Msg_Alt.h

// $Id: Log_Msg_Alt.h 80826 2008-03-04 14:51:23Z wotte $
 
#ifndef LOG_MSG_ALT_H
#define LOG_MSG_ALT_H
 
#include "ace/Log_Msg.h"
 
// Listing 1 code/ch03
#define MY_DEBUG      LM_DEBUG,     ACE_TEXT ("DEBUG%I")
#define MY_INFO       LM_INFO,      ACE_TEXT ("INFO%I")
#define MY_NOTICE     LM_NOTICE,    ACE_TEXT ("NOTICE%I")
#define MY_WARNING    LM_WARNING,   ACE_TEXT ("WARNING%I")
#define MY_ERROR      LM_ERROR,     ACE_TEXT ("ERROR%I")
#define MY_CRITICAL   LM_CRITICAL,  ACE_TEXT ("CRITICAL%I")
#define MY_ALERT      LM_ALERT,     ACE_TEXT ("ALERT%I")
#define MY_EMERGENCY  LM_EMERGENCY, ACE_TEXT ("EMERGENCY%I")
// Listing 1
 
#endif /* LOG_ALT_H */

[править] Change Instance Default

/**
 * $Id: Change_Instance_Default.cpp 91813 2010-09-17 07:52:52Z johnnyw $
 *
 * Sample code from The ACE Programmer's Guide,
 * Copyright 2003 Addison-Wesley. All Rights Reserved.
 *
 * This code shows how to set the ACE_Log_Msg per-instance default
 * differently for groups of spawned threads.
 */
 
#include "ace/Log_Msg.h"
#include "ace/Thread_Manager.h"
 
ACE_THR_FUNC_RETURN worker (void *)
{
  // do some work
  return 0;
}
 
ACE_THR_FUNC_RETURN service (void *)
{
  // run the service
  return 0;
}
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  // Listing 1 code/ch03
  ACE_LOG_MSG->priority_mask (0, ACE_Log_Msg::PROCESS);
  ACE_Log_Msg::enable_debug_messages ();
  ACE_Thread_Manager::instance ()->spawn (service);
  ACE_Log_Msg::disable_debug_messages ();
  ACE_Thread_Manager::instance ()->spawn_n (3, worker);
  // Listing 1
  ACE_Thread_Manager::instance ()->wait ();
  return 0;
}

[править] Change Mask

// $Id: Change_Mask.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
 
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE ("main");
 
  // Listing 1 code/ch03
  ACE_LOG_MSG->priority_mask (0, ACE_Log_Msg::PROCESS);
  ACE_LOG_MSG->priority_mask (LM_DEBUG | LM_NOTICE,
                              ACE_Log_Msg::THREAD);
  // Listing 1
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom\n")));
  foo ();
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_NOTICE, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Howto Syslog

// $Id: Howto_Syslog.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
 
void foo (void);
 
// Listing 1 code/ch03
int ACE_TMAIN (int, ACE_TCHAR *argv[])
{
  ACE_LOG_MSG->open
    (argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT ("syslogTest"));
  // Listing 1
 
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
  foo ();
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Simple1

// $Id: Simple1.cpp 91813 2010-09-17 07:52:52Z johnnyw $
 
#include "ace/Log_Msg.h"
 
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE("main");
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom\n")));
  foo();
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Simple2

// $Id: Simple2.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
 
void foo(void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE ("main");
 
  ACE_LOG_MSG->priority_mask (LM_DEBUG | LM_NOTICE,
                              ACE_Log_Msg::PROCESS);
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom\n")));
  foo ();
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo(void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_NOTICE, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Trace Return

// $Id: Trace_Return.cpp 92385 2010-10-28 07:12:17Z johnnyw $
 
#include "Trace.h"
 
// Listing 1 code/ch03
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  TRACE ("main");
 
  MY_DEBUG (ACE_TEXT ("Hi Mom\n"));
  foo ();
  MY_DEBUG (ACE_TEXT ("Goodnight\n"));
 
  TRACE_RETURN (0);
}
 
void foo (void)
{
  TRACE ("foo");
  MY_DEBUG (ACE_TEXT ("Howdy Pardner\n"));
  TRACE_RETURN_VOID ();
}
// Listing 1

[править] Use Callback

// $Id: Use_Callback.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
#include "Callback.h"
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  Callback *callback = new Callback;
 
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::MSG_CALLBACK);
  ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
  ACE_LOG_MSG->msg_callback (callback);
 
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}

[править] Use Callback2

// $Id: Use_Callback2.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
#include "Callback-2.h"
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  Callback *callback = new Callback;
 
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::MSG_CALLBACK);
  ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
  ACE_LOG_MSG->msg_callback (callback);
 
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}

[править] Use LogManager

// $Id: Use_LogManager.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "LogManager.h"
 
// Listing 1 code/ch03
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  LOG_MANAGER->redirectToStderr ();
  ACE_TRACE ("main");
  LOG_MANAGER->redirectToSyslog ();
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHi Mom\n")));
  foo ();
  LOG_MANAGER->redirectToDaemon ();
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
void foo (void)
{
  ACE_TRACE ("foo");
  LOG_MANAGER->redirectToFile ("output.test");
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}
// Listing 1
 
// Listing 2 code/ch03
#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION)
template ACE_Singleton<LogManager, ACE_Null_Mutex> *
  ACE_Singleton<LogManager, ACE_Null_Mutex>::singleton_;
#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */
// Listing 2

[править] Use Logger

// $Id: Use_Logger.cpp 81978 2008-06-16 16:57:12Z sowayaa $
 
#include "ace/Log_Msg.h"
 
int ACE_TMAIN (int, ACE_TCHAR *argv[])
{
  ACE_LOG_MSG->open (argv[0],
                     ACE_Log_Msg::LOGGER,
                     ACE_DEFAULT_LOGGER_KEY);
 
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}

[править] Use Logging Server

// $Id: Use_Logging_Server.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
#include "Callback-3.h"
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  Callback *callback = new Callback;
 
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::MSG_CALLBACK);
  ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
  ACE_LOG_MSG->msg_callback (callback);
 
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}

[править] Use Logging Strategy

// $Id: Use_Logging_Strategy.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
#include "ace/Service_Config.h"
 
/*
  Put the following in your svc.conf:
 
  dynamic Logger Service_Object * ACE:_make_ACE_Logging_Strategy() "-s log.out -f STDERR|OSTREAM -p DEBUG|NOTICE"
 
  There seems to be a bug in ACE_Logging_Strategy in that the priority
  flags are not propagated to spawned threads.
*/
 
// Listing 1 code/ch03
int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  if (ACE_Service_Config::open (argc,
                                argv,
                                ACE_DEFAULT_LOGGER_KEY,
                                1,
                                0,
                                1) < 0)
    ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
                       ACE_TEXT ("Service Config open")),
                      1);
    ACE_TRACE ("main");
    ACE_DEBUG ((LM_NOTICE, ACE_TEXT ("%t%IHowdy Pardner\n")));
    ACE_DEBUG ((LM_INFO, ACE_TEXT ("%t%IGoodnight\n")));
 
    return 0;
}
// Listing 1

[править] Use Multiple Sinks

// $Id: Use_Multiple_Sinks.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
#include "ace/streams.h"
 
int ACE_TMAIN (int, ACE_TCHAR *argv[])
{
  // Output to default destination (stderr)
  ACE_LOG_MSG->open (argv[0]);
 
  ACE_TRACE ("main");
 
  ACE_OSTREAM_TYPE *output =
        (ACE_OSTREAM_TYPE *) new ofstream ("ostream.output.test");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IThis will go to STDERR\n")));
 
  ACE_LOG_MSG->open
    (argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT ("syslogTest"));
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::STDERR);
  ACE_DEBUG
    ((LM_DEBUG, ACE_TEXT ("%IThis goes to STDERR & syslog\n")));
 
  ACE_LOG_MSG->msg_ostream (output, 0);
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
  ACE_DEBUG ((LM_DEBUG,
              ACE_TEXT ("%IThis will go to STDERR, ")
              ACE_TEXT ("syslog & an ostream\n")));
 
  ACE_LOG_MSG->clr_flags (ACE_Log_Msg::OSTREAM);
  delete output;
 
  return 0;
}

[править] Use Ostream

// $Id: Use_Ostream.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
#include "ace/streams.h"
 
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
 
  /* Alternatively, you can use the set_flags() method to do the same
     thing after the singleton has been created:
  */
  // Listing 2 code/ch03
  ACE_OSTREAM_TYPE *output =
    (ACE_OSTREAM_TYPE *) new ofstream ("ostream.output.test");
  ACE_LOG_MSG->msg_ostream (output, 1);
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM);
  ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR);
  // Listing 2
 
  foo ();
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Use Stderr

// $Id: Use_Stderr.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
 
void foo (void);
 
// Listing 1 code/ch03
int ACE_TMAIN (int, ACE_TCHAR *argv[])
{
  // open() requires the name of the application
  // (e.g. -- argv[0]) because the underlying
  // implementation may use it in the log output.
  ACE_LOG_MSG->open (argv[0], ACE_Log_Msg::STDERR);
  // Listing 1
 
  /* Alternatively, you can use the set_flags() method to do the same
     thing after the singleton has been created:
  */
 
  ACE_TRACE ("main");
 
  // Listing 2 code/ch03
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
  ACE_LOG_MSG->set_flags (ACE_Log_Msg::STDERR);
  foo ();
  // Listing 2
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Use Syslog

// $Id: Use_Syslog.cpp 80826 2008-03-04 14:51:23Z wotte $
 
#include "ace/Log_Msg.h"
 
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *argv[])
{
  // This will be directed to stderr (the default ACE_Log_Msg
  // behavior).
  ACE_TRACE ("main");
 
  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("%IHi Mom\n")));
 
  // Everything from foo() will be directed to the system logger
  ACE_LOG_MSG->open
    (argv[0], ACE_Log_Msg::SYSLOG, ACE_TEXT ("syslogTest"));
  foo ();
 
  // Now we reset the log output to default (stderr)
  ACE_LOG_MSG->open (argv[0]);
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IGoodnight\n")));
 
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
 
  ACE_DEBUG ((LM_INFO, ACE_TEXT ("%IHowdy Pardner\n")));
}

[править] Wrap Macros

// $Id: Wrap_Macros.cpp 92385 2010-10-28 07:12:17Z johnnyw $
 
#include "Trace.h"
 
// Listing 1 code/ch03
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE ("main");
  MY_DEBUG (ACE_TEXT ("Hi Mom\n"));
  foo ();
  MY_DEBUG (ACE_TEXT ("Goodnight\n"));
  return 0;
}
 
void foo (void)
{
  ACE_TRACE ("foo");
  MY_DEBUG (ACE_TEXT ("Howdy Pardner\n"));
}
// Listing 1

[править] Wrap Macros Alt

// $Id: Wrap_Macros_Alt.cpp 91813 2010-09-17 07:52:52Z johnnyw $
 
#include "Log_Msg_Alt.h"
 
void foo (void);
 
int ACE_TMAIN (int, ACE_TCHAR *[])
{
  ACE_TRACE ("main");
 
  // Listing 1 code/ch03
  ACE_DEBUG ((MY_DEBUG ACE_TEXT ("Hi Mom\n")));
 
  ACE_DEBUG ((MY_DEBUG ACE_TEXT ("Goodnight\n")));
  // Listing 1
 
  return 0;
}