1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <log4cxx/logger.h>
#include <log4cxx/xml/domconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <apr_general.h>
#include <apr_time.h>
#include <iostream>
#include <log4cxx/stream.h>
#include <exception>
#include <stdlib.h>
using namespace log4cxx;
using namespace log4cxx::helpers;
/**
This test program sits in a loop and logs things. Its logging is
configured by a configuration file. Changes to this configuration
file are monitored and when a change occurs, the config file is re-read.
*/
class DelayedLoop
{
static LoggerPtr logger;
public:
static void main(int argc, const char * const argv[])
{
if(argc == 2)
{
init(argv[1]);
}
else
{
usage(argv[0], "Wrong number of arguments.");
}
test();
}
static void usage(const char * programName, const char * msg)
{
std::cout << msg << std::endl;
std::cout << "Usage: " << programName <<
" configFile" << std::endl;
exit(1);
}
static void init(const std::string& configFile)
{
if(configFile.length() > 4 &&
configFile.substr(configFile.length() - 4) == ".xml")
{
#if APR_HAS_THREADS
xml::DOMConfigurator::configureAndWatch(configFile, 3000);
#else
xml::DOMConfigurator::configure(configFile);
#endif
}
else
{
#if APR_HAS_THREADS
PropertyConfigurator::configureAndWatch(configFile, 3000);
#else
PropertyConfigurator::configure(configFile);
#endif
}
}
static void test()
{
int i = 0;
while(true)
{
LOG4CXX_DEBUG(logger, "MSG " << i++);
try
{
apr_sleep(1000000);
}
catch(std::exception& e)
{
}
}
}
};
LoggerPtr DelayedLoop::logger = Logger::getLogger("DelayedLoop");
int main(int argc, const char * const argv[])
{
apr_app_initialize(&argc, &argv, NULL);
int result = EXIT_SUCCESS;
try
{
DelayedLoop::main(argc, argv);
}
catch(std::exception&)
{
result = EXIT_FAILURE;
}
apr_terminate();
return result;
}
|