const char *app_name)
{
struct debug_settings settings = {
- .debug_syslog_format = true,
+ .debug_syslog_format = DEBUG_SYSLOG_FORMAT_ALWAYS,
.debug_hires_timestamp = true,
.debug_no_stderr_redirect = true,
};
<samba:parameter name="debug syslog format"
context="G"
- type="boolean"
+ type="enum"
+ enumlist="enum_debug_syslog_format"
xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
<description>
<para>
- With this option enabled, debug messages are printed in a
+ With this option enabled (<constant>yes</constant> (alias
+ <constant>in_logs</constant>) or
+ <constant>always</constant>), debug messages are printed in a
single-line format like that traditionally produced by syslog.
The timestamp consists of an abbreviated month, space-padded date,
and time including seconds. This is followed by the hostname and
the program name, with the process-ID in square brackets.
</para>
+ <para>The value <constant>always</constant> produces this log
+ format even to <constant>STDOUT</constant> or
+ <constant>STDERR</constant>
+ </para>
+
+ <para>The value <constant>no</constant> defers to other parameters
+ and typically produces traditional two-line Samba logs to log files.
+ </para>
+
<para>
If <smbconfoption name="debug hires timestamp"/> is also enabled
then an RFC5424 timestamp is used instead.
{-1, NULL}
};
+static const struct enum_list enum_debug_syslog_format[] = {
+ {DEBUG_SYSLOG_FORMAT_NO, "No"},
+ {DEBUG_SYSLOG_FORMAT_NO, "False"},
+ {DEBUG_SYSLOG_FORMAT_NO, "0"},
+ {DEBUG_SYSLOG_FORMAT_IN_LOGS, "in_logs"},
+ {DEBUG_SYSLOG_FORMAT_IN_LOGS, "Yes"},
+ {DEBUG_SYSLOG_FORMAT_IN_LOGS, "True"},
+ {DEBUG_SYSLOG_FORMAT_IN_LOGS, "1"},
+ {DEBUG_SYSLOG_FORMAT_ALWAYS, "always"},
+ {-1, NULL}
+};
+
/* Note: We do not initialise the defaults union - it is not allowed in ANSI C
*
* NOTE: Handling of duplicated (synonym) parameters:
static void Debug1(const char *msg, size_t msg_len)
{
int old_errno = errno;
+ enum debug_logtype logtype = state.logtype;
debug_count++;
- switch(state.logtype) {
+ if (state.settings.debug_syslog_format == DEBUG_SYSLOG_FORMAT_ALWAYS) {
+ switch(state.logtype) {
+ case DEBUG_STDOUT:
+ case DEBUG_STDERR:
+ case DEBUG_DEFAULT_STDOUT:
+ case DEBUG_DEFAULT_STDERR:
+ /* Behave the same as logging to a file */
+ logtype = DEBUG_FILE;
+ break;
+ default:
+ break;
+ }
+ }
+
+ switch(logtype) {
case DEBUG_CALLBACK:
debug_callback_log(msg, msg_len, current_msg_level);
break;
dbgsetclass(level, cls);
- /* Don't print a header if we're logging to stdout. */
- if ( state.logtype != DEBUG_FILE ) {
- return( true );
+ /*
+ * Don't print a header if we're logging to stdout,
+ * unless 'debug syslog format = always'
+ */
+ if (state.logtype != DEBUG_FILE &&
+ state.settings.debug_syslog_format != DEBUG_SYSLOG_FORMAT_ALWAYS)
+ {
+ return true;
}
- /* Print the header if timestamps are turned on. If parameters are
- * not yet loaded, then default to timestamps on.
+ /*
+ * Print the header if timestamps (or debug syslog format) is
+ * turned on. If parameters are not yet loaded, then default
+ * to timestamps on.
*/
if (!(state.settings.timestamp_logs ||
state.settings.debug_prefix_timestamp ||
- state.settings.debug_syslog_format)) {
+ state.settings.debug_syslog_format != DEBUG_SYSLOG_FORMAT_NO))
+ {
return true;
}
GetTimeOfDay(&tv);
- if (state.settings.debug_syslog_format) {
+ if (state.settings.debug_syslog_format != DEBUG_SYSLOG_FORMAT_NO) {
if (state.settings.debug_hires_timestamp) {
timeval_str_buf(&tv, true, true, &tvbuf);
} else {
DEBUG_CALLBACK = 5
};
+enum debug_syslog_format {
+ DEBUG_SYSLOG_FORMAT_NO = 0,
+ DEBUG_SYSLOG_FORMAT_IN_LOGS = 1,
+ DEBUG_SYSLOG_FORMAT_ALWAYS = 2,
+};
+
struct debug_settings {
size_t max_log_size;
bool timestamp_logs;
bool debug_prefix_timestamp;
bool debug_hires_timestamp;
- bool debug_syslog_format;
+ enum debug_syslog_format debug_syslog_format;
bool debug_pid;
bool debug_uid;
bool debug_class;