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
|
#ifndef QPID_LOG_LOGGER_H
#define QPID_LOG_LOGGER_H
/*
* 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 "qpid/log/Selector.h"
#include "qpid/log/Options.h"
#include "qpid/sys/Mutex.h"
#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/noncopyable.hpp>
#include <set>
#include "qpid/CommonImportExport.h"
namespace qpid {
namespace log {
/**
* Central logging agent.
*
* Thread safe, singleton.
*
* The Logger provides all needed functionality for selecting and
* formatting logging output. The actual outputting of log records
* is handled by Logger::Output-derived classes instantiated by the
* platform's sink-related options.
*/
class Logger : private boost::noncopyable {
public:
/** Flags indicating what to include in the log output */
enum FormatFlag { FILE=1, LINE=2, FUNCTION=4, LEVEL=8, TIME=16, THREAD=32};
/**
* Logging output sink.
*
* The Output sink provides an interface to direct logging output to.
* Logging sinks are primarily platform-specific as provided for on
* each platform.
*
* Implementations of Output must be thread safe.
*/
class Output {
public:
QPID_COMMON_EXTERN Output();
QPID_COMMON_EXTERN virtual ~Output();
/** Receives the statemnt of origin and formatted message to log. */
virtual void log(const Statement&, const std::string&) =0;
};
QPID_COMMON_EXTERN static Logger& instance();
QPID_COMMON_EXTERN Logger();
QPID_COMMON_EXTERN ~Logger();
/** Select the messages to be logged. */
QPID_COMMON_EXTERN void select(const Selector& s);
/** Set the formatting flags, bitwise OR of FormatFlag values. */
QPID_COMMON_EXTERN void format(int formatFlags);
/** Set format flags from options object.
*@returns computed flags.
*/
QPID_COMMON_EXTERN int format(const Options&);
/** Configure logger from Options */
QPID_COMMON_EXTERN void configure(const Options& o);
/** Add a statement. */
QPID_COMMON_EXTERN void add(Statement& s);
/** Log a message. */
QPID_COMMON_EXTERN void log(const Statement&, const std::string&);
/** Add an output destination for messages */
QPID_COMMON_EXTERN void output(std::auto_ptr<Output> out);
/** Set a prefix for all messages */
QPID_COMMON_EXTERN void setPrefix(const std::string& prefix);
/** Reset the logger. */
QPID_COMMON_EXTERN void clear();
/** Get the options used to configure the logger. */
QPID_COMMON_EXTERN const Options& getOptions() const { return options; }
private:
typedef boost::ptr_vector<Output> Outputs;
typedef std::set<Statement*> Statements;
sys::Mutex lock;
inline void enable_unlocked(Statement* s);
Statements statements;
Outputs outputs;
Selector selector;
int flags;
std::string prefix;
Options options;
};
}} // namespace qpid::log
#endif /*!QPID_LOG_LOGGER_H*/
|