syslog: convert to logger module
[vlc.git] / modules / logger / console.c
1 /*****************************************************************************
2  * console.c: console logger
3  *****************************************************************************
4  * Copyright © 1998-2005 VLC authors and VideoLAN
5  * Copyright © 2006-2015 Rémi Denis-Courmont
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
20  *****************************************************************************/
21
22 #ifdef HAVE_CONFIG_H
23 # include "config.h"
24 #endif
25
26 #include <stdarg.h>
27 #include <stdio.h>
28 #include <inttypes.h>
29
30 #include <vlc_common.h>
31 #include <vlc_plugin.h>
32
33 static const int ptr_width = 2 * /* hex digits */ sizeof (uintptr_t);
34 static const char msg_type[4][9] = { "", " error", " warning", " debug" };
35
36 #ifndef _WIN32
37 # define COL(x,y) "\033[" #x ";" #y "m"
38 # define RED      COL(31,1)
39 # define GREEN    COL(32,1)
40 # define YELLOW   COL(0,33)
41 # define WHITE    COL(0,1)
42 # define GRAY     "\033[0m"
43 static const char msg_color[4][8] = { WHITE, RED, YELLOW, GRAY };
44
45 static void LogConsoleColor(void *opaque, int type, const vlc_log_t *meta,
46                             const char *format, va_list ap)
47 {
48     FILE *stream = stderr;
49     int verbose = (intptr_t)opaque;
50
51     if (verbose < type)
52         return;
53
54     int canc = vlc_savecancel();
55
56     flockfile(stream);
57     fprintf(stream, "["GREEN"%0*"PRIxPTR GRAY"] ", ptr_width,
58             meta->i_object_id);
59     if (meta->psz_header != NULL)
60         fprintf(stream, "[%s] ", meta->psz_header);
61     fprintf(stream, "%s %s%s: %s", meta->psz_module, meta->psz_object_type,
62             msg_type[type], msg_color[type]);
63     vfprintf(stream, format, ap);
64     fputs(GRAY"\n", stream);
65     funlockfile(stream);
66
67     vlc_restorecancel(canc);
68 }
69 #endif /* !_WIN32 */
70
71 static void LogConsoleGray(void *opaque, int type, const vlc_log_t *meta,
72                            const char *format, va_list ap)
73 {
74     FILE *stream = stderr;
75     int verbose = (intptr_t)opaque;
76
77     if (verbose < type)
78         return;
79
80     int canc = vlc_savecancel();
81
82     flockfile(stream);
83     fprintf(stream, "[%0*"PRIxPTR"] ", ptr_width, meta->i_object_id);
84     if (meta->psz_header != NULL)
85         fprintf(stream, "[%s] ", meta->psz_header);
86     fprintf(stream, "%s %s%s: ", meta->psz_module, meta->psz_object_type,
87             msg_type[type]);
88     vfprintf(stream, format, ap);
89     putc_unlocked('\n', stream);
90     funlockfile(stream);
91
92     vlc_restorecancel(canc);
93 }
94
95 static vlc_log_cb Open(vlc_object_t *obj, void **sysp)
96 {
97     int verbosity = -1;
98
99     if (!var_InheritBool(obj, "quiet"))
100     {
101         const char *str = getenv("VLC_VERBOSE");
102         if (str != NULL)
103            verbosity = atoi(str);
104         else
105             verbosity = var_InheritInteger(obj, "verbose");
106     }
107
108     if (verbosity < 0)
109         return NULL;
110
111     verbosity += VLC_MSG_ERR;
112     *sysp = (void *)(uintptr_t)verbosity;
113
114 #if defined (HAVE_ISATTY) && !defined (_WIN32)
115     if (isatty(STDERR_FILENO) && var_InheritBool(obj, "color"))
116         return LogConsoleColor;
117 #endif
118     return LogConsoleGray;
119 }
120
121 #define QUIET_TEXT N_("Be quiet")
122 #define QUIET_LONGTEXT N_("Turn off all messages on the console.")
123
124 vlc_module_begin()
125     set_shortname(N_("Console log"))
126     set_description(N_("Console logger"))
127     set_category(CAT_ADVANCED)
128     set_subcategory(SUBCAT_ADVANCED_MISC)
129     set_capability("logger", 10)
130     set_callbacks(Open, NULL)
131
132     add_bool("quiet", false, QUIET_TEXT, QUIET_LONGTEXT, false)
133         change_short('q')
134         change_volatile()
135 vlc_module_end ()