blob: 60c3a42356f36385f9139bcf7448a048a8490cd7 [file] [log] [blame]
/** @file
A brief file description
@section license License
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.
*/
#pragma once
#define LOG_FIELD_MARKER '\377'
#include "tscore/ink_platform.h"
#include "LogField.h"
enum LogFormatType {
// We start the numbering at 4 to compatibility with Traffic Server 4.x, which used
// to have the predefined log formats enumerated above ...
LOG_FORMAT_CUSTOM = 4,
LOG_FORMAT_TEXT = 5
};
enum LogFileFormat {
LOG_FILE_BINARY,
LOG_FILE_ASCII,
LOG_FILE_PIPE, // ie. ASCII pipe
N_LOGFILE_TYPES
};
/*-------------------------------------------------------------------------
LogFormat
Now, this object will simply store the characteristics of a log format,
which is defined as a set of fields.
-------------------------------------------------------------------------*/
class LogFormat : public RefCountObj
{
public:
LogFormat(const char *name, const char *format_str, unsigned interval_sec = 0);
LogFormat(const char *name, const char *fieldlist_str, const char *printf_str, unsigned interval_sec = 0);
LogFormat(const LogFormat &rhs);
~LogFormat() override;
void display(FILE *fd = stdout);
bool
valid() const
{
return m_valid;
}
char *
name() const
{
return m_name_str;
}
char *
fieldlist() const
{
return m_fieldlist_str;
}
char *
format_string() const
{
return m_format_str;
}
int32_t
name_id() const
{
return m_name_id;
}
unsigned
fieldlist_id() const
{
return m_fieldlist_id;
}
LogFormatType
type() const
{
return m_format_type;
}
char *
printf_str() const
{
return m_printf_str;
}
bool
is_aggregate() const
{
return m_aggregate;
}
unsigned
field_count() const
{
return m_field_count;
}
long
interval() const
{
return m_interval_sec;
}
public:
static int32_t id_from_name(const char *name);
static LogFormat *format_from_specification(char *spec, char **file_name, char **file_header, LogFileFormat *file_type);
static int parse_symbol_string(const char *symbol_string, LogFieldList *field_list, bool *contains_aggregates);
static int parse_format_string(const char *format_str, char **printf_str, char **fields_str);
static int parse_escape_string(const char *str, int len);
// these are static because m_tagging_on is a class variable
static void
turn_tagging_on()
{
m_tagging_on = true;
}
static void
turn_tagging_off()
{
m_tagging_on = false;
}
private:
bool setup(const char *name, const char *format_str, unsigned interval_sec = 0);
void init_variables(const char *name, const char *fieldlist_str, const char *printf_str, unsigned interval_sec);
public:
LogFieldList m_field_list;
long m_interval_sec;
long m_interval_next;
char *m_agg_marshal_space;
private:
static bool m_tagging_on; // flag to control tagging, class
// variable
bool m_valid;
char *m_name_str;
int32_t m_name_id;
char *m_fieldlist_str;
unsigned m_fieldlist_id;
unsigned m_field_count;
char *m_printf_str;
bool m_aggregate;
char *m_format_str;
LogFormatType m_format_type;
public:
LINK(LogFormat, link);
// noncopyable
LogFormat &operator=(LogFormat &rhs) = delete;
private:
// -- member functions that are not allowed --
LogFormat();
};
// For text logs, there is no format string; we'll simply log the
// entire entry as a string without any field substitutions. To
// indicate this, the format_str will be NULL.
static inline LogFormat *
MakeTextLogFormat(const char *name = "text")
{
return new LogFormat(name, nullptr /* format_str */);
}
/*-------------------------------------------------------------------------
LogFormatList
-------------------------------------------------------------------------*/
class LogFormatList
{
public:
LogFormatList();
~LogFormatList();
void add(LogFormat *format, bool copy = true);
LogFormat *find_by_name(const char *name) const;
LogFormat *
first() const
{
return m_format_list.head;
}
LogFormat *
next(LogFormat *here) const
{
return (here->link).next;
}
void clear();
unsigned count();
void display(FILE *fd = stdout);
// noncopyable
// -- member functions that are not allowed --
LogFormatList(const LogFormatList &rhs) = delete;
LogFormatList &operator=(const LogFormatList &rhs) = delete;
private:
Queue<LogFormat> m_format_list;
};