* Add libvlc_audio_output_device_get to get the currently selected audio output device
identifier (if there is one available)
+Logging
+ * Use --syslog and --syslog-debug command line options to include debug
+ messages in syslog. With --syslog, errors and warnings will be sent only.
+
Changes between 2.1.x and 2.2.0:
--------------------------------
])
AC_SUBST(LIBPTHREAD)
+dnl
dnl Check for headers
+dnl
+
dnl POSIX
-AC_CHECK_HEADERS([arpa/inet.h pthread.h search.h syslog.h sys/shm.h sys/socket.h])
+AC_CHECK_HEADERS([arpa/inet.h pthread.h search.h sys/shm.h sys/socket.h])
AC_CHECK_HEADERS([net/if.h], [], [],
[
#include <sys/types.h>
#include <sys/socket.h>
])
+AC_CHECK_HEADER([syslog.h], [have_syslog="yes"], [have_syslog="no"])
+AM_CONDITIONAL([HAVE_SYSLOG], [test "$have_syslog" = "yes"])
+
dnl BSD
AC_CHECK_HEADERS([netinet/udplite.h sys/param.h sys/mount.h])
+
dnl GNU/Linux
AC_CHECK_HEADERS([getopt.h linux/dccp.h linux/magic.h mntent.h sys/eventfd.h])
+
dnl MacOS
AC_CHECK_HEADERS([xlocale.h])
loggerdir = $(pluginsdir)/logger
libconsole_logger_plugin_la_SOURCES = logger/console.c
-
logger_LTLIBRARIES = libconsole_logger_plugin.la
+
+libsyslog_plugin_la_SOURCES = logger/syslog.c
+if HAVE_SYSLOG
+logger_LTLIBRARIES += libsyslog_plugin.la
+endif
--- /dev/null
+/*****************************************************************************
+ * syslog.c: POSIX syslog logger plugin
+ *****************************************************************************
+ * Copyright (C) 2002-2008 the VideoLAN team
+ * Copyright © 2007-2015 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+
+#include <stdarg.h>
+#include <syslog.h>
+
+static const int priorities[4] = {
+ [VLC_MSG_INFO] = LOG_INFO,
+ [VLC_MSG_ERR] = LOG_ERR,
+ [VLC_MSG_WARN] = LOG_WARNING,
+ [VLC_MSG_DBG] = LOG_DEBUG,
+};
+
+static void Log(void *opaque, int type, const vlc_log_t *meta,
+ const char *format, va_list ap)
+{
+ static const char default_msg[] = "message lost";
+ char *str;
+ int priority = priorities[type];
+
+ int canc = vlc_savecancel();
+
+ if (vasprintf(&str, format, ap) == -1)
+ str = (char *)default_msg;
+
+ if (meta->psz_header != NULL)
+ syslog(priority, "[%s] %s: %s", meta->psz_header, meta->psz_module,
+ str);
+ else
+ syslog(priority, "%s: %s", meta->psz_module, str);
+ vlc_restorecancel(canc);
+
+ if (str != default_msg)
+ free(str);
+ (void) opaque;
+}
+
+/* First in list is the default facility used. */
+#define DEFINE_SYSLOG_FACILITY \
+ DEF("user", LOG_USER), \
+ DEF("daemon", LOG_DAEMON), \
+ DEF("local0", LOG_LOCAL0), \
+ DEF("local1", LOG_LOCAL1), \
+ DEF("local2", LOG_LOCAL2), \
+ DEF("local3", LOG_LOCAL3), \
+ DEF("local4", LOG_LOCAL4), \
+ DEF("local5", LOG_LOCAL5), \
+ DEF("local6", LOG_LOCAL6), \
+ DEF("local7", LOG_LOCAL7)
+
+#define DEF(a,b) a
+static const char *const fac_names[] = { DEFINE_SYSLOG_FACILITY };
+#undef DEF
+#define DEF(a,b) b
+static const int fac_ids[] = { DEFINE_SYSLOG_FACILITY };
+#undef DEF
+#undef DEFINE_SYSLOG_FACILITY
+
+static int var_InheritFacility(vlc_object_t *obj, const char *varname)
+{
+ char *str = var_InheritString(obj, varname);
+ if (unlikely(str == NULL))
+ return LOG_USER; /* LOG_USEr is the spec default. */
+
+ for (size_t i = 0; i < sizeof (fac_ids) / sizeof (fac_ids[0]); i++)
+ {
+ if (!strcmp(str, fac_names[i]))
+ {
+ free(str);
+ return fac_ids[i];
+ }
+ }
+
+ msg_Warn(obj, "unknown syslog facility \"%s\"", str);
+ free(str);
+ return LOG_USER;
+}
+
+static const char default_ident[] = PACKAGE;
+
+static vlc_log_cb Open(vlc_object_t *obj, void **sysp)
+{
+ if (!var_InheritBool(obj, "syslog"))
+ return NULL;
+
+ char *ident = var_InheritString(obj, "syslog-ident");
+ if (ident == NULL)
+ ident = (char *)default_ident;
+ *sysp = ident;
+
+ /* Open log */
+ int facility = var_InheritFacility(obj, "syslog-facility");
+
+ openlog(ident, LOG_PID | LOG_NDELAY, facility);
+
+ /* Set priority filter */
+ int mask = LOG_MASK(LOG_ERR) | LOG_MASK(LOG_WARNING) | LOG_MASK(LOG_INFO);
+ if (var_InheritBool(obj, "syslog-debug"))
+ mask |= LOG_MASK(LOG_DEBUG);
+
+ setlogmask(mask);
+
+ return Log;
+}
+
+static void Close(void *opaque)
+{
+ char *ident = opaque;
+
+ closelog();
+ if (ident != default_ident)
+ free(ident);
+}
+
+#define SYSLOG_TEXT N_("System log (syslog)")
+#define SYSLOG_LONGTEXT N_("Emit log messages through the POSIX system log.")
+
+#define SYSLOG_DEBUG_TEXT N_("Debug messages")
+#define SYSLOG_DEBUG_LONGTEXT N_("Include debug messages in system log.")
+
+#define SYSLOG_IDENT_TEXT N_("Identity")
+#define SYSLOG_IDENT_LONGTEXT N_("Process identity in system log.")
+
+#define SYSLOG_FACILITY_TEXT N_("Facility")
+#define SYSLOG_FACILITY_LONGTEXT N_("System logging facility.")
+
+vlc_module_begin()
+ set_shortname(N_( "syslog" ))
+ set_description(N_("System logger (syslog)"))
+ set_category(CAT_ADVANCED)
+ set_subcategory(SUBCAT_ADVANCED_MISC)
+ set_capability("logger", 20)
+ set_callbacks(Open, Close)
+
+ add_bool("syslog", false, SYSLOG_TEXT, SYSLOG_LONGTEXT,
+ false)
+ add_bool("syslog-debug", false, SYSLOG_DEBUG_TEXT, SYSLOG_DEBUG_LONGTEXT,
+ false)
+ add_string("syslog-ident", default_ident, SYSLOG_IDENT_TEXT,
+ SYSLOG_IDENT_LONGTEXT, true)
+ add_string("syslog-facility", fac_names[0], SYSLOG_FACILITY_TEXT,
+ SYSLOG_FACILITY_LONGTEXT, true)
+ change_string_list(fac_names, fac_names)
+vlc_module_end()
" </body>\n" \
"</html>\n"
-#ifdef HAVE_SYSLOG_H
-#include <syslog.h>
-#endif
-
/*****************************************************************************
* intf_sys_t: description and status of log interface
*****************************************************************************/
{
FILE *p_file;
const char *footer;
- char *ident;
};
/*****************************************************************************
static void TextPrint(void *, int, const vlc_log_t *, const char *, va_list);
static void HtmlPrint(void *, int, const vlc_log_t *, const char *, va_list);
-#ifdef HAVE_SYSLOG_H
-static void SyslogPrint(void *, int, const vlc_log_t *, const char *, va_list);
-#endif
#ifdef __ANDROID__
static void AndroidPrint(void *, int, const vlc_log_t *, const char *, va_list);
#endif
* Module descriptor
*****************************************************************************/
static const char *const mode_list[] = { "text", "html"
-#ifdef HAVE_SYSLOG_H
-,"syslog"
-#endif
#ifdef __ANDROID__
,"android"
#endif
};
static const char *const mode_list_text[] = { N_("Text"), "HTML"
-#ifdef HAVE_SYSLOG_H
-, "syslog"
-#endif
#ifdef __ANDROID__
,"android"
#endif
#define LOGMODE_TEXT N_("Log format")
#define LOGMODE_LONGTEXT N_("Specify the logging format.")
-#ifdef HAVE_SYSLOG_H
-#define SYSLOG_IDENT_TEXT N_("Syslog ident")
-#define SYSLOG_IDENT_LONGTEXT N_("Set the ident that VLC would use when " \
- "logging to syslog.")
-
-#define SYSLOG_FACILITY_TEXT N_("Syslog facility")
-#define SYSLOG_FACILITY_LONGTEXT N_("Select the syslog facility where logs " \
- "will be forwarded.")
-
-/* First in list is the default facility used. */
-#define DEFINE_SYSLOG_FACILITY \
- DEF( "user", LOG_USER ), \
- DEF( "daemon", LOG_DAEMON ), \
- DEF( "local0", LOG_LOCAL0 ), \
- DEF( "local1", LOG_LOCAL1 ), \
- DEF( "local2", LOG_LOCAL2 ), \
- DEF( "local3", LOG_LOCAL3 ), \
- DEF( "local4", LOG_LOCAL4 ), \
- DEF( "local5", LOG_LOCAL5 ), \
- DEF( "local6", LOG_LOCAL6 ), \
- DEF( "local7", LOG_LOCAL7 )
-
-#define DEF( a, b ) a
-static const char *const fac_name[] = { DEFINE_SYSLOG_FACILITY };
-#undef DEF
-#define DEF( a, b ) b
-static const int fac_number[] = { DEFINE_SYSLOG_FACILITY };
-#undef DEF
-enum { fac_entries = sizeof(fac_name)/sizeof(fac_name[0]) };
-#undef DEFINE_SYSLOG_FACILITY
-
-#endif
-
#define LOGVERBOSE_TEXT N_("Verbosity")
#define LOGVERBOSE_LONGTEXT N_("Select the verbosity to use for log or -1 to " \
"use the same verbosity given by --verbose.")
add_string( "logmode", "text", LOGMODE_TEXT, LOGMODE_LONGTEXT,
false )
change_string_list( mode_list, mode_list_text )
-#ifdef HAVE_SYSLOG_H
- add_string( "syslog-ident", "vlc", SYSLOG_IDENT_TEXT,
- SYSLOG_IDENT_LONGTEXT, true )
- add_string( "syslog-facility", fac_name[0], SYSLOG_FACILITY_TEXT,
- SYSLOG_FACILITY_LONGTEXT, true )
- change_string_list( fac_name, fac_name )
-#endif
add_integer( "log-verbose", -1, LOGVERBOSE_TEXT, LOGVERBOSE_LONGTEXT,
false )
header = HTML_HEADER;
cb = HtmlPrint;
}
-#ifdef HAVE_SYSLOG_H
- else if( !strcmp( mode, "syslog" ) )
- cb = SyslogPrint;
-#endif
#ifdef __ANDROID__
else if( !strcmp( mode, "android" ) )
cb = AndroidPrint;
free( mode );
}
-#ifdef HAVE_SYSLOG_H
- if( cb == SyslogPrint )
- {
- int i_facility;
- char *psz_facility = var_InheritString( p_intf, "syslog-facility" );
- if( psz_facility )
- {
- bool b_valid = 0;
- for( size_t i = 0; i < fac_entries; ++i )
- {
- if( !strcmp( psz_facility, fac_name[i] ) )
- {
- i_facility = fac_number[i];
- b_valid = 1;
- break;
- }
- }
- if( !b_valid )
- {
- msg_Warn( p_intf, "invalid syslog facility `%s', using `%s'",
- psz_facility, fac_name[0] );
- i_facility = fac_number[0];
- }
- free( psz_facility );
- }
- else
- {
- msg_Warn( p_intf, "no syslog facility specified, using `%s'",
- fac_name[0] );
- i_facility = fac_number[0];
- }
-
- char *psz_syslog_ident = var_InheritString( p_intf, "syslog-ident" );
- if (unlikely(psz_syslog_ident == NULL))
- {
- free( p_sys );
- return VLC_ENOMEM;
- }
-
- p_sys->ident = psz_syslog_ident;
- openlog( p_sys->ident, LOG_PID|LOG_NDELAY, i_facility );
-
- p_sys->p_file = NULL;
- }
- else
-#endif
#ifdef __ANDROID__
if( cb == AndroidPrint )
{
vlc_LogSet( p_intf->p_libvlc, NULL, NULL );
/* Close the log file */
-#ifdef HAVE_SYSLOG_H
- if( p_sys->p_file == NULL )
- {
- closelog();
- free( p_sys->ident );
- }
- else
-#endif
if( p_sys->p_file )
{
fputs( p_sys->footer, p_sys->p_file );
vlc_restorecancel( canc );
}
-#ifdef HAVE_SYSLOG_H
-static void SyslogPrint( void *opaque, int type, const vlc_log_t *item,
- const char *fmt, va_list ap )
-{
- static const int i_prio[4] = { LOG_INFO, LOG_ERR, LOG_WARNING, LOG_DEBUG };
-
- intf_thread_t *p_intf = opaque;
- char *str;
- int i_priority = i_prio[type];
-
- if( IgnoreMessage( p_intf, type )
- || unlikely(vasprintf( &str, fmt, ap ) == -1) )
- return;
-
- int canc = vlc_savecancel();
- if( item->psz_header != NULL )
- syslog( i_priority, "[%s] %s%s: %s", item->psz_header,
- item->psz_module, ppsz_type[type], str );
- else
- syslog( i_priority, "%s%s: %s",
- item->psz_module, ppsz_type[type], str );
- vlc_restorecancel( canc );
- free( str );
-}
-#endif
-
static void HtmlPrint( void *opaque, int type, const vlc_log_t *item,
const char *fmt, va_list ap )
{
#define FILE_LOG_LONGTEXT N_( \
"Log all VLC messages to a text file." )
-#define SYSLOG_TEXT N_( "Log to syslog" )
-#define SYSLOG_LONGTEXT N_( \
- "Log all VLC messages to syslog (UNIX systems)." )
-
#define ONEINSTANCE_TEXT N_("Allow only one running instance")
#if defined( _WIN32 ) || defined( __OS2__ )
#define ONEINSTANCE_LONGTEXT N_( \
add_bool( "file-logging", false, FILE_LOG_TEXT, FILE_LOG_LONGTEXT,
true )
-#ifdef HAVE_SYSLOG_H
- add_bool ( "syslog", false, SYSLOG_TEXT, SYSLOG_LONGTEXT,
- true )
-#endif
#if defined (_WIN32) || defined (__APPLE__)
add_obsolete_string( "language" ) /* since 2.1.0 */
free( psz_modules );
free( psz_control );
-#ifdef HAVE_SYSLOG_H
- if( var_InheritBool( p_libvlc, "syslog" ) )
- {
- char *logmode = var_CreateGetNonEmptyString( p_libvlc, "logmode" );
- var_SetString( p_libvlc, "logmode", "syslog" );
- libvlc_InternalAddIntf( p_libvlc, "logger,none" );
-
- if( logmode )
- {
- var_SetString( p_libvlc, "logmode", logmode );
- free( logmode );
- }
- var_Destroy( p_libvlc, "logmode" );
- }
- else
-#endif
if( var_InheritBool( p_libvlc, "file-logging" ) )
libvlc_InternalAddIntf( p_libvlc, "logger,none" );