Commit f83d51d4 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

logger: dispatch message directly to the correct function + clean up

parent 63d1c692
...@@ -80,7 +80,7 @@ struct intf_sys_t ...@@ -80,7 +80,7 @@ struct intf_sys_t
{ {
msg_subscription_t *p_sub; msg_subscription_t *p_sub;
FILE *p_file; FILE *p_file;
int i_mode; const char *footer;
}; };
/***************************************************************************** /*****************************************************************************
...@@ -89,11 +89,11 @@ struct intf_sys_t ...@@ -89,11 +89,11 @@ struct intf_sys_t
static int Open ( vlc_object_t * ); static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * ); static void Close ( vlc_object_t * );
static void Overflow (void *, int, const msg_item_t *, const char *, va_list); static void TextPrint(void *, int, const msg_item_t *, const char *, va_list);
static void TextPrint (FILE *, int, const msg_item_t *, const char *); static void HtmlPrint(void *, int, const msg_item_t *, const char *, va_list);
static void HtmlPrint (FILE *, int, const msg_item_t *, const char *);
#ifdef HAVE_SYSLOG_H #ifdef HAVE_SYSLOG_H
static void SyslogPrint (int, const msg_item_t *, const char *); static void SyslogPrint(void *, int, const msg_item_t *, const char *,
va_list);
#endif #endif
/***************************************************************************** /*****************************************************************************
...@@ -186,7 +186,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -186,7 +186,6 @@ static int Open( vlc_object_t *p_this )
{ {
intf_thread_t *p_intf = (intf_thread_t *)p_this; intf_thread_t *p_intf = (intf_thread_t *)p_this;
intf_sys_t *p_sys; intf_sys_t *p_sys;
char *psz_mode;
CONSOLE_INTRO_MSG; CONSOLE_INTRO_MSG;
msg_Info( p_intf, "using logger." ); msg_Info( p_intf, "using logger." );
...@@ -196,93 +195,31 @@ static int Open( vlc_object_t *p_this ) ...@@ -196,93 +195,31 @@ static int Open( vlc_object_t *p_this )
if( p_sys == NULL ) if( p_sys == NULL )
return VLC_ENOMEM; return VLC_ENOMEM;
p_sys->i_mode = MODE_TEXT; msg_callback_t cb = TextPrint;
psz_mode = var_InheritString( p_intf, "logmode" ); const char *filename = LOG_FILE_TEXT, *header = TEXT_HEADER;
if( psz_mode ) p_sys->footer = TEXT_FOOTER;
{
if( !strcmp( psz_mode, "text" ) )
;
else if( !strcmp( psz_mode, "html" ) )
{
p_sys->i_mode = MODE_HTML;
}
#ifdef HAVE_SYSLOG_H
else if( !strcmp( psz_mode, "syslog" ) )
{
p_sys->i_mode = MODE_SYSLOG;
}
#endif
else
{
msg_Warn( p_intf, "invalid log mode `%s', using `text'", psz_mode );
p_sys->i_mode = MODE_TEXT;
}
free( psz_mode );
}
else
{
msg_Warn( p_intf, "no log mode specified, using `text'" );
}
if( p_sys->i_mode != MODE_SYSLOG ) char *mode = var_InheritString( p_intf, "logmode" );
{ if( mode != NULL )
char *psz_file = var_InheritString( p_intf, "logfile" );
if( !psz_file )
{ {
#ifdef __APPLE__ if( !strcmp( mode, "html" ) )
char *home = config_GetUserDir(VLC_DOCUMENTS_DIR);
if( home == NULL
|| asprintf( &psz_file, "%s/"LOG_DIR"/%s", home,
(p_sys->i_mode == MODE_HTML) ? LOG_FILE_HTML
: LOG_FILE_TEXT ) == -1 )
psz_file = NULL;
free(home);
#else
switch( p_sys->i_mode )
{ {
case MODE_HTML: p_sys->footer = HTML_FOOTER;
psz_file = strdup( LOG_FILE_HTML ); header = HTML_HEADER;
break; cb = HtmlPrint;
case MODE_TEXT:
default:
psz_file = strdup( LOG_FILE_TEXT );
break;
} }
#ifdef HAVE_SYSLOG_H
else if( !strcmp( mode, "syslog" ) )
cb = SyslogPrint;
#endif #endif
msg_Warn( p_intf, "no log filename provided, using `%s'", else if( strcmp( mode, "text" ) )
psz_file ); msg_Warn( p_intf, "invalid log mode `%s', using `text'", mode );
free( mode );
} }
/* Open the log file and remove any buffering for the stream */
msg_Dbg( p_intf, "opening logfile `%s'", psz_file );
p_sys->p_file = vlc_fopen( psz_file, "at" );
if( p_sys->p_file == NULL )
{
msg_Err( p_intf, "error opening logfile `%s'", psz_file );
free( p_sys );
free( psz_file );
return -1;
}
setvbuf( p_sys->p_file, NULL, _IONBF, 0 );
free( psz_file );
switch( p_sys->i_mode )
{
case MODE_HTML:
fputs( HTML_HEADER, p_sys->p_file );
break;
case MODE_TEXT:
default:
fputs( TEXT_HEADER, p_sys->p_file );
break;
}
}
else
{
p_sys->p_file = NULL;
#ifdef HAVE_SYSLOG_H #ifdef HAVE_SYSLOG_H
if( cb == SyslogPrint )
{
int i_facility; int i_facility;
char *psz_facility = var_InheritString( p_intf, "syslog-facility" ); char *psz_facility = var_InheritString( p_intf, "syslog-facility" );
if( psz_facility ) if( psz_facility )
...@@ -313,12 +250,45 @@ static int Open( vlc_object_t *p_this ) ...@@ -313,12 +250,45 @@ static int Open( vlc_object_t *p_this )
} }
openlog( "vlc", LOG_PID|LOG_NDELAY, i_facility ); openlog( "vlc", LOG_PID|LOG_NDELAY, i_facility );
p_sys->p_file = NULL;
}
else
#endif #endif
{
char *psz_file = var_InheritString( p_intf, "logfile" );
if( !psz_file )
{
#ifdef __APPLE__
char *home = config_GetUserDir(VLC_DOCUMENTS_DIR);
if( home == NULL
|| asprintf( &psz_file, "%s/"LOG_DIR"/%s", home,
filename ) == -1 )
psz_file = NULL;
free(home);
filename = psz_file;
#endif
msg_Warn( p_intf, "no log filename provided, using `%s'",
filename );
} }
else
filename = psz_file;
p_sys->p_sub = vlc_Subscribe( Overflow, p_intf ); /* Open the log file and remove any buffering for the stream */
msg_Dbg( p_intf, "opening logfile `%s'", filename );
p_sys->p_file = vlc_fopen( filename, "at" );
free( psz_file );
if( p_sys->p_file == NULL )
{
msg_Err( p_intf, "error opening logfile `%s': %m", filename );
free( p_sys );
return VLC_EGENERIC;
}
setvbuf( p_sys->p_file, NULL, _IONBF, 0 );
fputs( header, p_sys->p_file );
}
return 0; p_sys->p_sub = vlc_Subscribe( cb, p_intf );
return VLC_SUCCESS;
} }
/***************************************************************************** /*****************************************************************************
...@@ -330,114 +300,108 @@ static void Close( vlc_object_t *p_this ) ...@@ -330,114 +300,108 @@ static void Close( vlc_object_t *p_this )
intf_sys_t *p_sys = p_intf->p_sys; intf_sys_t *p_sys = p_intf->p_sys;
/* Flush the queue and unsubscribe from the message queue */ /* Flush the queue and unsubscribe from the message queue */
/* FIXME: flush */
vlc_Unsubscribe( p_sys->p_sub ); vlc_Unsubscribe( p_sys->p_sub );
switch( p_sys->i_mode ) /* Close the log file */
{
case MODE_HTML:
fputs( HTML_FOOTER, p_sys->p_file );
break;
#ifdef HAVE_SYSLOG_H #ifdef HAVE_SYSLOG_H
case MODE_SYSLOG: if( p_sys->p_file == NULL )
closelog(); closelog();
break; else
#endif #endif
case MODE_TEXT: {
default: fputs( p_sys->footer, p_sys->p_file );
fputs( TEXT_FOOTER, p_sys->p_file );
break;
}
/* Close the log file */
if( p_sys->p_file )
fclose( p_sys->p_file ); fclose( p_sys->p_file );
}
/* Destroy structure */ /* Destroy structure */
free( p_sys ); free( p_sys );
} }
/** static bool IgnoreMessage( intf_thread_t *p_intf, int type )
* Log a message
*/
static void Overflow (void *opaque, int type, const msg_item_t *p_item,
const char *format, va_list ap)
{ {
intf_thread_t *p_intf = opaque;
intf_sys_t *p_sys = p_intf->p_sys;
char *str;
/* TODO: cache value... */ /* TODO: cache value... */
int verbosity = var_InheritInteger( p_intf, "log-verbose" ); int verbosity = var_InheritInteger( p_intf, "log-verbose" );
if (verbosity == -1) if (verbosity == -1)
verbosity = var_InheritInteger( p_intf, "verbose" ); verbosity = var_InheritInteger( p_intf, "verbose" );
if( verbosity < 0 || verbosity < (type - VLC_MSG_ERR) return verbosity < 0 || verbosity < (type - VLC_MSG_ERR);
|| vasprintf( &str, format, ap) == -1 )
return;
int canc = vlc_savecancel();
switch( p_sys->i_mode )
{
case MODE_HTML:
HtmlPrint( p_sys->p_file, type, p_item, str );
break;
#ifdef HAVE_SYSLOG_H
case MODE_SYSLOG:
SyslogPrint( type, p_item, str );
break;
#endif
case MODE_TEXT:
default:
TextPrint( p_sys->p_file, type, p_item, str );
break;
}
vlc_restorecancel( canc );
free( str );
} }
static const char ppsz_type[4][11] = { /*
": ", * Logging callbacks
" error: ", */
" warning: ",
" debug: ", static const char ppsz_type[4][9] = {
"",
" error",
" warning",
" debug",
}; };
static void TextPrint( FILE *stream, int type, const msg_item_t *item, static void TextPrint( void *opaque, int type, const msg_item_t *item,
const char *str ) const char *fmt, va_list ap )
{ {
utf8_fprintf( stream, "%s%s%s\n", item->psz_module, intf_thread_t *p_intf = opaque;
ppsz_type[type], str ); FILE *stream = p_intf->p_sys->p_file;
if( IgnoreMessage( p_intf, type ) )
return;
int canc = vlc_savecancel();
flockfile( stream );
utf8_fprintf( stream, "%s%s: ", item->psz_module, ppsz_type[type] );
utf8_fprintf( stream, fmt, ap );
fputc_unlocked( '\n', stream );
funlockfile( stream );
vlc_restorecancel( canc );
} }
#ifdef HAVE_SYSLOG_H #ifdef HAVE_SYSLOG_H
static void SyslogPrint( int type, const msg_item_t *item, const char *str ) static void SyslogPrint( void *opaque, int type, const msg_item_t *item,
const char *fmt, va_list ap )
{ {
static const int i_prio[4] = { LOG_INFO, LOG_ERR, LOG_WARNING, LOG_DEBUG }; 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]; 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 ) if( item->psz_header != NULL )
syslog( i_priority, "[%s] %s%s%s", item->psz_header, syslog( i_priority, "[%s] %s%s: %s", item->psz_header,
item->psz_module, ppsz_type[type], str ); item->psz_module, ppsz_type[type], str );
else else
syslog( i_priority, "%s%s%s", syslog( i_priority, "%s%s: %s",
item->psz_module, ppsz_type[type], str ); item->psz_module, ppsz_type[type], str );
vlc_restorecancel( canc );
free( str );
} }
#endif #endif
static void HtmlPrint( FILE *stream, int type, const msg_item_t *item, static void HtmlPrint( void *opaque, int type, const msg_item_t *item,
const char *str ) const char *fmt, va_list ap )
{ {
static const char ppsz_color[4][30] = { static const unsigned color[4] = {
"<span style=\"color: #ffffff\">", 0xffffff, 0xff6666, 0xffff66, 0xaaaaaa,
"<span style=\"color: #ff6666\">",
"<span style=\"color: #ffff66\">",
"<span style=\"color: #aaaaaa\">",
}; };
fprintf( stream, "%s%s%s%s</span>\n", item->psz_module, intf_thread_t *p_intf = opaque;
ppsz_type[type], ppsz_color[type], str ); FILE *stream = p_intf->p_sys->p_file;
if( IgnoreMessage( p_intf, type ) )
return;
int canc = vlc_savecancel();
flockfile( stream );
fprintf( stream, "%s%s: <span style=\"color: #%06x\">",
item->psz_module, ppsz_type[type], color[type] );
/* FIXME: encode special ASCII characters */
fprintf( stream, fmt, ap );
fputs( "</span>\n", stream );
funlockfile( stream );
vlc_restorecancel( canc );
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment