You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@axis.apache.org by Samisa Abeysinghe <sa...@gmail.com> on 2006/02/04 05:51:11 UTC
[Axis2] Threading issues with log
Hi All,
Once we have the threads in place, we have to ensure that our
logging mechanism is thread safe.
May be we can learn some stuff from Apache httpd code.
Unfortunately, we are not lucky as much as Java guys, we do not have
a log4j equivalent. We have log4c http://log4c.sourceforge.net/. But I
am not convinced of its maturity and licence.
Thoughts please...
Thanks,
Samisa...
Re: [Axis2] Threading issues with log
Posted by Samisa Abeysinghe <sa...@gmail.com>.
Hi Nadir,
Your input is very useful. We will try this.
Many thanks.
Samisa...
Nadir Amra wrote:
>Correction would need to be made for thread id in sprintf, the code below
>assumes it is long long, but on 32 but systems it is int.
>
> tid = pthread_getthreadid_np();
>
> sprintf(myfmt, "<%s.%03ld %016llx> %s", tempTimeStr, t.tv_usec/1000,
>*((long long *)&tid), fmt);
>
>Nadir K. Amra
>
>
>Nadir Amra/Rochester/IBM@IBMUS wrote on 02/05/2006 11:28:07 AM:
>
>
>
>>Note I have not looked at axis2 code, so I am talking canceptually....
>>
>>I am assuming there is a point where there is some initialization going
>>
>>
>on
>
>
>>prior to anyone using the trace that is tied to configuration. At that
>>time, one can set a global file handle to the log file by calling
>>trace_init() which simply contains the following code:
>>
>> FILE * traceFp = fopen(logFile, "w+");
>> setvbuf(traceFp, NULL, _IOFBF, (size_t)(8*1024));
>>
>>The above assumes trace records are no longer than 8K. This will ensure
>>
>>
>no
>
>
>>buffering takes place.
>>
>>Then, in the actual routine that performs the trace:
>>
>>#include <stdlib.h>
>>#include <stdio.h>
>>#include <stdarg.h>
>>#include <pthread.h>
>>
>>void trace(const char *fmt, ... )
>>{
>> char tempTimeStr[200];
>> struct timeval t;
>> struct tm *lTime;
>> pthread_id_np_t tid;
>> va_list args;
>> char myfmt[8*1024];
>>
>> if (traceFp == NULL)
>> return;
>>
>> gettimeofday(&t, NULL);
>> lTime = localtime((const time_t *)&t.tv_sec);
>> strftime(tempTimeStr, 100, "%d/%b/%Y %H:%M:%S", lTime);
>>
>> tid = pthread_getthreadid_np();
>>
>> sprintf(myfmt, "<%s.%03ld %016llx> %s", tempTimeStr, t.tv_usec/1000,
>>
>>
>
>
>
>>*((long long *)&tid), fmt);
>>
>> va_start(args, fmt);
>> vfprintf(traceFp, myfmt, args);
>> va_end(args);
>> fflush(traceFp);
>>}
>>
>>
>>The above code is thread-safe and not only prints out the date and time
>>(included milli-seconds), but the thread ID also.
>>
>>
>>Nadir K. Amra
>>
>>
>>Samisa Abeysinghe <sa...@gmail.com> wrote on 02/03/2006
>>10:51:11 PM:
>>
>>
>>
>>>Hi All,
>>> Once we have the threads in place, we have to ensure that our
>>>logging mechanism is thread safe.
>>> May be we can learn some stuff from Apache httpd code.
>>>
>>> Unfortunately, we are not lucky as much as Java guys, we do not
>>>
>>>
>have
>
>
>>>a log4j equivalent. We have log4c http://log4c.sourceforge.net/. But I
>>>
>>>
>
>
>
>>>am not convinced of its maturity and licence.
>>> Thoughts please...
>>>Thanks,
>>>Samisa...
>>>
>>>
>
>
>
>
Re: [Axis2] Threading issues with log
Posted by Nadir Amra <am...@us.ibm.com>.
Correction would need to be made for thread id in sprintf, the code below
assumes it is long long, but on 32 but systems it is int.
tid = pthread_getthreadid_np();
sprintf(myfmt, "<%s.%03ld %016llx> %s", tempTimeStr, t.tv_usec/1000,
*((long long *)&tid), fmt);
Nadir K. Amra
Nadir Amra/Rochester/IBM@IBMUS wrote on 02/05/2006 11:28:07 AM:
> Note I have not looked at axis2 code, so I am talking canceptually....
>
> I am assuming there is a point where there is some initialization going
on
> prior to anyone using the trace that is tied to configuration. At that
> time, one can set a global file handle to the log file by calling
> trace_init() which simply contains the following code:
>
> FILE * traceFp = fopen(logFile, "w+");
> setvbuf(traceFp, NULL, _IOFBF, (size_t)(8*1024));
>
> The above assumes trace records are no longer than 8K. This will ensure
no
> buffering takes place.
>
> Then, in the actual routine that performs the trace:
>
> #include <stdlib.h>
> #include <stdio.h>
> #include <stdarg.h>
> #include <pthread.h>
>
> void trace(const char *fmt, ... )
> {
> char tempTimeStr[200];
> struct timeval t;
> struct tm *lTime;
> pthread_id_np_t tid;
> va_list args;
> char myfmt[8*1024];
>
> if (traceFp == NULL)
> return;
>
> gettimeofday(&t, NULL);
> lTime = localtime((const time_t *)&t.tv_sec);
> strftime(tempTimeStr, 100, "%d/%b/%Y %H:%M:%S", lTime);
>
> tid = pthread_getthreadid_np();
>
> sprintf(myfmt, "<%s.%03ld %016llx> %s", tempTimeStr, t.tv_usec/1000,
> *((long long *)&tid), fmt);
>
> va_start(args, fmt);
> vfprintf(traceFp, myfmt, args);
> va_end(args);
> fflush(traceFp);
> }
>
>
> The above code is thread-safe and not only prints out the date and time
> (included milli-seconds), but the thread ID also.
>
>
> Nadir K. Amra
>
>
> Samisa Abeysinghe <sa...@gmail.com> wrote on 02/03/2006
> 10:51:11 PM:
>
> > Hi All,
> > Once we have the threads in place, we have to ensure that our
> > logging mechanism is thread safe.
> > May be we can learn some stuff from Apache httpd code.
> >
> > Unfortunately, we are not lucky as much as Java guys, we do not
have
>
> > a log4j equivalent. We have log4c http://log4c.sourceforge.net/. But I
> > am not convinced of its maturity and licence.
> > Thoughts please...
> > Thanks,
> > Samisa...
>
Re: [Axis2] Threading issues with log
Posted by Nadir Amra <am...@us.ibm.com>.
Note I have not looked at axis2 code, so I am talking canceptually....
I am assuming there is a point where there is some initialization going on
prior to anyone using the trace that is tied to configuration. At that
time, one can set a global file handle to the log file by calling
trace_init() which simply contains the following code:
FILE * traceFp = fopen(logFile, "w+");
setvbuf(traceFp, NULL, _IOFBF, (size_t)(8*1024));
The above assumes trace records are no longer than 8K. This will ensure no
buffering takes place.
Then, in the actual routine that performs the trace:
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include <pthread.h>
void trace(const char *fmt, ... )
{
char tempTimeStr[200];
struct timeval t;
struct tm *lTime;
pthread_id_np_t tid;
va_list args;
char myfmt[8*1024];
if (traceFp == NULL)
return;
gettimeofday(&t, NULL);
lTime = localtime((const time_t *)&t.tv_sec);
strftime(tempTimeStr, 100, "%d/%b/%Y %H:%M:%S", lTime);
tid = pthread_getthreadid_np();
sprintf(myfmt, "<%s.%03ld %016llx> %s", tempTimeStr, t.tv_usec/1000,
*((long long *)&tid), fmt);
va_start(args, fmt);
vfprintf(traceFp, myfmt, args);
va_end(args);
fflush(traceFp);
}
The above code is thread-safe and not only prints out the date and time
(included milli-seconds), but the thread ID also.
Nadir K. Amra
Samisa Abeysinghe <sa...@gmail.com> wrote on 02/03/2006
10:51:11 PM:
> Hi All,
> Once we have the threads in place, we have to ensure that our
> logging mechanism is thread safe.
> May be we can learn some stuff from Apache httpd code.
>
> Unfortunately, we are not lucky as much as Java guys, we do not have
> a log4j equivalent. We have log4c http://log4c.sourceforge.net/. But I
> am not convinced of its maturity and licence.
> Thoughts please...
> Thanks,
> Samisa...