blob: 4acdf40c84c30cc0c99608336d3d989f8c87f769 [file]
.. 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 <ts/ts.h>
.. 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<int, int> (*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<int, int> TSLogStringUnmarshal(char **buf, char *dest, int len);
.. function:: std::tuple<int, int> TSLogIntUnmarshal(char **buf, char *dest, int len);
.. function:: std::tuple<int, int> 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`.