[Klaus Schmidinger] [vdr] Process id in syslog
Francois-Xavier KOWALSKI
francois-xavier.kowalski at hp.com
Mon Jan 9 10:20:32 CET 2006
[No sent to the ML as my previous message was refused because I am not a
subscriber]
Klaus Schmidinger wrote:
> Francois-Xavier KOWALSKI wrote:
>
>>> Subject:
>>> [vdr] Process id in syslog
>>> From:
>>> Klaus Schmidinger <Klaus.Schmidinger at cadsoft.de>
>>> Date:
>>> Sat, 31 Dec 2005 15:12:24 +0100
>>> To:
>>> vdr at linuxtv.org
>>>
>>> To:
>>> vdr at linuxtv.org
>>>
>>>
>>> Before the conversion to NPTL, the syslog entries showed
>>> the pid of each individual thread, so that it was easy to
>>> tell which thread had issued a particular message.
>>>
>>> Now, with NPTL, all VDR syslog entries have the same pid,
>>> which is that of the foreground thread. This is pretty
>>> useless, because in case of a problem it's important
>>> to know exactly which thread has issued which message.
>>>
>>> Since I couldn't find any information on this, maybe somebody
>>> here knows how openlog() needs to be called in order to have
>>> the individual thread pids displayed in syslog messages on
>>> an NPTL system.
>>>
>>>
>> Whatever pthread implementation is in use, the symlink /proc/self
>> always refers to the LWPID (Light-Weight Process ID, i.e. thread PID
>> in your case). I suggest -- this is what I do -- to stat(2)
>> /proc/self refered file & sscanf(3) it. Of course, this is better to
>> be done & stored (e.g. in TLS) at the thread startup & then re-used
>> upon need.
>
>
> Well, this isn't exactly what I meant.
> I do have the right pids in my program.
> What I want is that a call like
>
> openlog("vdr", LOG_PID | LOG_CONS, LOG_USER);
>
> followed by
>
> syslog(LOG_INFO, "some log message");
>
> writes to the log file
>
> Jan 7 12:25:52 video vdr[7457]: some log message
>
> where [7457] should be the pid of the actual thread, not that
> of the main thread.
>
> For instance, on a non-NPTL system, the log looks like this:
>
>
> Dec 10 14:38:51 video vdr[709]: VDR version 1.3.38 started
> Dec 10 14:38:51 video vdr[709]: loading /video/setup.conf
> ...
> Dec 10 14:38:51 video vdr[711]: video directory scanner thread started
> (pid=711, tid=711)
>
>
> while on an NPTL system I get:
>
>
> Jan 7 12:25:51 video vdr[7457]: VDR version 1.3.38 started
> Jan 7 12:25:51 video vdr[7457]: loading /video/setup.conf
> ...
> Jan 7 12:25:52 video vdr[7457]: video directory scanner thread
> started (pid=7457, tid=7459)
>
>
> As you can see, in the first case there is vdr[709] for the main thread
> and vdr[711] for the second thread. In the second case there is vdr[7457]
> for both threads, while I would like the second thread to show vdr[7459].
Hmm I see. This was a non-UNIX Linux-ism of LinuxThreads. NPTL folks now
have "fixed" it. What I could suggest you is to use the UNIX approach
(that would be portable), i.e. not assume that both processes & threads
are both LWP's & hence have distinct LWPID's: use pthread_t (that maps
nicely to a long on most UNIX platforms) reported by pthread_self() in
addition to PID. Then overload/redefine openlog/syslog.
Something like the following (untested) should do the job with a
reasonable CPU budget. Note that the thread is between curlybraces at
the beginning of each line.
static void _vdr_get_fmt(void) {
static char* __thread vdr_log_prefix = NULL; /* in TLS */
static char* __thread vdr_log_fmt = NULL; /* in TLS */
if( !vdr_log_prefix) {
vdr_log_prefix = (char*)malloc(16);
sprintf(vdr_log_prefix, "{%ld} ", (long)pthread_self() );
}
if( !vdr_log_fmt)
vdr_log_fmt = (char*)malloc(1024);
strcpy( vdr_log_fmt, vdr_log_prefix );
return vdr_log_fmt;
}
void vdr_syslog(int priority, const char *format, ...){
va_list ap;
char* fmt = _vdr_get_fmt();
va_start( ap, format );
strcat( fmt, format );
vsyslog( priority, fmt, ap );
va_end(ap);
}
Good luck.
--
Francois-Xavier "FiX" KOWALSKI /_ __ Tel:+33 (0)4 76 14 63 27
OpenCall Business Unit -- OCBU / //_/ Fax:+33 (0)4 76 14 51 62
Media-Processing Engineering / http://www.hp.com/go/opencall
i n v e n t
More information about the vdr
mailing list