.. 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:: ../../../common.defs .. default-domain:: cpp TSLogFieldRegister ****************** Registers a custom log field, or modifies an existing log field with a new definition. Synopsis ======== .. code-block:: cpp #include .. function:: TSReturnCode TSLogFieldRegister(std::string_view name, std::string_view symbol, TSLogType type, TSLogMarshalCallback marshal_cb, TSLogUnmarshalCallback unmarshal_cb, bool replace = false); .. enum:: TSLogType Specify the type of a log field .. enumerator:: TS_LOG_TYPE_INT Integer field. .. enumerator:: TS_LOG_TYPE_STRING String field. .. enumerator:: TS_LOG_TYPE_ADDR Address field. It supports IPv4 address, IPv6 address, and Unix Domain Socket address (path). .. type:: int (*TSLogMarshalCallback)(TSHttpTxn, char *); Callback signature for functions to marshal log fields. .. type:: std::tuple (*TSLogUnmarshalCallback)(char **, char *, int); Callback signature for functions to unmarshal log fields. .. function:: int TSLogStringMarshal(char *buf, std::string_view str); .. function:: int TSLogIntMarshal(char *buf, int64_t value); .. function:: int TSLogAddrMarshal(char *buf, sockaddr *addr); .. function:: std::tuple TSLogStringUnmarshal(char **buf, char *dest, int len); .. function:: std::tuple TSLogIntUnmarshal(char **buf, char *dest, int len); .. function:: std::tuple TSLogAddrUnmarshal(char **buf, char *dest, int len); Predefined marshaling and unmarshaling functions. Description =========== The function registers or modifies a log field for access log. This is useful if you want to log something that |TS| does not expose, log plugin state, or redefine existing log fields. The `name` is a human friendly name, and only used for debugging. The `symbol` is the keyword you'd want to use on logging.yaml for the log field. It needs to be unique unless you are replacing an existing field by passing `true` to the optional argument `replace`, otherwise the API call fails. The `type` is the data type of a log field. You can log any data as a string value, but please note that aggregating functions such as AVG and SUM are only available for integer log fields. In many cases, you don't need to write code for marshaling and unmarshaling from scratch. The predefined functions are provided for your convenience, and you only needs to pass a value that you want to log, Example: .. code-block:: cpp TSLogFieldRegister("Example", "exmpl", TS_LOG_TYPE_INT, [](TSHttpTxn txnp, char *buf) -> int { return TSLogIntMarshal(buf, 123); }, TSLogIntUnmarshal); Return Values ============= :func:`TSLogFieldRegister` returns :enumerator:`TS_SUCCESS` if it successfully registeres a new field, or :enumerator:`TS_ERROR` if it fails due to symbol conflict. If :arg:`replace` is set to `true`, the function resolve the conflict by replacing the existing field definition with a new one, and returns :enumerator:`TS_SUCCESS`.