53
63
args = g_malloc0(sizeof(TFCondState) + (argc - 1) * sizeof(LogTemplate *));
54
64
args->argc = argc - 1;
55
65
lexer = cfg_lexer_new_buffer(argv[0], strlen(argv[0]));
56
if (!cfg_run_parser(parent->cfg, lexer, &filter_expr_parser, (gpointer *) &args->filter))
66
if (!cfg_run_parser(parent->cfg, lexer, &filter_expr_parser, (gpointer *) &args->filter, NULL))
58
68
g_set_error(error, LOG_TEMPLATE_ERROR, LOG_TEMPLATE_ERROR_COMPILE, "Error parsing conditional filter expression");
61
71
for (i = 1; i < argc; i++)
63
args->argv[i - 1] = log_template_new(parent->cfg, NULL, argv[i]);
73
args->argv[i - 1] = log_template_new(parent->cfg, NULL);
64
74
log_template_set_escape(args->argv[i - 1], TRUE);
65
if (!log_template_compile(args->argv[i - 1], error))
75
if (!log_template_compile(args->argv[i - 1], argv[i], error))
78
tf_cond_eval(LogTemplateFunction *self, gpointer state, GPtrArray *arg_bufs, LogMessage **messages, gint num_messages, LogTemplateOptions *opts, gint tz, gint seq_num)
88
tf_cond_eval(LogTemplateFunction *self, gpointer state, GPtrArray *arg_bufs, LogMessage **messages, gint num_messages, LogTemplateOptions *opts, gint tz, gint seq_num, const gchar *context_id)
97
tf_grep_call(LogTemplateFunction *self, gpointer state, GPtrArray *arg_bufs, LogMessage **messages, gint num_messages, LogTemplateOptions *opts, gint tz, gint seq_num, GString *result)
107
tf_grep_call(LogTemplateFunction *self, gpointer state, GPtrArray *arg_bufs, LogMessage **messages, gint num_messages, LogTemplateOptions *opts, gint tz, gint seq_num, const gchar *context_id, GString *result)
100
110
gboolean first = TRUE;
112
122
g_string_append_c(result, ',');
113
log_template_append_format(args->argv[i], msg, opts, tz, seq_num, result);
123
log_template_append_format(args->argv[i], msg, opts, tz, seq_num, context_id, result);
133
143
TEMPLATE_FUNCTION(tf_grep, tf_grep_prepare, tf_cond_eval, tf_grep_call, NULL);
136
tf_if_call(LogTemplateFunction *self, gpointer state, GPtrArray *arg_bufs, LogMessage **messages, gint num_messages, LogTemplateOptions *opts, gint tz, gint seq_num, GString *result)
146
tf_if_call(LogTemplateFunction *self, gpointer state, GPtrArray *arg_bufs, LogMessage **messages, gint num_messages, LogTemplateOptions *opts, gint tz, gint seq_num, const gchar *context_id, GString *result)
138
148
TFCondState *args = (TFCondState *) state;
142
152
msg = messages[num_messages - 1];
143
153
if (filter_expr_eval(args->filter, msg))
145
log_template_append_format(args->argv[0], msg, opts, tz, seq_num, result);
155
log_template_append_format(args->argv[0], msg, opts, tz, seq_num, context_id, result);
149
log_template_append_format(args->argv[1], msg, opts, tz, seq_num, result);
159
log_template_append_format(args->argv[1], msg, opts, tz, seq_num, context_id, result);
153
163
TEMPLATE_FUNCTION(tf_if, tf_if_prepare, tf_cond_eval, tf_if_call, NULL);
156
static Plugin builtin_tmpl_func_plugins[] =
167
tf_indent_multi_line(LogMessage *msg, gint argc, GString *argv[], GString *text)
171
/* append the message text(s) to the template string */
172
append_args(argc, argv, text);
174
/* look up the \n-s and insert a \t after them */
176
new_line = memchr(p, '\n', text->len);
179
if (*(gchar *)(new_line + 1) != '\t')
181
g_string_insert_c(text, new_line - p + 1, '\t');
183
new_line = memchr(new_line + 1, '\n', p + text->len - new_line);
187
TEMPLATE_FUNCTION_SIMPLE(tf_indent_multi_line);
189
static Plugin basicfuncs_plugins[] =
158
191
TEMPLATE_FUNCTION_PLUGIN(tf_echo, "echo"),
159
192
TEMPLATE_FUNCTION_PLUGIN(tf_grep, "grep"),
160
193
TEMPLATE_FUNCTION_PLUGIN(tf_if, "if"),
194
TEMPLATE_FUNCTION_PLUGIN(tf_indent_multi_line, "indent-multi-line"),
164
198
basicfuncs_module_init(GlobalConfig *cfg, CfgArgs *args)
166
plugin_register(cfg, builtin_tmpl_func_plugins, G_N_ELEMENTS(builtin_tmpl_func_plugins));
200
plugin_register(cfg, basicfuncs_plugins, G_N_ELEMENTS(basicfuncs_plugins));
204
const ModuleInfo module_info =
206
.canonical_name = "basicfuncs",
208
.description = "The basicfuncs module provides various template functions for syslog-ng.",
209
.core_revision = SOURCE_REVISION,
210
.plugins = basicfuncs_plugins,
211
.plugins_len = G_N_ELEMENTS(basicfuncs_plugins),