diff --git a/CHANGELOG b/CHANGELOG index 2c71c937b32..9772d0a2e66 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -185,6 +185,7 @@ - Phalcon\Logger\Adapter::commit() now clears the queue (#1742) - Phalcon\Logger\Adapter now implements Phalcon\Logger\AdapterInterface (#1852) - Phalcon\Logger\Formatter now implements Phalcon\Logger\FormatterInterface (#1852) + - Phalcon\Logger\Adapter is now PSR-3 compliant (#1873) - Phalcon\Mvc: - Phalcon\Mvc\Application::handle() now checks whether the class exists before include()'ing its file (#812, #818) - Phalcon\Mvc\Model\Criteria::fromInput() now sets _modelName (#866, #873) diff --git a/ext/logger/adapter.c b/ext/logger/adapter.c index 4a80b0a7026..4be9f6b977a 100644 --- a/ext/logger/adapter.c +++ b/ext/logger/adapter.c @@ -70,6 +70,7 @@ static const zend_function_entry phalcon_logger_adapter_method_entry[] = { PHP_ME(Phalcon_Logger_Adapter, warning, arginfo_phalcon_logger_adapterinterface_warning, ZEND_ACC_PUBLIC) PHP_ME(Phalcon_Logger_Adapter, alert, arginfo_phalcon_logger_adapterinterface_alert, ZEND_ACC_PUBLIC) PHP_ME(Phalcon_Logger_Adapter, log, arginfo_phalcon_logger_adapterinterface_log, ZEND_ACC_PUBLIC) + ZEND_FENTRY(logInternal, NULL, arginfo_phalcon_logger_adapter_loginternal, ZEND_ACC_PROTECTED | ZEND_ACC_ABSTRACT) PHP_FE_END }; @@ -90,6 +91,44 @@ PHALCON_INIT_CLASS(Phalcon_Logger_Adapter){ return SUCCESS; } +static int phalcon_logger_adapter_string_level_to_int(const zval *level) +{ + const char *s = Z_STRVAL_P(level); + size_t len = (size_t)(Z_STRLEN_P(level)); + size_t i; + + struct sl { + const char *str; + size_t len; + int level; + }; + + static struct sl lookup_table[] = { + { ZEND_STRL("emergency"), PHALCON_LOGGER_EMERGENCY }, + { ZEND_STRL("alert"), PHALCON_LOGGER_ALERT }, + { ZEND_STRL("critical"), PHALCON_LOGGER_CRITICAL }, + { ZEND_STRL("error"), PHALCON_LOGGER_ERROR }, + { ZEND_STRL("warning"), PHALCON_LOGGER_WARNING }, + { ZEND_STRL("notice"), PHALCON_LOGGER_NOTICE }, + { ZEND_STRL("info"), PHALCON_LOGGER_INFO }, + { ZEND_STRL("debug"), PHALCON_LOGGER_DEBUG } + }; + + assert(Z_TYPE_P(level) == IS_STRING); + + for (i=0; i= i_level) { + PHALCON_MM_GROW(); + PHALCON_INIT_VAR(timestamp); ZVAL_LONG(timestamp, (long)time(NULL)); + PHALCON_INIT_VAR(level); + ZVAL_LONG(level, i_level); + transaction = phalcon_fetch_nproperty_this(this_ptr, SL("_transaction"), PH_NOISY_CC); if (zend_is_true(transaction)) { PHALCON_INIT_VAR(queue_item); object_init_ex(queue_item, phalcon_logger_item_ce); - phalcon_call_method_p3_noret(queue_item, "__construct", message, type, timestamp); + phalcon_call_method_p4_noret(queue_item, "__construct", *message, level, timestamp, *context); phalcon_update_property_array_append(this_ptr, SL("_queue"), queue_item TSRMLS_CC); } else { - phalcon_call_method_p3_noret(this_ptr, "loginternal", message, type, timestamp); + phalcon_call_method_p4_noret(this_ptr, "loginternal", *message, level, timestamp, *context); } + + PHALCON_MM_RESTORE(); } - RETURN_THIS(); + RETURN_THISW(); } diff --git a/ext/logger/adapter.h b/ext/logger/adapter.h index 6cb57a003c9..622204c538f 100644 --- a/ext/logger/adapter.h +++ b/ext/logger/adapter.h @@ -26,4 +26,11 @@ extern zend_class_entry *phalcon_logger_adapter_ce; PHALCON_INIT_CLASS(Phalcon_Logger_Adapter); +ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_loginternal, 0, 0, 4) + ZEND_ARG_INFO(0, message) + ZEND_ARG_INFO(0, type) + ZEND_ARG_INFO(0, time) + ZEND_ARG_INFO(0, context) +ZEND_END_ARG_INFO() + #endif /* PHALCON_LOGGER_ADAPTER_H */ diff --git a/ext/logger/adapter/file.c b/ext/logger/adapter/file.c index f29e0003922..5081d70c19b 100644 --- a/ext/logger/adapter/file.c +++ b/ext/logger/adapter/file.c @@ -59,16 +59,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_file___construct, 0, 0, 1) ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_file_loginternal, 0, 0, 3) - ZEND_ARG_INFO(0, message) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, time) -ZEND_END_ARG_INFO() - static const zend_function_entry phalcon_logger_adapter_file_method_entry[] = { PHP_ME(Phalcon_Logger_Adapter_File, __construct, arginfo_phalcon_logger_adapter_file___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(Phalcon_Logger_Adapter_File, getFormatter, NULL, ZEND_ACC_PUBLIC) - PHP_ME(Phalcon_Logger_Adapter_File, logInternal, arginfo_phalcon_logger_adapter_file_loginternal, ZEND_ACC_PUBLIC) + PHP_ME(Phalcon_Logger_Adapter_File, logInternal, arginfo_phalcon_logger_adapter_loginternal, ZEND_ACC_PROTECTED) PHP_ME(Phalcon_Logger_Adapter_File, close, NULL, ZEND_ACC_PUBLIC) PHP_ME(Phalcon_Logger_Adapter_File, getPath, NULL, ZEND_ACC_PUBLIC) PHP_ME(Phalcon_Logger_Adapter_File, __wakeup, NULL, ZEND_ACC_PUBLIC) @@ -171,15 +165,16 @@ PHP_METHOD(Phalcon_Logger_Adapter_File, getFormatter){ * @param string $message * @param int $type * @param int $time + * @param array $context */ PHP_METHOD(Phalcon_Logger_Adapter_File, logInternal){ - zval *message, *type, *time, *file_handler, *formatter; + zval *message, *type, *time, *file_handler, *formatter, *context; zval *applied_format; PHALCON_MM_GROW(); - phalcon_fetch_params(1, 3, 0, &message, &type, &time); + phalcon_fetch_params(1, 4, 0, &message, &type, &time, &context); PHALCON_OBS_VAR(file_handler); phalcon_read_property_this(&file_handler, this_ptr, SL("_fileHandler"), PH_NOISY_CC); @@ -192,7 +187,7 @@ PHP_METHOD(Phalcon_Logger_Adapter_File, logInternal){ phalcon_call_method(formatter, this_ptr, "getformatter"); PHALCON_INIT_VAR(applied_format); - phalcon_call_method_p3(applied_format, formatter, "format", message, type, time); + phalcon_call_method_p4(applied_format, formatter, "format", message, type, time, context); PHALCON_CALL_FUNCTION_NORET("fwrite", file_handler, applied_format); PHALCON_MM_RESTORE(); diff --git a/ext/logger/adapter/firephp.c b/ext/logger/adapter/firephp.c index 01d212918b8..bf76a190599 100644 --- a/ext/logger/adapter/firephp.c +++ b/ext/logger/adapter/firephp.c @@ -50,15 +50,9 @@ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, getFormatter); PHP_METHOD(Phalcon_Logger_Adapter_Firephp, logInternal); PHP_METHOD(Phalcon_Logger_Adapter_Firephp, close); -ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_firephp_loginternal, 0, 0, 3) - ZEND_ARG_INFO(0, message) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, time) -ZEND_END_ARG_INFO() - static const zend_function_entry phalcon_logger_adapter_firephp_method_entry[] = { PHP_ME(Phalcon_Logger_Adapter_Firephp, getFormatter, NULL, ZEND_ACC_PUBLIC) - PHP_ME(Phalcon_Logger_Adapter_Firephp, logInternal, arginfo_phalcon_logger_adapter_firephp_loginternal, ZEND_ACC_PUBLIC) + PHP_ME(Phalcon_Logger_Adapter_Firephp, logInternal, arginfo_phalcon_logger_adapter_loginternal, ZEND_ACC_PROTECTED) PHP_ME(Phalcon_Logger_Adapter_Firephp, close, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -103,11 +97,12 @@ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, getFormatter){ * @param string $message * @param int $type * @param int $time + * @param array $context * @see http://www.firephp.org/Wiki/Reference/Protocol */ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, logInternal){ - zval *message, *type, *time, *formatter, *applied_format; + zval *message, *type, *time, *context, *formatter, *applied_format; zval *initialized, *index; sapi_header_line h = { NULL, 0, 0 }; smart_str str = { NULL, 0, 0 }; @@ -123,7 +118,7 @@ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, logInternal){ PHALCON_MM_GROW(); - phalcon_fetch_params(1, 3, 0, &message, &type, &time); + phalcon_fetch_params(1, 4, 0, &message, &type, &time, &context); PHALCON_INIT_VAR(formatter); phalcon_call_method(formatter, this_ptr, "getformatter"); @@ -152,10 +147,8 @@ PHP_METHOD(Phalcon_Logger_Adapter_Firephp, logInternal){ } PHALCON_INIT_VAR(applied_format); - phalcon_call_method_p3(applied_format, formatter, "format", message, type, time); - if (Z_TYPE_P(applied_format) != IS_STRING) { - convert_to_string(applied_format); - } + phalcon_call_method_p4(applied_format, formatter, "format", message, type, time, context); + convert_to_string(applied_format); index = phalcon_fetch_static_property_ce(phalcon_logger_adapter_firephp_ce, SL("_index") TSRMLS_CC); assert(Z_TYPE_P(index) == IS_LONG); diff --git a/ext/logger/adapter/stream.c b/ext/logger/adapter/stream.c index 59992625a68..a35873e7b7d 100644 --- a/ext/logger/adapter/stream.c +++ b/ext/logger/adapter/stream.c @@ -56,16 +56,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_stream___construct, 0, 0, ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_stream_loginternal, 0, 0, 3) - ZEND_ARG_INFO(0, message) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, time) -ZEND_END_ARG_INFO() - static const zend_function_entry phalcon_logger_adapter_stream_method_entry[] = { PHP_ME(Phalcon_Logger_Adapter_Stream, __construct, arginfo_phalcon_logger_adapter_stream___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(Phalcon_Logger_Adapter_Stream, getFormatter, NULL, ZEND_ACC_PUBLIC) - PHP_ME(Phalcon_Logger_Adapter_Stream, logInternal, arginfo_phalcon_logger_adapter_stream_loginternal, ZEND_ACC_PUBLIC) + PHP_ME(Phalcon_Logger_Adapter_Stream, logInternal, arginfo_phalcon_logger_adapter_loginternal, ZEND_ACC_PROTECTED) PHP_ME(Phalcon_Logger_Adapter_Stream, close, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -162,14 +156,15 @@ PHP_METHOD(Phalcon_Logger_Adapter_Stream, getFormatter){ * @param string $message * @param int $type * @param int $time + * @param array $context */ PHP_METHOD(Phalcon_Logger_Adapter_Stream, logInternal){ - zval *message, *type, *time, *stream, *formatter, *applied_format; + zval *message, *type, *time, *context, *stream, *formatter, *applied_format; PHALCON_MM_GROW(); - phalcon_fetch_params(1, 3, 0, &message, &type, &time); + phalcon_fetch_params(1, 4, 0, &message, &type, &time, &context); PHALCON_OBS_VAR(stream); phalcon_read_property_this(&stream, this_ptr, SL("_stream"), PH_NOISY_CC); @@ -182,7 +177,7 @@ PHP_METHOD(Phalcon_Logger_Adapter_Stream, logInternal){ phalcon_call_method(formatter, this_ptr, "getformatter"); PHALCON_INIT_VAR(applied_format); - phalcon_call_method_p3(applied_format, formatter, "format", message, type, time); + phalcon_call_method_p4(applied_format, formatter, "format", message, type, time, context); PHALCON_CALL_FUNCTION_NORET("fwrite", stream, applied_format); PHALCON_MM_RESTORE(); diff --git a/ext/logger/adapter/syslog.c b/ext/logger/adapter/syslog.c index baad2a51522..ecc38c2ef77 100644 --- a/ext/logger/adapter/syslog.c +++ b/ext/logger/adapter/syslog.c @@ -57,16 +57,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_syslog___construct, 0, 0, ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapter_syslog_loginternal, 0, 0, 3) - ZEND_ARG_INFO(0, message) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, time) -ZEND_END_ARG_INFO() - static const zend_function_entry phalcon_logger_adapter_syslog_method_entry[] = { PHP_ME(Phalcon_Logger_Adapter_Syslog, __construct, arginfo_phalcon_logger_adapter_syslog___construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) PHP_ME(Phalcon_Logger_Adapter_Syslog, getFormatter, NULL, ZEND_ACC_PUBLIC) - PHP_ME(Phalcon_Logger_Adapter_Syslog, logInternal, arginfo_phalcon_logger_adapter_syslog_loginternal, ZEND_ACC_PUBLIC) + PHP_ME(Phalcon_Logger_Adapter_Syslog, logInternal, arginfo_phalcon_logger_adapter_loginternal, ZEND_ACC_PROTECTED) PHP_ME(Phalcon_Logger_Adapter_Syslog, close, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -163,33 +157,35 @@ PHP_METHOD(Phalcon_Logger_Adapter_Syslog, getFormatter){ * @param string $message * @param int $type * @param int $time + * @param array $context */ PHP_METHOD(Phalcon_Logger_Adapter_Syslog, logInternal){ - zval *message, *type, *time, *formatter, *applied_format; + zval *message, *type, *time, *context, *formatter, *applied_format; zval *syslog_type, *syslog_message; PHALCON_MM_GROW(); - phalcon_fetch_params(1, 3, 0, &message, &type, &time); + phalcon_fetch_params(1, 4, 0, &message, &type, &time, &context); PHALCON_INIT_VAR(formatter); phalcon_call_method(formatter, this_ptr, "getformatter"); PHALCON_INIT_VAR(applied_format); - phalcon_call_method_p3(applied_format, formatter, "format", message, type, time); + phalcon_call_method_p4(applied_format, formatter, "format", message, type, time, context); if (Z_TYPE_P(applied_format) != IS_ARRAY) { - convert_to_string(applied_format); - return; + syslog_type = type; + syslog_message = applied_format; } - - PHALCON_OBS_VAR(syslog_type); - phalcon_array_fetch_long(&syslog_type, applied_format, 0, PH_NOISY); - - PHALCON_OBS_VAR(syslog_message); - phalcon_array_fetch_long(&syslog_message, applied_format, 1, PH_NOISY); + else { + PHALCON_OBS_VAR(syslog_type); + phalcon_array_fetch_long(&syslog_type, applied_format, 0, PH_NOISY); + + PHALCON_OBS_VAR(syslog_message); + phalcon_array_fetch_long(&syslog_message, applied_format, 1, PH_NOISY); + } + PHALCON_CALL_FUNCTION_NORET("syslog", syslog_type, syslog_message); - PHALCON_MM_RESTORE(); } @@ -202,14 +198,10 @@ PHP_METHOD(Phalcon_Logger_Adapter_Syslog, close){ zval *opened; - PHALCON_MM_GROW(); - - PHALCON_OBS_VAR(opened); - phalcon_read_property_this(&opened, this_ptr, SL("_opened"), PH_NOISY_CC); + opened = phalcon_fetch_nproperty_this(this_ptr, SL("_opened"), PH_NOISY_CC); if (zend_is_true(opened)) { - PHALCON_CALL_FUNCTION_NORET("closelog"); + PHALCON_CALL_FUNCTIONW(NULL, "closelog"); } - RETVAL_TRUE; - PHALCON_MM_RESTORE(); + RETURN_TRUE; } diff --git a/ext/logger/adapterinterface.h b/ext/logger/adapterinterface.h index 3213b68b740..ddb86015819 100644 --- a/ext/logger/adapterinterface.h +++ b/ext/logger/adapterinterface.h @@ -34,37 +34,45 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_setloglevel, 0, 0 ZEND_ARG_INFO(0, level) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_log, 0, 0, 1) - ZEND_ARG_INFO(0, message) +ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_log, 0, 0, 2) ZEND_ARG_INFO(0, type) + ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_debug, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_error, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_info, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_notice, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_warning, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_alert, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_adapterinterface_emergency, 0, 0, 1) ZEND_ARG_INFO(0, message) + ZEND_ARG_ARRAY_INFO(0, context, 1) ZEND_END_ARG_INFO() #endif /* PHALCON_LOGGER_ADAPTERINTERFACE_H */ diff --git a/ext/logger/formatter.c b/ext/logger/formatter.c index 54586c3178f..4550d70b9f3 100644 --- a/ext/logger/formatter.c +++ b/ext/logger/formatter.c @@ -18,7 +18,11 @@ #include "logger/formatter.h" #include "logger/formatterinterface.h" + +#include
+ #include "kernel/main.h" +#include "kernel/fcall.h" /** * Phalcon\Logger\Formatter @@ -28,9 +32,11 @@ zend_class_entry *phalcon_logger_formatter_ce; PHP_METHOD(Phalcon_Logger_Formatter, getTypeString); +PHP_METHOD(Phalcon_Logger_Formatter, interpolate); static const zend_function_entry phalcon_logger_formatter_method_entry[] = { PHP_ME(Phalcon_Logger_Formatter, getTypeString, arginfo_phalcon_logger_formatter_gettypestring, ZEND_ACC_PUBLIC) + PHP_ME(Phalcon_Logger_Formatter, interpolate, arginfo_phalcon_logger_formatter_interpolate, ZEND_ACC_PROTECTED) PHP_FE_END }; @@ -72,3 +78,57 @@ PHP_METHOD(Phalcon_Logger_Formatter, getTypeString){ RETURN_STRING("CUSTOM", 1); } + +/** + * Interpolates context values into the message placeholders + * + * @see http://www.php-fig.org/psr/psr-3/ Section 1.2 Message + * @param string $message + * @param array $context + */ +PHP_METHOD(Phalcon_Logger_Formatter, interpolate) +{ + zval **message, **context; + + phalcon_fetch_params_ex(2, 0, &message, &context); + + if (Z_TYPE_PP(context) == IS_ARRAY) { + HashTable *ht = Z_ARRVAL_PP(context); + HashPosition hp; + zval *replace, **val; + + PHALCON_ALLOC_GHOST_ZVAL(replace); + array_init_size(replace, zend_hash_num_elements(ht)); + + for ( + zend_hash_internal_pointer_reset_ex(ht, &hp); + zend_hash_get_current_data_ex(ht, (void**)&val, &hp) == SUCCESS; + zend_hash_move_forward_ex(ht, &hp) + ) { + char *str_index, *idx; + uint str_length; + ulong num_index; + int type = zend_hash_get_current_key_ex(ht, &str_index, &str_length, &num_index, 0, &hp); + + if (HASH_KEY_IS_STRING == type) { + str_length += 2; + idx = ecalloc(str_length + 2, 1); + idx[0] = '{'; + idx[str_length-2] = '}'; + memcpy(idx + 1, str_index, str_length - 3); + } + else if (HASH_KEY_IS_LONG == type) { + str_length = spprintf(&idx, 0, "{%ld}", num_index); + } + + Z_ADDREF_PP(val); + zend_hash_add(Z_ARRVAL_P(replace), idx, str_length, (void*)val, sizeof(zval*), NULL); + efree(idx); + } + + PHALCON_RETURN_CALL_FUNCTIONW("strtr", *message, replace); + } + else { + RETURN_ZVAL(*message, 1, 0); + } +} diff --git a/ext/logger/formatter.h b/ext/logger/formatter.h index d697d51ff70..43229b5515e 100644 --- a/ext/logger/formatter.h +++ b/ext/logger/formatter.h @@ -30,4 +30,9 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_formatter_gettypestring, 0, 0, 1) ZEND_ARG_INFO(0, type) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_formatter_interpolate, 0, 0, 2) + ZEND_ARG_INFO(0, message) + ZEND_ARG_INFO(0, context) +ZEND_END_ARG_INFO() + #endif /* PHALCON_LOGGER_FORMATTER_H */ diff --git a/ext/logger/formatter/firephp.c b/ext/logger/formatter/firephp.c index d7e555bf181..c7f2702e76a 100644 --- a/ext/logger/formatter/firephp.c +++ b/ext/logger/formatter/firephp.c @@ -150,7 +150,7 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, getTypeString) { */ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { - zval *message, *type, *type_str = NULL, *timestamp; + zval *message, *type, *type_str = NULL, *timestamp, *context, *interpolated = NULL; zval *payload, *body, *backtrace = NULL, *meta, *encoded; zval *show_backtrace, *enable_labels; int i_show_backtrace, i_enable_labels; @@ -158,7 +158,7 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { uint i; Bucket *p; - phalcon_fetch_params(0, 3, 0, &message, &type, ×tamp); + phalcon_fetch_params(0, 4, 0, &message, &type, ×tamp, &context); /* * We intentionally do not use Phalcon's MM for better performance. @@ -169,7 +169,16 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { * and we will just save some time by not using Z_ADDREF_P and Z_DELREF_P */ + if (Z_TYPE_P(context) == IS_ARRAY) { + RETURN_ON_FAILURE(phalcon_call_method_params(interpolated, &interpolated, this_ptr, SL("interpolate"), zend_inline_hash_func(SS("interpolate")) TSRMLS_CC, 2, message, context)); + } + else { + interpolated = message; + Z_ADDREF_P(interpolated); + } + if (FAILURE == phalcon_call_method_params(type_str, &type_str, this_ptr, SL("gettypestring"), zend_inline_hash_func(SS("gettypestring")) TSRMLS_CC, 1, type)) { + zval_ptr_dtor(&interpolated); return; } @@ -273,11 +282,6 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { array_init_size(meta, 4); add_assoc_zval_ex(meta, SS("Type"), type_str); - if (i_enable_labels) { - Z_ADDREF_P(message); - add_assoc_zval_ex(meta, SS("Label"), message); - } - if (i_show_backtrace && Z_TYPE_P(backtrace) == IS_ARRAY) { zval **ppzval; @@ -299,9 +303,12 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { } } + if (i_enable_labels) { + add_assoc_zval_ex(meta, SS("Label"), interpolated); + } + if (!i_enable_labels && !i_show_backtrace) { - body = message; - Z_ADDREF_P(body); + body = interpolated; } else if (i_enable_labels && !i_show_backtrace) { MAKE_STD_ZVAL(body); @@ -316,8 +323,7 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { } if (!i_enable_labels) { - Z_ADDREF_P(message); - add_assoc_zval_ex(body, SS("message"), message); + add_assoc_zval_ex(body, SS("message"), interpolated); } } @@ -363,6 +369,6 @@ PHP_METHOD(Phalcon_Logger_Formatter_Firephp, format) { /* We don't need the JSON message anymore */ zval_ptr_dtor(&encoded); - /* Do not free the samrt string because we steal its data for zval */ + /* Do not free the smart string because we steal its data for zval */ RETURN_STRINGL(result.c, result.len, 0); } diff --git a/ext/logger/formatter/json.c b/ext/logger/formatter/json.c index 981100b0275..5ec9b651220 100644 --- a/ext/logger/formatter/json.c +++ b/ext/logger/formatter/json.c @@ -64,19 +64,27 @@ PHALCON_INIT_CLASS(Phalcon_Logger_Formatter_Json){ */ PHP_METHOD(Phalcon_Logger_Formatter_Json, format){ - zval *message, *type, *timestamp, *type_str, *log; + zval *message, *type, *timestamp, *context, *interpolated = NULL, *type_str, *log; PHALCON_MM_GROW(); - phalcon_fetch_params(1, 3, 0, &message, &type, ×tamp); + phalcon_fetch_params(1, 3, 0, &message, &type, ×tamp, &context); + if (Z_TYPE_P(context) == IS_ARRAY) { + PHALCON_OBS_VAR(interpolated); + phalcon_call_method_p2_ex(interpolated, &interpolated, this_ptr, "interpolate", message, context); + } + else { + interpolated = message; + } + PHALCON_INIT_VAR(type_str); phalcon_call_method_p1(type_str, this_ptr, "gettypestring", type); PHALCON_INIT_VAR(log); array_init_size(log, 3); phalcon_array_update_string(&log, SL("type"), &type_str, PH_COPY); - phalcon_array_update_string(&log, SL("message"), &message, PH_COPY); + phalcon_array_update_string(&log, SL("message"), &interpolated, PH_COPY); phalcon_array_update_string(&log, SL("timestamp"), ×tamp, PH_COPY); RETURN_MM_ON_FAILURE(phalcon_json_encode(return_value, log, 0 TSRMLS_CC)); RETURN_MM(); diff --git a/ext/logger/formatter/line.c b/ext/logger/formatter/line.c index c8bc60c3c97..a229b52a596 100644 --- a/ext/logger/formatter/line.c +++ b/ext/logger/formatter/line.c @@ -165,13 +165,13 @@ PHP_METHOD(Phalcon_Logger_Formatter_Line, getDateFormat){ */ PHP_METHOD(Phalcon_Logger_Formatter_Line, format){ - zval *message, *type, *timestamp, *format = NULL, *date_format; + zval *message, *type, *timestamp, *context, *format = NULL, *date_format; zval *date, *date_wildcard, *new_format = NULL, *type_string; zval *type_wildcard, *message_wildcard; PHALCON_MM_GROW(); - phalcon_fetch_params(1, 3, 0, &message, &type, ×tamp); + phalcon_fetch_params(1, 4, 0, &message, &type, ×tamp, &context); PHALCON_OBS_VAR(format); phalcon_read_property_this(&format, this_ptr, SL("_format"), PH_NOISY_CC); @@ -180,8 +180,7 @@ PHP_METHOD(Phalcon_Logger_Formatter_Line, format){ * Check if the format has the %date% placeholder */ if (phalcon_memnstr_str(format, SL("%date%"))) { - PHALCON_OBS_VAR(date_format); - phalcon_read_property_this(&date_format, this_ptr, SL("_dateFormat"), PH_NOISY_CC); + date_format = phalcon_fetch_nproperty_this(this_ptr, SL("_dateFormat"), PH_NOISY_CC); PHALCON_INIT_VAR(date); phalcon_date(date, date_format, timestamp TSRMLS_CC); @@ -217,8 +216,14 @@ PHP_METHOD(Phalcon_Logger_Formatter_Line, format){ PHALCON_INIT_NVAR(new_format); phalcon_fast_str_replace(new_format, message_wildcard, message, format); - PHALCON_CONCAT_VS(return_value, new_format, PHP_EOL); - + if (Z_TYPE_P(context) == IS_ARRAY) { + PHALCON_OBSERVE_OR_NULLIFY_VAR(format); + phalcon_call_method_p2_ex(format, &format, this_ptr, "interpolate", new_format, context); + } + else { + PHALCON_CPY_WRT(format, new_format); + } + + PHALCON_CONCAT_VS(return_value, format, PHP_EOL); RETURN_MM(); } - diff --git a/ext/logger/formatter/syslog.c b/ext/logger/formatter/syslog.c index 841f24816c8..c5f69de119a 100644 --- a/ext/logger/formatter/syslog.c +++ b/ext/logger/formatter/syslog.c @@ -23,6 +23,7 @@ #include "kernel/main.h" #include "kernel/array.h" +#include "kernel/fcall.h" /** * Phalcon\Logger\Formatter\Syslog @@ -60,12 +61,20 @@ PHALCON_INIT_CLASS(Phalcon_Logger_Formatter_Syslog){ */ PHP_METHOD(Phalcon_Logger_Formatter_Syslog, format){ - zval *message, *type, *timestamp; + zval *message, *type, *timestamp, *context, *interpolated = NULL; - phalcon_fetch_params(0, 3, 0, &message, &type, ×tamp); + phalcon_fetch_params(0, 4, 0, &message, &type, ×tamp, &context); + if (Z_TYPE_P(context) == IS_ARRAY) { + RETURN_ON_FAILURE(phalcon_call_method_params(interpolated, &interpolated, this_ptr, SL("interpolate"), zend_inline_hash_func(SS("interpolate")) TSRMLS_CC, 2, message, context)); + } + else { + interpolated = message; + Z_ADDREF_P(interpolated); + } + array_init_size(return_value, 2); phalcon_array_append(&return_value, type, 0); - phalcon_array_append(&return_value, message, 0); + add_next_index_zval(return_value, interpolated); return; } diff --git a/ext/logger/formatterinterface.c b/ext/logger/formatterinterface.c index e66cf623d6e..0819c0efede 100644 --- a/ext/logger/formatterinterface.c +++ b/ext/logger/formatterinterface.c @@ -43,5 +43,6 @@ PHALCON_INIT_CLASS(Phalcon_Logger_FormatterInterface){ * @param string $message * @param int $type * @param int $timestamp + * @param array $context */ PHALCON_DOC_METHOD(Phalcon_Logger_FormatterInterface, format); diff --git a/ext/logger/formatterinterface.h b/ext/logger/formatterinterface.h index 9c71d703539..541099ded5a 100644 --- a/ext/logger/formatterinterface.h +++ b/ext/logger/formatterinterface.h @@ -26,10 +26,11 @@ extern zend_class_entry *phalcon_logger_formatterinterface_ce; PHALCON_INIT_CLASS(Phalcon_Logger_FormatterInterface); -ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_formatterinterface_format, 0, 0, 3) +ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_formatterinterface_format, 0, 0, 4) ZEND_ARG_INFO(0, message) ZEND_ARG_INFO(0, type) ZEND_ARG_INFO(0, timestamp) + ZEND_ARG_INFO(0, context) ZEND_END_ARG_INFO() #endif /* PHALCON_LOGGER_FORMATTERINTERFACE_H */ diff --git a/ext/logger/item.c b/ext/logger/item.c index b33bef6eba5..bfe9af02139 100644 --- a/ext/logger/item.c +++ b/ext/logger/item.c @@ -34,6 +34,7 @@ PHP_METHOD(Phalcon_Logger_Item, __construct); PHP_METHOD(Phalcon_Logger_Item, getMessage); PHP_METHOD(Phalcon_Logger_Item, getType); PHP_METHOD(Phalcon_Logger_Item, getTime); +PHP_METHOD(Phalcon_Logger_Item, getContext); ZEND_BEGIN_ARG_INFO_EX(arginfo_phalcon_logger_item___construct, 0, 0, 2) ZEND_ARG_INFO(0, message) @@ -46,6 +47,7 @@ static const zend_function_entry phalcon_logger_item_method_entry[] = { PHP_ME(Phalcon_Logger_Item, getMessage, NULL, ZEND_ACC_PUBLIC) PHP_ME(Phalcon_Logger_Item, getType, NULL, ZEND_ACC_PUBLIC) PHP_ME(Phalcon_Logger_Item, getTime, NULL, ZEND_ACC_PUBLIC) + PHP_ME(Phalcon_Logger_Item, getContext, NULL, ZEND_ACC_PUBLIC) PHP_FE_END }; @@ -59,6 +61,7 @@ PHALCON_INIT_CLASS(Phalcon_Logger_Item){ zend_declare_property_null(phalcon_logger_item_ce, SL("_type"), ZEND_ACC_PROTECTED TSRMLS_CC); zend_declare_property_null(phalcon_logger_item_ce, SL("_message"), ZEND_ACC_PROTECTED TSRMLS_CC); zend_declare_property_null(phalcon_logger_item_ce, SL("_time"), ZEND_ACC_PROTECTED TSRMLS_CC); + zend_declare_property_null(phalcon_logger_item_ce, SL("_context"), ZEND_ACC_PROTECTED TSRMLS_CC); return SUCCESS; } @@ -72,9 +75,9 @@ PHALCON_INIT_CLASS(Phalcon_Logger_Item){ */ PHP_METHOD(Phalcon_Logger_Item, __construct){ - zval *message, *type, *time = NULL; + zval *message, *type, *time = NULL, *context = NULL; - phalcon_fetch_params(0, 2, 1, &message, &type, &time); + phalcon_fetch_params(0, 2, 2, &message, &type, &time, &context); if (!time) { time = PHALCON_GLOBAL(z_zero); @@ -83,6 +86,10 @@ PHP_METHOD(Phalcon_Logger_Item, __construct){ phalcon_update_property_this(this_ptr, SL("_message"), message TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_type"), type TSRMLS_CC); phalcon_update_property_this(this_ptr, SL("_time"), time TSRMLS_CC); + + if (context && Z_TYPE_P(context) == IS_ARRAY) { + phalcon_update_property_this(this_ptr, SL("_context"), context TSRMLS_CC); + } } /** @@ -117,3 +124,14 @@ PHP_METHOD(Phalcon_Logger_Item, getTime){ RETURN_MEMBER(this_ptr, "_time"); } + +PHP_METHOD(Phalcon_Logger_Item, getContext) { + + zval *context = phalcon_fetch_nproperty_this(getThis(), SL("_context"), PH_NOISY TSRMLS_CC); + + if (Z_TYPE_P(context) == IS_ARRAY) { + RETURN_ZVAL(context, 1, 0); + } + + array_init(return_value); +} diff --git a/ext/tests/issue-1483.phpt b/ext/tests/issue-1483.phpt index 4ea7daf2f44..556adae1e84 100644 --- a/ext/tests/issue-1483.phpt +++ b/ext/tests/issue-1483.phpt @@ -13,14 +13,14 @@ $formatter->setShowBacktrace(false); $logger = new \Phalcon\Logger\Adapter\Firephp(""); $logger->setFormatter($formatter); -$logger->log("This is a message"); -$logger->log("This is an error", \Phalcon\Logger::ERROR); +$logger->log(\Phalcon\Logger::DEBUG, "This is a message"); +$logger->log(\Phalcon\Logger::ERROR, "This is an error"); $logger->error("This is another error"); $logger->warning(str_repeat('x', 5000)); $formatter->enableLabels(false); -$logger->log("This is a message"); -$logger->log("This is an error", \Phalcon\Logger::ERROR); +$logger->log(\Phalcon\Logger::DEBUG, "This is a message"); +$logger->log(\Phalcon\Logger::ERROR, "This is an error"); ?> --EXPECTHEADERS-- X-Wf-Protocol-1: http://meta.wildfirehq.org/Protocol/JsonStream/0.2 diff --git a/ext/tests/issue-1716.phpt b/ext/tests/issue-1716.phpt index c5482b352eb..b8c1c9eaf9a 100644 --- a/ext/tests/issue-1716.phpt +++ b/ext/tests/issue-1716.phpt @@ -7,8 +7,8 @@ Phalcon\Logger\Adapter::setLogLevel() is not working properly - https://github.c $logger = new \Phalcon\Logger\Adapter\Stream("php://stdout"); $logger->setLogLevel(\Phalcon\Logger::CRITICAL); $logger->begin(); -$logger->log('info', \Phalcon\Logger::INFO); -$logger->log('critical', \Phalcon\Logger::CRITICAL); +$logger->log(\Phalcon\Logger::INFO, 'info'); +$logger->log(\Phalcon\Logger::CRITICAL, 'critical'); $logger->commit(); ?> --EXPECTF-- diff --git a/ext/tests/issue-1742.phpt b/ext/tests/issue-1742.phpt index 2536c180ff4..351c3cbc80c 100644 --- a/ext/tests/issue-1742.phpt +++ b/ext/tests/issue-1742.phpt @@ -14,8 +14,8 @@ class MyStreamAdapter extends \Phalcon\Logger\Adapter\Stream $logger = new MyStreamAdapter("php://stdout"); $logger->begin(); -$logger->log('info', \Phalcon\Logger::INFO); -$logger->log('critical', \Phalcon\Logger::CRITICAL); +$logger->log(\Phalcon\Logger::INFO, 'info'); +$logger->log(\Phalcon\Logger::CRITICAL, 'critical'); echo $logger->getQueueSize(), PHP_EOL; $logger->commit(); echo $logger->getQueueSize(), PHP_EOL; diff --git a/ext/tests/psr-3.phpt b/ext/tests/psr-3.phpt new file mode 100644 index 00000000000..8d1f5de1e0b --- /dev/null +++ b/ext/tests/psr-3.phpt @@ -0,0 +1,23 @@ +--TEST-- +Make Phalcon\Logger compatible with PSR-3 +--SKIPIF-- + +--FILE-- +log('This is a debug message'); +$logger->log('This is a warning message', \Phalcon\Logger::WARNING); + +$logger->log('debug', 'This is a debug message'); +$logger->log('warning', 'This is a warning message'); +$logger->log(\Phalcon\Logger::ERROR, 'This is an error message'); + +$logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); +?> +--EXPECTF-- +[%s, %d %s %d %d:%d:%d %s][DEBUG] This is a debug message +[%s, %d %s %d %d:%d:%d %s][WARNING] This is a warning message +[%s, %d %s %d %d:%d:%d %s][DEBUG] This is a debug message +[%s, %d %s %d %d:%d:%d %s][WARNING] This is a warning message +[%s, %d %s %d %d:%d:%d %s][ERROR] This is an error message +[%s, %d %s %d %d:%d:%d %s][INFO] {Message {nothing} Bob Bar a}