Project

General

Profile

Bug #73 » 0001-Making-logging-configurable.-If-no-logging-outputs-a.patch

Jason Ish, 02/03/2010 05:45 PM

View differences:

src/util-debug.c
SCError SCLogMessage(SCLogLevel log_level, char **msg, const char *file,
unsigned line, const char *function)
{
char *temp_fmt = strdup(sc_log_config->log_format);
char *temp_fmt = strdup(sc_log_config->log_format);
char *temp_fmt_h = temp_fmt;
char *substr = temp_fmt;
char *substr = temp_fmt;
char *temp = *msg;
const char *s = NULL;
......
void SCLogLoadConfig(void)
{
ConfNode *outputs;
SCLogInitData *sc_lid;
outputs = ConfGetNode("logging.output");
outputs = ConfGetNode("logging.outputs");
if (outputs == NULL) {
SCLogDebug("No logging.output configuration section found.");
return;
}
/* Process each output. */
ConfNode *output;
TAILQ_FOREACH(output, &outputs->head, next) {
//ConfNode *param;
const char *interface = NULL;
const char *log_level = NULL;
const char *facility = NULL;
//const char *filename = NULL;
const char *format = NULL;
interface = ConfNodeLookupChildValue(output, "interface");
if (interface == NULL) {
/* No interface in this item, ignore. */
continue;
}
if (SCMapEnumNameToValue(interface, sc_log_op_iface_map) < 0) {
SCLogError(SC_INVALID_ARGUMENT,
"Invalid logging interface: %s", interface);
sc_lid = SCLogAllocLogInitData();
/* Get default log level and format. */
char *default_log_level_s = NULL;
if (ConfGet("logging.default-log-level", &default_log_level_s) == 1) {
sc_lid->global_log_level =
SCMapEnumNameToValue(default_log_level_s, sc_log_level_map);
if (sc_lid->global_log_level == -1) {
SCLogError(SC_INVALID_ARGUMENT, "Invalid default log level: %s",
default_log_level_s);
exit(EXIT_FAILURE);
}
}
else {
SCLogWarning(SC_ERR_MISSING_CONFIG_PARAM,
"No default log level set, will use info.");
sc_lid->global_log_level = SC_LOG_INFO;
}
if (ConfGet("logging.default-log-format", &sc_lid->global_log_format) != 1)
sc_lid->global_log_format = SC_LOG_DEF_LOG_FORMAT;
ConfNode *seq_node, *output;
TAILQ_FOREACH(seq_node, &outputs->head, next) {
SCLogLevel level = sc_lid->global_log_level;
SCLogOPIfaceCtx *op_iface_ctx = NULL;
const char *format;
const char *level_s;
output = ConfNodeLookupChild(seq_node, seq_node->val);
if (output == NULL)
continue;
/* Any output may have a log-level set. */
log_level = ConfNodeLookupChildValue(output, "log-level");
/* By default an output is enabled. */
const char *enabled = ConfNodeLookupChildValue(output, "enabled");
if (enabled != NULL && strcmp(enabled, "no") == 0)
continue;
/* Any output may have a format set. */
format = ConfNodeLookupChildValue(output, "format");
level_s = ConfNodeLookupChildValue(output, "level");
if (level_s != NULL) {
level = SCMapEnumNameToValue(level_s, sc_log_level_map);
if (level == -1) {
SCLogError(SC_INVALID_ARGUMENT, "Invalid log level: %s",
level_s);
exit(EXIT_FAILURE);
}
}
if (strcmp(interface, "console") == 0) {
/* No other lookups required for console logging. */
/* \todo Setup console logging... */
if (strcmp(output->name, "console") == 0) {
op_iface_ctx = SCLogInitConsoleOPIface(format, level);
}
else if (strcmp(output->name, "file") == 0) {
const char *filename = ConfNodeLookupChildValue(output, "filename");
if (filename == NULL) {
SCLogError(SC_ERR_MISSING_CONFIG_PARAM,
"Logging to file requires a filename");
exit(EXIT_FAILURE);
}
op_iface_ctx = SCLogInitFileOPIface(filename, format, level);
}
else if (strcmp(interface, "syslog") == 0) {
/* \todo Setup syslog logging. */
facility = ConfNodeLookupChildValue(output, "facility");
else if (strcmp(output->name, "syslog") == 0) {
int facility = SC_LOG_DEF_SYSLOG_FACILITY;
const char *facility_s = ConfNodeLookupChildValue(output,
"facility");
if (facility_s != NULL) {
facility = SCMapEnumNameToValue(facility_s,
sc_syslog_facility_map);
if (facility == -1) {
SCLogError(SC_INVALID_ARGUMENT,
"Invalid syslog facility: %s", facility_s);
exit(EXIT_FAILURE);
}
}
printf("Initialization syslog logging with format \"%s\".\n",
format);
op_iface_ctx = SCLogInitSyslogOPIface(facility, format, level);
}
else {
SCLogWarning(SC_UNIMPLEMENTED,
"Ignoring unknown logging interface: %s", interface);
SCLogWarning(SC_INVALID_ARGUMENT, "Invalid logging method: %s, "
"ignoring", output->name);
}
if (op_iface_ctx != NULL) {
SCLogAppendOPIfaceCtx(op_iface_ctx, sc_lid);
}
}
SCLogInitLogModule(sc_lid);
//exit(1);
/* \todo Can we free sc_lid now? */
}
/**
src/util-error.c
CASE_CODE (SC_ERR_MISSING_QUOTE);
CASE_CODE (SC_ERR_UNKNOWN_PROTOCOL);
CASE_CODE (SC_ERR_UNKNOWN_RUN_MODE);
CASE_CODE (SC_ERR_MISSING_CONFIG_PARAM);
default:
return "UNKNOWN_ERROR";
}
src/util-error.h
SC_ERR_STAT_ERROR,
SC_ERR_LOGDIR_CONFIG,
SC_ERR_LOGDIR_CMDLINE,
SC_ERR_MISSING_CONFIG_PARAM,
SC_RADIX_TREE_GENERIC_ERROR,
SC_ERR_MISSING_QUOTE,
SC_ERR_MUTEX,
suricata.yaml
# overridden with the -l command line parameter.
default-log-dir: /var/log/suricata
# Configure the type of alert (and other) logging you would like.
outputs:
- fast:
......
logging:
# The default log level, can be overridden in an output section.
default-log-level: debug
# Note that debug level logging will only be emitted if Suricata was
# compiled with the --enable-debug configure option.
default-log-level: info
# The default output format. Optional parameter, should default to
# something reasonable if not provided. Can be overriden in an
# output section.
default-format: "<%t> - <%l>"
# Default startup message. Optional parameter, should default to
# something reasonable if not provided. Can be overridden in an
# output section.
default-startup-message: Your IDS has started.
# output section. You can leave this out to get the default.
#default-log-format: "[%i] %t - (%f:%l) <%d> (%n) -- "
# A regex to filter output. Can be overridden in an output section.
# Defaults to empty (no filter).
default-output-filter:
# Configure the outputs. If no outputs are specified the engine
# will log to the console with an error log level.
output:
# Enable logging to the console. Be a little more verbose than
# default, log info and more critical.
- interface: console
log-level: error
# Log to a file as well. No log level specified so level will be
# set to the default-log-level.
- interface: file
filename: /var/log/suricata.log
# Log to syslog with facility local5. Again, no level specified so
# will level will be set to default-log-level. We also override the
# format as we don't want to log a timestamp, syslog will do that
# for us.
- interface: syslog
facility: local5
format: "%l"
# Define your logging outputs. If none are define, or they are all
# disabled you will get the default - console output.
outputs:
- console:
enabled: yes
- file:
enabled: no
filename: /var/log/suricata.log
- syslog:
enabled: no
facility: local5
format: "[%i] <%d> -- "
# PF_RING configuration. for use with native PF_RING support
# for more info see http://www.ntop.org/PF_RING.html
(1-1/2)