1/*
2 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24#ifndef SHARE_LOGGING_LOGDECORATORS_HPP
25#define SHARE_LOGGING_LOGDECORATORS_HPP
26
27#include "utilities/globalDefinitions.hpp"
28
29class outputStream;
30
31// The list of available decorators:
32// time - Current time and date in ISO-8601 format
33// uptime - Time since the start of the JVM in seconds and milliseconds (e.g., 6.567s)
34// timemillis - The same value as generated by System.currentTimeMillis()
35// uptimemillis - Milliseconds since the JVM started
36// timenanos - The same value as generated by System.nanoTime()
37// uptimenanos - Nanoseconds since the JVM started
38// hostname - The hostname
39// pid - The process identifier
40// tid - The thread identifier
41// level - The level associated with the log message
42// tags - The tag-set associated with the log message
43#define DECORATOR_LIST \
44 DECORATOR(time, t) \
45 DECORATOR(utctime, utc) \
46 DECORATOR(uptime, u) \
47 DECORATOR(timemillis, tm) \
48 DECORATOR(uptimemillis, um) \
49 DECORATOR(timenanos, tn) \
50 DECORATOR(uptimenanos, un) \
51 DECORATOR(hostname, hn) \
52 DECORATOR(pid, p) \
53 DECORATOR(tid, ti) \
54 DECORATOR(level, l) \
55 DECORATOR(tags, tg)
56
57// LogDecorators represents a selection of decorators that should be prepended to
58// each log message for a given output. Decorators are always prepended in the order
59// declared above. For example, logging with 'uptime, level, tags' decorators results in:
60// [0,943s][info ][logging] message.
61class LogDecorators {
62 public:
63 enum Decorator {
64#define DECORATOR(name, abbr) name##_decorator,
65 DECORATOR_LIST
66#undef DECORATOR
67 Count,
68 Invalid
69 };
70
71 private:
72 uint _decorators;
73 static const char* _name[][2];
74 static const uint DefaultDecoratorsMask = (1 << uptime_decorator) | (1 << level_decorator) | (1 << tags_decorator);
75
76 static uint mask(LogDecorators::Decorator decorator) {
77 return 1 << decorator;
78 }
79
80 LogDecorators(uint mask) : _decorators(mask) {
81 }
82
83 public:
84 static const LogDecorators None;
85
86 LogDecorators() : _decorators(DefaultDecoratorsMask) {
87 };
88
89 void clear() {
90 _decorators = 0;
91 }
92
93 static const char* name(LogDecorators::Decorator decorator) {
94 return _name[decorator][0];
95 }
96
97 static const char* abbreviation(LogDecorators::Decorator decorator) {
98 return _name[decorator][1];
99 }
100
101 static LogDecorators::Decorator from_string(const char* str);
102
103 void combine_with(const LogDecorators &source) {
104 _decorators |= source._decorators;
105 }
106
107 bool is_empty() const {
108 return _decorators == 0;
109 }
110
111 bool is_decorator(LogDecorators::Decorator decorator) const {
112 return (_decorators & mask(decorator)) != 0;
113 }
114
115 bool parse(const char* decorator_args, outputStream* errstream = NULL);
116};
117
118#endif // SHARE_LOGGING_LOGDECORATORS_HPP
119