/* * 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 #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 */