#ifndef QPID_MESSAGING_LOGGING_H #define QPID_MESSAGING_LOGGING_H /* * * 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 "qpid/messaging/ImportExport.h" #include namespace qpid { namespace messaging { /** * These log levels need to be kept in sync with the log levels * defined internally in qpid::log (but I don't think they are likely * to change anyway */ enum Level { trace, debug, info, notice, warning, error, critical }; /** \ingroup messaging * Interface class to allow redirection of log output */ class QPID_MESSAGING_CLASS_EXTERN LoggerOutput { public: QPID_MESSAGING_EXTERN virtual ~LoggerOutput(); /** * Override this member function to receive log messages. * * log() will be called for every log message that would be output from the qpid::messaging * logging subsystem after applying the specified logging filters. * * The logging subsystem ensures that log() will not be called simultaneously in different threads. * @param level The severity of the log message can be (in order of severity) * trace, debug, info, notice, warning, error, critical * @param user Flag which is set if the log message came from the user application ( using qpid::messaging::Logger::log() ) * (if not set then the message comes from the qpid library) * @param file The source code file name reported as the origin of the log message * @param line The source code line number reported as the origin of the log message * @param function The source code function reported as the origin of the log message * @param message The log message */ virtual void log(Level level, bool user, const char* file, int line, const char* function, const std::string& message) = 0; }; /** \ingroup messaging * A utility class to allow the application to control the logging * output of the qpid messaging library * * This class represents a singleton logging facility within the qpid messaging library so there are only static * methods in the class */ class QPID_MESSAGING_CLASS_EXTERN Logger { public: /** * Configure the logging subsystem * * This function takes an array of text options (which could easily come from a programs * command line) and uses them to configure the logging subsystem. * * If the prefix parameter is specified then the accepted command line options are prefixed * by <>- for example if the prefix is "qpid" then the options all start "--qpid-log..." * * Accepted options are: * --log-enable RULE * --log-disable RULE * * Both --log-enable and --log-disable can be specified multiple times in a single command line. * The enables are acted upon and after them the disables are acted upon. * * RULE is in the form LEVEL[("+"|"-")][:PATTERN] * LEVEL is one of "trace", "debug", "info", "notice", "warning", "error", "critical" * "+" operates on the level and all higher levels * "-" operates on the level and all lower levels * PATTERN is a category name or a fragment of a fully namespace qualified function (Case sensitive). * * --log-to-stdout ("on"|"off|"0"|"1") * --log-to-stderr ("on"|"off|"0"|"1") * --log-to-file FILENAME * * These options control where the qpid logging subsystem sends log messages * * --log-time ("on"|"off|"0"|"1") * --log-level ("on"|"off|"0"|"1") * --log-source ("on"|"off|"0"|"1") * --log-thread ("on"|"off|"0"|"1") * --log-function ("on"|"off|"0"|"1") * --log-hires-timestamp ("on"|"off|"0"|"1") * * These options control what information is included in the logging message sent by the logging subsystem. * * @param argc count of options - identical to meaning for main(). * @param argv array of pointers to options - identical to meaning for main(). * @param prefix (optional) If present prefix all logging options with this string * @throws MessagingException if it cannot parse an option it recognises */ QPID_MESSAGING_EXTERN static void configure(int argc, const char* argv[], const std::string& prefix=std::string()); /** * Get a user friendly usage message. * * This returns a usage message that is suitable for outputting directly to * a console user. The message only contains the command line options that * are understood by qpid::messaging::Logger::configure(). * * NB. You must call qpid::messaging::Logger::configure() before calling this * to populate the usage string as the usage string depends on the prefix that * is passed in to qpid::messaging::Logger::configure(). * * @return string containing the usage message for the command line options */ QPID_MESSAGING_EXTERN static std::string usage(); /** * Register a custom handler for log messages * * This allows application programs to intercept the log messages coming from qpid::messaging * and handle them in whatever way is consonent with the applications own handling of * log messages. * * In order to do this create a class that inherits from qpid::messaging::LoggerOutput * and override the log() member function. */ QPID_MESSAGING_EXTERN static void setOutput(LoggerOutput& output); /** * Output a log message. This will get sent to all the specified logging outputs including any * the application has registered. The message will get filtered along with the internal messages * according to the specified logging filters. * * When a log message output using log() is received by a LoggerOutput::log() method the "user" bool parameter will be set true. */ QPID_MESSAGING_EXTERN static void log(Level level, const char* file, int line, const char* function, const std::string& message); private: //This class has only one instance so no need to copy Logger(); ~Logger(); Logger(const Logger&); Logger operator=(const Logger&); }; }} // namespace qpid::messaging #endif /*!QPID_MESSAGING_LOGGING_H*/