hotspot/src/share/vm/logging/log.hpp
author pliden
Mon, 01 Feb 2016 22:11:16 +0100
changeset 35901 f5028c67e7cb
parent 35897 beba2418d973
child 36573 676134627feb
permissions -rw-r--r--
8147918: Rename develop_log_is_enabled() to log_develop_is_enabled() Reviewed-by: dholmes, brutisso
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     1
/*
35897
beba2418d973 8146793: logStream::write re-formats string
kbarrett
parents: 34252
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     4
 *
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     7
 * published by the Free Software Foundation.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     8
 *
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    13
 * accompanied this code).
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    14
 *
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    18
 *
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    21
 * questions.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    22
 *
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    23
 */
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    24
#ifndef SHARE_VM_LOGGING_LOG_HPP
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    25
#define SHARE_VM_LOGGING_LOG_HPP
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    26
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    27
#include "logging/logLevel.hpp"
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    28
#include "logging/logPrefix.hpp"
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    29
#include "logging/logTagSet.hpp"
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    30
#include "logging/logTag.hpp"
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    31
#include "memory/allocation.hpp"
33766
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
    32
#include "memory/allocation.inline.hpp"
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
    33
#include "runtime/os.hpp"
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    34
#include "utilities/debug.hpp"
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    35
#include "utilities/ostream.hpp"
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    36
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    37
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    38
// Logging macros
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    39
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    40
// Usage:
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    41
//   log_<level>(<comma separated log tags>)(<printf-style log arguments>);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    42
// e.g.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    43
//   log_debug(logging)("message %d", i);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    44
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    45
// Note that these macros will not evaluate the arguments unless the logging is enabled.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    46
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    47
#define log_error(...)   (!log_is_enabled(Error, __VA_ARGS__))   ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Error>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    48
#define log_warning(...) (!log_is_enabled(Warning, __VA_ARGS__)) ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Warning>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    49
#define log_info(...)    (!log_is_enabled(Info, __VA_ARGS__))    ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Info>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    50
#define log_debug(...)   (!log_is_enabled(Debug, __VA_ARGS__))   ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Debug>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    51
#define log_trace(...)   (!log_is_enabled(Trace, __VA_ARGS__))   ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Trace>
34252
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    52
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    53
// Macros for logging that should be excluded in product builds.
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    54
// Available for levels Info, Debug and Trace. Includes test macro that
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    55
// evaluates to false in product builds.
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    56
#ifndef PRODUCT
34252
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    57
#define log_develop_info(...)  (!log_is_enabled(Info, __VA_ARGS__))   ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Info>
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    58
#define log_develop_debug(...) (!log_is_enabled(Debug, __VA_ARGS__)) ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Debug>
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    59
#define log_develop_trace(...) (!log_is_enabled(Trace, __VA_ARGS__))  ? (void)0 : Log<LOG_TAGS(__VA_ARGS__)>::write<LogLevel::Trace>
35901
f5028c67e7cb 8147918: Rename develop_log_is_enabled() to log_develop_is_enabled()
pliden
parents: 35897
diff changeset
    60
#define log_develop_is_enabled(level, ...)  log_is_enabled(level, __VA_ARGS__)
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    61
#else
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    62
#define DUMMY_ARGUMENT_CONSUMER(...)
34252
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    63
#define log_develop_info(...)  DUMMY_ARGUMENT_CONSUMER
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    64
#define log_develop_debug(...) DUMMY_ARGUMENT_CONSUMER
59d76c40998a 8143229: Replace the develop level with develop macros in Unified Logging
mlarsson
parents: 34251
diff changeset
    65
#define log_develop_trace(...) DUMMY_ARGUMENT_CONSUMER
35901
f5028c67e7cb 8147918: Rename develop_log_is_enabled() to log_develop_is_enabled()
pliden
parents: 35897
diff changeset
    66
#define log_develop_is_enabled(...)  false
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    67
#endif
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    68
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    69
// Convenience macro to test if the logging is enabled on the specified level for given tags.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    70
#define log_is_enabled(level, ...) (Log<LOG_TAGS(__VA_ARGS__)>::is_level(LogLevel::level))
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    71
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    72
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    73
// Log class for more advanced logging scenarios.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    74
// Has printf-style member functions for each log level (trace(), debug(), etc).
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    75
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    76
// Also has outputStream compatible API for the different log-levels.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    77
// The streams are resource allocated when requested and are accessed through
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    78
// calls to <level>_stream() functions (trace_stream(), debug_stream(), etc).
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    79
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    80
// Example usage:
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    81
//   LogHandle(logging) log;
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    82
//   if (log.is_debug()) {
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    83
//     ...
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    84
//     log.debug("result = %d", result).trace(" tracing info");
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    85
//     obj->print_on(log.debug_stream());
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    86
//   }
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    87
//
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    88
#define LogHandle(...)  Log<LOG_TAGS(__VA_ARGS__)>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    89
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    90
template <LogTagType T0, LogTagType T1 = LogTag::__NO_TAG, LogTagType T2 = LogTag::__NO_TAG, LogTagType T3 = LogTag::__NO_TAG,
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    91
          LogTagType T4 = LogTag::__NO_TAG, LogTagType GuardTag = LogTag::__NO_TAG>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    92
class Log VALUE_OBJ_CLASS_SPEC {
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    93
 private:
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    94
  static const size_t LogBufferSize = 512;
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    95
 public:
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    96
  // Make sure no more than the maximum number of tags have been given.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    97
  // The GuardTag allows this to be detected if/when it happens. If the GuardTag
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    98
  // is not __NO_TAG, the number of tags given exceeds the maximum allowed.
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
    99
  STATIC_ASSERT(GuardTag == LogTag::__NO_TAG); // Number of logging tags exceeds maximum supported!
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   100
34251
0ce22a6d7d8c 8142483: Unified logging log instances cause warnings on windows when only static functions are used
mlarsson
parents: 33766
diff changeset
   101
  // Empty constructor to avoid warnings on MSVC about unused variables
0ce22a6d7d8c 8142483: Unified logging log instances cause warnings on windows when only static functions are used
mlarsson
parents: 33766
diff changeset
   102
  // when the log instance is only used for static functions.
0ce22a6d7d8c 8142483: Unified logging log instances cause warnings on windows when only static functions are used
mlarsson
parents: 33766
diff changeset
   103
  Log() {
0ce22a6d7d8c 8142483: Unified logging log instances cause warnings on windows when only static functions are used
mlarsson
parents: 33766
diff changeset
   104
  }
0ce22a6d7d8c 8142483: Unified logging log instances cause warnings on windows when only static functions are used
mlarsson
parents: 33766
diff changeset
   105
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   106
  static bool is_level(LogLevelType level) {
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   107
    return LogTagSetMapping<T0, T1, T2, T3, T4>::tagset().is_level(level);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   108
  }
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   109
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   110
  template <LogLevelType Level>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   111
  ATTRIBUTE_PRINTF(1, 2)
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   112
  static void write(const char* fmt, ...) {
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   113
    va_list args;
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   114
    va_start(args, fmt);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   115
    vwrite<Level>(fmt, args);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   116
    va_end(args);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   117
  };
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   118
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   119
  template <LogLevelType Level>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   120
  ATTRIBUTE_PRINTF(1, 0)
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   121
  static void vwrite(const char* fmt, va_list args) {
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   122
    char buf[LogBufferSize];
35897
beba2418d973 8146793: logStream::write re-formats string
kbarrett
parents: 34252
diff changeset
   123
    va_list saved_args;         // For re-format on buf overflow.
beba2418d973 8146793: logStream::write re-formats string
kbarrett
parents: 34252
diff changeset
   124
    va_copy(saved_args, args);
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   125
    size_t prefix_len = LogPrefix<T0, T1, T2, T3, T4>::prefix(buf, sizeof(buf));
33766
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   126
    // Check that string fits in buffer; resize buffer if necessary
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   127
    int ret = os::log_vsnprintf(buf + prefix_len, sizeof(buf) - prefix_len, fmt, args);
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   128
    assert(ret >= 0, "Log message buffer issue");
35897
beba2418d973 8146793: logStream::write re-formats string
kbarrett
parents: 34252
diff changeset
   129
    if ((size_t)ret >= sizeof(buf)) {
33766
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   130
      size_t newbuf_len = prefix_len + ret + 1;
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   131
      char* newbuf = NEW_C_HEAP_ARRAY(char, newbuf_len, mtLogging);
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   132
      prefix_len = LogPrefix<T0, T1, T2, T3, T4>::prefix(newbuf, newbuf_len);
35897
beba2418d973 8146793: logStream::write re-formats string
kbarrett
parents: 34252
diff changeset
   133
      ret = os::log_vsnprintf(newbuf + prefix_len, newbuf_len - prefix_len, fmt, saved_args);
33766
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   134
      assert(ret >= 0, "Log message buffer issue");
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   135
      puts<Level>(newbuf);
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   136
      FREE_C_HEAP_ARRAY(char, newbuf);
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   137
    } else {
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   138
      puts<Level>(buf);
3290cae587f9 8138916: Logging write function does not allow for long enough messages
rprotacio
parents: 33097
diff changeset
   139
    }
33097
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   140
  }
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   141
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   142
  template <LogLevelType Level>
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   143
  static void puts(const char* string) {
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   144
    LogTagSetMapping<T0, T1, T2, T3, T4>::tagset().log(Level, string);
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   145
  }
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   146
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   147
#define LOG_LEVEL(level, name) ATTRIBUTE_PRINTF(2, 0) \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   148
  Log& v##name(const char* fmt, va_list args) { \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   149
    vwrite<LogLevel::level>(fmt, args); \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   150
    return *this; \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   151
  } \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   152
  Log& name(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3) { \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   153
    va_list args; \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   154
    va_start(args, fmt); \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   155
    vwrite<LogLevel::level>(fmt, args); \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   156
    va_end(args); \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   157
    return *this; \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   158
  } \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   159
  static bool is_##name() { \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   160
    return is_level(LogLevel::level); \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   161
  } \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   162
  static outputStream* name##_stream() { \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   163
    return new logStream(write<LogLevel::level>); \
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   164
  }
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   165
  LOG_LEVEL_LIST
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   166
#undef LOG_LEVEL
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   167
};
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   168
96e348cb0442 8046148: JEP 158: Unified JVM Logging
mlarsson
parents:
diff changeset
   169
#endif // SHARE_VM_LOGGING_LOG_HPP