test_logrotate.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:5k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_logrotate.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:42:45  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_logrotate.cpp,v 1000.1 2004/06/01 19:42:45 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Author:  Aaron Ucko, NCBI
  35.  *
  36.  * File Description:
  37.  *   Test for log rotation
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <corelib/ncbi_system.hpp>
  45. #include <util/logrotate.hpp>
  46. #include <stdlib.h>
  47. #ifdef NCBI_OS_UNIX
  48. #  include <signal.h>
  49. #  include <unistd.h>
  50. #endif
  51. #include <test/test_assert.h> // must be last
  52. USING_NCBI_SCOPE;
  53. /////////////////////////////////////////////////////////////////////////////
  54. //  CTestLogrotateApplication::
  55. // defined here so SIGHUP can kick it
  56. static auto_ptr<CRotatingLogStream> s_LogStream;
  57. #ifdef NCBI_OS_UNIX
  58. static volatile int s_Signal = 0;
  59. extern "C" {
  60.     static void s_SignalHandler(int signum)
  61.     {
  62.         s_Signal = signum;
  63.     }
  64. }
  65. #endif
  66. class CTestLogrotateApplication : public CNcbiApplication
  67. {
  68.     virtual void Init(void);
  69.     virtual int  Run(void);
  70.     virtual void Exit(void);
  71. };
  72. void CTestLogrotateApplication::Init(void)
  73. {
  74.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  75.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  76.                               "Test of log rotation");
  77.     arg_desc->AddDefaultKey
  78.         ("limit", "N",
  79.          "Approximate maximum length between rotations, in bytes",
  80.          CArgDescriptions::eInteger, "16384");
  81.     SetupArgDescriptions(arg_desc.release());
  82. }
  83. static unsigned int s_Rand(unsigned int limit)
  84. {
  85.     return (rand() >> 5) % limit;
  86. }
  87. int CTestLogrotateApplication::Run(void)
  88. {
  89.     CArgs  args = GetArgs();
  90.     string me   = GetArguments().GetProgramBasename();
  91.     s_LogStream.reset(new CRotatingLogStream(me + ".log",
  92.                                              args["limit"].AsInteger()));
  93.     SetDiagStream(s_LogStream.get());
  94.     // enable verbose diagnostics for best effect
  95.     SetDiagPostLevel(eDiag_Info);
  96.     SetDiagTrace(eDT_Enable);
  97.     SetDiagPostFlag(eDPF_All);
  98. #ifdef NCBI_OS_UNIX
  99.     {{
  100.         struct sigaction sa;
  101.         memset(&sa, 0, sizeof(sa));
  102.         sa.sa_handler = s_SignalHandler;
  103.         sa.sa_flags   = SA_RESTART;
  104.         sigaction(SIGHUP, &sa, 0);
  105.     }}
  106.     me += '/' + NStr::IntToString(getpid());
  107. #endif
  108.     SetDiagPostPrefix(me.c_str());
  109.     srand(time(0));
  110.     for (unsigned int n = 0;  n < 1000000;  ++n) {
  111.         static const char* messages[] = { "foo", "bar", "baz", "quux" };
  112.         EDiagSev    severity = (EDiagSev)(s_Rand(eDiag_Fatal));
  113.         ErrCode     errcode(rand(), rand());
  114.         const char* message  = messages[s_Rand(4)];
  115.         CNcbiDiag(__FILE__, __LINE__, severity) << errcode << message << Endm;
  116.         SleepMilliSec(s_Rand(256));
  117. #ifdef NCBI_OS_UNIX
  118.         if (s_Signal) {
  119.             LOG_POST("Received signal " << s_Signal << "; rotating logs");
  120.             s_LogStream->Rotate();
  121.             LOG_POST("Done rotating logs");
  122.         }
  123.         s_Signal = 0;
  124. #endif
  125.     }
  126.     
  127.     return 0;
  128. }
  129. /////////////////////////////////////////////////////////////////////////////
  130. //  Cleanup
  131. void CTestLogrotateApplication::Exit(void)
  132. {
  133.     SetDiagStream(0);
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. //  MAIN
  137. int main(int argc, const char* argv[])
  138. {
  139.     // Execute main application function
  140.     return CTestLogrotateApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  141. }
  142. /*
  143.  * ===========================================================================
  144.  * $Log: test_logrotate.cpp,v $
  145.  * Revision 1000.1  2004/06/01 19:42:45  gouriano
  146.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  147.  *
  148.  * Revision 1.3  2004/05/17 21:09:26  gorelenk
  149.  * Added include of PCH ncbi_pch.hpp
  150.  *
  151.  * Revision 1.2  2002/12/30 20:56:18  ucko
  152.  * Bound the main loop to avoid "statement is unreachable" warnings.
  153.  *
  154.  * Revision 1.1  2002/11/25 17:21:01  ucko
  155.  * Add support for automatic log rotation (CRotatingLogStream)
  156.  *
  157.  *
  158.  * ===========================================================================
  159.  */