blob: 09e92427f90c23dda0b7f93d7e98e1a37ea5098d [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 AXUTIL_LOG_H
#define AXUTIL_LOG_H
#include <axutil_allocator.h>
#ifdef __cplusplus
extern "C"
{
#endif
typedef struct axutil_log_ops axutil_log_ops_t;
typedef struct axutil_log axutil_log_t;
#define AXIS2_LOG_SI __FILE__,__LINE__
/**
* @defgroup axutil_log log
* @ingroup axis2_util
* @{
*/
/**
*Examples
*To write debug information to log
*AXIS2_LOG_DEBUG(log,AXIS2_LOG_SI,"log this %s %d","test",123);
*This would log
*"log this test 123" into the log file
*
*similar macros are defined for different log levels: CRITICAL,ERROR,WARNING and INFO
* and SERVICE
*
*CRITICAL and ERROR logs are always written to file and other logs are written
*depending on the log level set (log->level)
*/
/**
* \brief Axis2 log levels
*/
typedef enum axutil_log_levels
{
/** Critical level, logs only critical errors */
AXIS2_LOG_LEVEL_CRITICAL = 0,
/** Error level, logs only errors */
AXIS2_LOG_LEVEL_ERROR,
/** Warning level, logs only warnings */
AXIS2_LOG_LEVEL_WARNING,
/** Info level, logs information */
AXIS2_LOG_LEVEL_INFO,
/** Debug level, logs everything */
AXIS2_LOG_LEVEL_DEBUG,
/** User level, logs only user level debug messages */
AXIS2_LOG_LEVEL_USER,
/** Trace level, Enable with compiler time option AXIS2_TRACE */
AXIS2_LOG_LEVEL_TRACE
} axutil_log_levels_t;
/**
* \brief Axis2 log ops struct
*
* Encapsulator struct for ops of axutil_log
*/
struct axutil_log_ops
{
/**
* deletes the log
* @return axis2_status_t AXIS2_SUCCESS on success else AXIS2_FAILURE
*/
void(
AXIS2_CALL
* free)(
axutil_allocator_t * allocator,
struct axutil_log * log);
/**
* writes to the log
* @param buffer buffer to be written to log
* @param size size of the buffer to be written to log
* @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE
*/
void(
AXIS2_CALL
* write)(
axutil_log_t * log,
const axis2_char_t * buffer,
axutil_log_levels_t level,
const axis2_char_t * file,
const int line);
};
/**
* \brief Axis2 Log struct
*
* Log is the encapsulating struct for all log related data and ops
*/
struct axutil_log
{
/** Log related ops */
const axutil_log_ops_t *ops;
/** Log level */
axutil_log_levels_t level;
/** Maximum log file size */
int size;
/** Is logging enabled? */
axis2_bool_t enabled;
};
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_critical(
axutil_log_t * log,
const axis2_char_t * filename,
const int linenumber,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_error(
axutil_log_t * log,
const axis2_char_t * filename,
const int linenumber,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_warning(
axutil_log_t * log,
const axis2_char_t * filename,
const int linenumber,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_info(
axutil_log_t * log,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_user(
axutil_log_t * log,
const axis2_char_t * filename,
const int linenumber,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_debug(
axutil_log_t * log,
const axis2_char_t * filename,
const int linenumber,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_impl_log_trace(
axutil_log_t * log,
const axis2_char_t * filename,
const int linenumber,
const axis2_char_t * format,
...);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_free(
axutil_allocator_t * allocator,
struct axutil_log *log);
AXIS2_EXTERN void AXIS2_CALL
axutil_log_write(
axutil_log_t * log,
const axis2_char_t * buffer,
axutil_log_levels_t level,
const axis2_char_t * file,
const int line);
#define AXIS2_LOG_FREE(allocator, log) \
axutil_log_free(allocator, log)
#define AXIS2_LOG_WRITE(log, buffer, level, file) \
axutil_log_write(log, buffer, level, file, AXIS2_LOG_SI)
#define AXIS2_LOG_USER axutil_log_impl_log_user
#define AXIS2_LOG_DEBUG axutil_log_impl_log_debug
#define AXIS2_LOG_INFO axutil_log_impl_log_info
#define AXIS2_LOG_WARNING axutil_log_impl_log_warning
#define AXIS2_LOG_ERROR axutil_log_impl_log_error
#define AXIS2_LOG_CRITICAL axutil_log_impl_log_critical
#ifdef AXIS2_TRACE
#define AXIS2_LOG_TRACE axutil_log_impl_log_trace
#else
# ifdef HAVE_GNUC_VARARGS
# define AXIS2_LOG_TRACE(params, args ...)
# elif defined HAVE_ISO_VARARGS
# define AXIS2_LOG_TRACE(params, ...)
# elif __STDC__ && __STDC_VERSION > 199901L
# define AXIS2_LOG_TRACE(params, ...)
# elif WIN32
# define AXIS2_LOG_TRACE axutil_log_impl_log_trace
# else
# define AXIS2_LOG_TRACE axutil_log_impl_log_trace
# endif
#endif
#ifndef AXIS2_LOG_PROJECT_PREFIX
/** Each module/project should undef and define the following.. */
#define AXIS2_LOG_PROJECT_PREFIX "[axis2c]"
#endif
#define AXIS2_LOG_USER_MSG(log, msg) AXIS2_LOG_USER (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_DEBUG_MSG(log, msg) AXIS2_LOG_DEBUG (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_INFO_MSG(log, msg) AXIS2_LOG_INFO (log, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_WARNING_MSG(log, msg) AXIS2_LOG_WARNING (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_ERROR_MSG(log, msg) AXIS2_LOG_ERROR (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_CRITICAL_MSG(log, msg) AXIS2_LOG_CRITICAL (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_TRACE_MSG(log, msg) AXIS2_LOG_TRACE (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define IF_AXIS2_LOG_DEBUG_ENABLED(log) if(AXIS2_LOG_LEVEL_DEBUG <= log->level && log->level != AXIS2_LOG_LEVEL_USER)
/** @} */
#ifdef __cplusplus
}
#endif
#endif /* AXIS2_LOG_H */