blob: 44f2d35640e2b8dfc896bea9b2273519cb7b7250 [file] [log] [blame]
/*
* 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.
*/
#ifndef _DECAF_UTIL_LOGGING_HANDLER_H_
#define _DECAF_UTIL_LOGGING_HANDLER_H_
#include <decaf/io/Closeable.h>
#include <decaf/lang/Exception.h>
#include <decaf/util/logging/LogRecord.h>
#include <decaf/util/logging/Level.h>
#include <decaf/lang/exceptions/NullPointerException.h>
#include <string>
namespace decaf{
namespace util{
namespace logging{
class Filter;
class Formatter;
class ErrorManager;
/**
* A Handler object takes log messages from a Logger and exports them.
* It might for example, write them to a console or write them to a file,
* or send them to a network logging service, or forward them to an OS
* log, or whatever.
*
* A Handler can be disabled by doing a setLevel(Level.OFF) and can be
* re-enabled by doing a setLevel with an appropriate level.
*
* Handler classes typically use LogManager properties to set default
* values for the Handler's Filter, Formatter, and Level. See the
* specific documentation for each concrete Handler class.
*/
class DECAF_API Handler : public io::Closeable {
private:
// Formats this Handlers output
Formatter* formatter;
// Filter object for Log Filtering
Filter* filter;
// ErrorManager instance for this Handler
ErrorManager* errorManager;
// Level at which that this Handler will start logging.
Level level;
// Name of this class used to read properties
std::string prefix;
private:
Handler( const Handler& );
Handler& operator= ( const Handler& );
public:
Handler();
virtual ~Handler();
/**
* Flush the Handler's output, clears any buffers.
*/
virtual void flush() = 0;
/**
* Publish the Log Record to this Handler
* @param record The Log Record to Publish
*/
virtual void publish( const LogRecord& record ) = 0;
/**
* Check if this Handler would actually log a given LogRecord.
* <p>
* This method checks if the LogRecord has an appropriate Level and
* whether it satisfies any Filter. It also may make other Handler
* specific checks that might prevent a handler from logging the
* LogRecord.
* @param record <code>LogRecord</code> to check
*/
virtual bool isLoggable( const LogRecord& record ) const;
/**
* Sets the Filter that this Handler uses to filter Log Records
*
* For each call of publish the Handler will call this Filter (if it
* is non-null) to check if the LogRecord should be published or
* discarded.
*
* @param filter <code>Filter</code> derived instance
*/
virtual void setFilter( Filter* filter ) {
this->filter = filter;
}
/**
* Gets the Filter that this Handler uses to filter Log Records
* @return <code>Filter</code> derived instance
*/
virtual Filter* getFilter() {
return this->filter;
}
/**
* Set the log level specifying which message levels will be logged
* by this Handler.
* <p>
* The intention is to allow developers to turn on voluminous logging,
* but to limit the messages that are sent to certain Handlers.
* @param value Level enumeration value
*/
virtual void setLevel( const Level& value ) {
this->level = value;
}
/**
* Get the log level specifying which message levels will be logged
* by this Handler.
* @return Level enumeration value
*/
virtual Level getLevel() {
return this->level;
}
/**
* Sets the <code>Formatter</code> used by this Handler
* <p>
* Some Handlers may not use Formatters, in which case the
* Formatter will be remembered, but not used.
* @param formatter <code>Filter</code> derived instance
*/
virtual void setFormatter( Formatter* formatter );
/**
* Gets the <code>Formatter</code> used by this Handler
* @return <code>Filter</code> derived instance
*/
virtual Formatter* getFormatter() {
return this->formatter;
}
/**
* Sets the <code>Formatter</code> used by this Handler
* <p>
* The ErrorManager's "error" method will be invoked if any errors occur while
* using this Handler.
*
* @param errorManager <code>ErrorManager</code> derived instance
*/
virtual void setErrorManager( ErrorManager* errorManager );
/**
* Gets the <code>ErrorManager</code> used by this Handler.
* @return <code>ErrorManager</code> derived pointer or NULL.
*/
virtual ErrorManager* getErrorManager() {
return this->errorManager;
}
protected:
/**
* Protected convenience method to report an error to this Handler's ErrorManager.
*
* @param message - a descriptive string (may be empty)
* @param ex - an exception (may be NULL)
* @param code - an error code defined in ErrorManager
*/
void reportError( const std::string& message, decaf::lang::Exception* ex, int code );
};
}}}
#endif /*_DECAF_UTIL_LOGGING_HANDLER_H_*/