supervision - discussion about system services, daemon supervision, init, runlevel management, and tools such as s6 and runit
 help / color / mirror / Atom feed
* multiple log streams
@ 2009-04-02  8:47 Joan Picanyol i Puig
  2009-04-02  8:57 ` Alex Efros
  0 siblings, 1 reply; 12+ messages in thread
From: Joan Picanyol i Puig @ 2009-04-02  8:47 UTC (permalink / raw)
  To: supervision

Hi,

For a system I'm working on, I'd like to reliably store three different
log streams from a single process. Since runsv only sets up a single
pipe from a service/ to its log/, I believe I should demultiplex the
streams in log/run and feed them there to three diferent svlogd
processes, but I'm not quite clear on how to go about it. Any
suggestions?

tks
-- 
pica


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-04-02  8:47 multiple log streams Joan Picanyol i Puig
@ 2009-04-02  8:57 ` Alex Efros
  2009-04-02  9:24   ` Joan Picanyol i Puig
  0 siblings, 1 reply; 12+ messages in thread
From: Alex Efros @ 2009-04-02  8:57 UTC (permalink / raw)
  To: supervision

Hi!

On Thu, Apr 02, 2009 at 10:47:42AM +0200, Joan Picanyol i Puig wrote:
> For a system I'm working on, I'd like to reliably store three different
> log streams from a single process. Since runsv only sets up a single
> pipe from a service/ to its log/, I believe I should demultiplex the
> streams in log/run and feed them there to three diferent svlogd
> processes, but I'm not quite clear on how to go about it. Any
> suggestions?

a) use single stream, and then use svlogd features to filter messages and
store in different log files

b) run 3 socklog processes as separate services which will provide you
with 3 unix sockets, and manually log (using syslog syscalls or library)
from your application different streams to these 3 sockets

Actually a) is most natural way.

-- 
			WBR, Alex.


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-04-02  8:57 ` Alex Efros
@ 2009-04-02  9:24   ` Joan Picanyol i Puig
  2009-04-02  9:47     ` Alex Efros
  0 siblings, 1 reply; 12+ messages in thread
From: Joan Picanyol i Puig @ 2009-04-02  9:24 UTC (permalink / raw)
  To: supervision

* Alex Efros <powerman@powerman.name> [20090402 10:59]:
> Hi!
> 
> On Thu, Apr 02, 2009 at 10:47:42AM +0200, Joan Picanyol i Puig wrote:
> > For a system I'm working on, I'd like to reliably store three different
> > log streams from a single process. Since runsv only sets up a single
> > pipe from a service/ to its log/, I believe I should demultiplex the
> > streams in log/run and feed them there to three diferent svlogd
> > processes, but I'm not quite clear on how to go about it. Any
> > suggestions?
> 
> a) use single stream, and then use svlogd features to filter messages and
> store in different log files

I need to read from log/current in real-time to check for alarm
conditions which I can't express using svlogd pattern matching.

> b) run 3 socklog processes as separate services which will provide you
> with 3 unix sockets, and manually log (using syslog syscalls or library)
> from your application different streams to these 3 sockets

That sounds feasible. Maybe multitee is an option too...

tks
-- 
pica


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-04-02  9:24   ` Joan Picanyol i Puig
@ 2009-04-02  9:47     ` Alex Efros
  2009-04-02 13:47       ` Joan Picanyol i Puig
  0 siblings, 1 reply; 12+ messages in thread
From: Alex Efros @ 2009-04-02  9:47 UTC (permalink / raw)
  To: supervision

Hi!

On Thu, Apr 02, 2009 at 11:24:04AM +0200, Joan Picanyol i Puig wrote:
> > a) use single stream, and then use svlogd features to filter messages and
> > store in different log files
> I need to read from log/current in real-time to check for alarm
> conditions which I can't express using svlogd pattern matching.

Why do you think so? It works in real-time. You probably think about log
rotation, which isn't real-time, but it has nothing with using multiple
log files and filters.

-- 
			WBR, Alex.


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-04-02  9:47     ` Alex Efros
@ 2009-04-02 13:47       ` Joan Picanyol i Puig
  2009-04-03  8:19         ` Laurent Bercot
  2009-09-03  9:02         ` Joan Picanyol i Puig
  0 siblings, 2 replies; 12+ messages in thread
From: Joan Picanyol i Puig @ 2009-04-02 13:47 UTC (permalink / raw)
  To: supervision

* Alex Efros <powerman@powerman.name> [20090402 11:49]:
> Hi!
> 
> On Thu, Apr 02, 2009 at 11:24:04AM +0200, Joan Picanyol i Puig wrote:
> > > a) use single stream, and then use svlogd features to filter messages and
> > > store in different log files
> > I need to read from log/current in real-time to check for alarm
> > conditions which I can't express using svlogd pattern matching.
> 
> Why do you think so? It works in real-time. You probably think about log
> rotation, which isn't real-time, but it has nothing with using multiple
> log files and filters.

Rereading the docs, I noticed that svlogd supports multiple log
directories (I still use daemontools...), which does solve my issue. If
only I could specify an action instead of stderr printing with e/E I'd
be a happy puppy.

tks
--
pica


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-04-02 13:47       ` Joan Picanyol i Puig
@ 2009-04-03  8:19         ` Laurent Bercot
  2009-09-03  9:02         ` Joan Picanyol i Puig
  1 sibling, 0 replies; 12+ messages in thread
From: Laurent Bercot @ 2009-04-03  8:19 UTC (permalink / raw)
  To: supervision

> Rereading the docs, I noticed that svlogd supports multiple log
> directories (I still use daemontools...), which does solve my issue. If
> only I could specify an action instead of stderr printing with e/E I'd
> be a happy puppy.

 multilog supports multiple log directories too.
 However, maybe multilog's pattern-matching abilities aren't powerful
enough for your needs, in which case there's no out-of-the-box solution
and you'll have to do more work (like writing a program able to decide
in real-time where to send the logs).

-- 
 Laurent


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-04-02 13:47       ` Joan Picanyol i Puig
  2009-04-03  8:19         ` Laurent Bercot
@ 2009-09-03  9:02         ` Joan Picanyol i Puig
  2009-09-03 21:34           ` Laurent Bercot
  1 sibling, 1 reply; 12+ messages in thread
From: Joan Picanyol i Puig @ 2009-09-03  9:02 UTC (permalink / raw)
  To: supervision


Hi,

6 months later... Please bear with the extra-quoting to include context
from an old thread.

* Joan Picanyol i Puig <lists-supervision@biaix.org> [20090402 10:47]:
> For a system I'm working on, I'd like to reliably store three different
> log streams from a single process.

* Alex Efros <powerman@powerman.name> [20090402 10:59]:
> 
> On Thu, Apr 02, 2009 at 10:47:42AM +0200, Joan Picanyol i Puig wrote:
> > For a system I'm working on, I'd like to reliably store three different
> > log streams from a single process. Since runsv only sets up a single
> > pipe from a service/ to its log/, I believe I should demultiplex the
> > streams in log/run and feed them there to three diferent svlogd
> > processes, but I'm not quite clear on how to go about it. Any
> > suggestions?
> 
> a) use single stream, and then use svlogd features to filter messages and
> store in different log files
> 
> > On Thu, Apr 02, 2009 at 10:47:42AM +0200, Joan Picanyol i Puig wrote:
> I need to read from log/current in real-time to check for alarm
> conditions which I can't express using svlogd pattern matching.

* Alex Efros <powerman@powerman.name> [20090402 11:49]:
 
> Why do you think so? It works in real-time. You probably think about log
> rotation, which isn't real-time, but it has nothing with using multiple
> log files and filters.
> 
* Joan Picanyol i Puig <lists-supervision@biaix.org> [20090402 15:47]:
 
> Rereading the docs, I noticed that svlogd supports multiple log
> directories (I still use daemontools...), which does solve my issue. If
> only I could specify an action instead of stderr printing with e/E I'd
> be a happy puppy.
> 
* Laurent Bercot <ska-supervision@skarnet.org> [20090403 10:20]:
>  multilog supports multiple log directories too.
>  However, maybe multilog's pattern-matching abilities aren't powerful
> enough for your needs, in which case there's no out-of-the-box solution
> and you'll have to do more work (like writing a program able to decide
> in real-time where to send the logs).

And now I'm here (having chosing to write a real-time
application-spefic log filtering progrem) full of FUD:

Assuming producer & consumer are supervise/runsv managed services, how
do I reliably handle producer's log rotation?

My consumer opens /service/producer/log/main/current and gets signaled
by producer/log upon rotation. My consumer main loop yields every
iteration (say, by sleeping every 10ms), and its signal handler for log
rotation sets a global flag. When set, it reads until EOF on
log/main/current 's fd, closes it and reopens it. So far so good (please
correct me if I'm wrong). 

What happens if I get a signal while reading current until EOF? Could I
mess a whole logfile? Is this just a "your producer rotates too fast for
your consumer and you are not blocking" issue? I see two options:

1. in my signal handler shut down my producer's log, re-signal it up
   when done with current log
2. do a careful scheduling analysis (which I should, since I'm talking
    "real-time") and hope for the best

Anything I might have overlooked? Ideas? suggestions?

tks
--
pica


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-09-03  9:02         ` Joan Picanyol i Puig
@ 2009-09-03 21:34           ` Laurent Bercot
  2009-09-03 22:35             ` Charlie Brady
  2009-09-23 14:20             ` Joan Picanyol i Puig
  0 siblings, 2 replies; 12+ messages in thread
From: Laurent Bercot @ 2009-09-03 21:34 UTC (permalink / raw)
  To: supervision

> Assuming producer & consumer are supervise/runsv managed services, how
> do I reliably handle producer's log rotation?

 Why do you even use multilog/svlogd, since you have written your own
logging facility ?
 Make your consumer just read from stdin and log reliably to the
multiple places you need; and have it run as a logger for the producer,
in /service/producer/log/run. You won't have to deal with multilog/
svlogd's rotation.
 Of course, your consumer should implement automatic rotation itself,
but that's a whole different thing from what you are asking.


> My consumer opens /service/producer/log/main/current and gets signaled
> by producer/log upon rotation. My consumer main loop yields every
> iteration (say, by sleeping every 10ms), and its signal handler for log
> rotation sets a global flag. When set, it reads until EOF on
> log/main/current 's fd, closes it and reopens it. So far so good (please
> correct me if I'm wrong). 

 Um, I don't quite get what you're doing, but it sounds like your consumer
is performing active waiting. Don't: use a select()/poll()/iopause() loop
listening on stdin, with a long - perhaps infinite - timeout.
 If you need to trap signals, use the self-pipe trick.
 http://www.skarnet.org/skalibs/selfpipe.html

-- 
 Laurent


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-09-03 21:34           ` Laurent Bercot
@ 2009-09-03 22:35             ` Charlie Brady
  2009-09-04  7:51               ` Laurent Bercot
  2009-09-23 14:20             ` Joan Picanyol i Puig
  1 sibling, 1 reply; 12+ messages in thread
From: Charlie Brady @ 2009-09-03 22:35 UTC (permalink / raw)
  To: Laurent Bercot; +Cc: supervision


On Thu, 3 Sep 2009, Laurent Bercot wrote:

> If you need to trap signals, use the self-pipe trick.
> http://www.skarnet.org/skalibs/selfpipe.html

Correct URL is:

http://www.skarnet.org/software/skalibs/selfpipe.html


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-09-03 22:35             ` Charlie Brady
@ 2009-09-04  7:51               ` Laurent Bercot
  0 siblings, 0 replies; 12+ messages in thread
From: Laurent Bercot @ 2009-09-04  7:51 UTC (permalink / raw)
  To: supervision

> Correct URL is:
> http://www.skarnet.org/software/skalibs/selfpipe.html

 Whoops, indeed.

-- 
 Laurent


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-09-03 21:34           ` Laurent Bercot
  2009-09-03 22:35             ` Charlie Brady
@ 2009-09-23 14:20             ` Joan Picanyol i Puig
  2009-09-25 20:45               ` Laurent Bercot
  1 sibling, 1 reply; 12+ messages in thread
From: Joan Picanyol i Puig @ 2009-09-23 14:20 UTC (permalink / raw)
  To: supervision

* Laurent Bercot <ska-supervision@skarnet.org> [20090903 23:33]:
> > Assuming producer & consumer are supervise/runsv managed services, how
> > do I reliably handle producer's log rotation?
> 
>  Why do you even use multilog/svlogd, since you have written your own
> logging facility ?
>  Make your consumer just read from stdin and log reliably to the
> multiple places you need; and have it run as a logger for the producer,
> in /service/producer/log/run. You won't have to deal with multilog/
> svlogd's rotation.

I have multiple consumers, some real-time and some batch. I need to be
able to easily adapt to more consumers appearing. Batch consumers are
handled at rotation time, real-time must feed from current. In case of >
1 real-time consumers, I should be able to get by with multitee.

> > My consumer opens /service/producer/log/main/current and gets signaled
> > by producer/log upon rotation. My consumer main loop yields every
> > iteration (say, by sleeping every 10ms), and its signal handler for log
> > rotation sets a global flag. When set, it reads until EOF on
> > log/main/current 's fd, closes it and reopens it. So far so good (please
> > correct me if I'm wrong). 
> 
>  Um, I don't quite get what you're doing, but it sounds like your consumer
> is performing active waiting.

I do usleep() every iteration, which does not count as active waiting in
my book. I'm not handling EINTR (I just keep reading until EOF &&
signaled).

> Don't: use a select()/poll()/iopause() loop
> listening on stdin, with a long - perhaps infinite - timeout.
>  If you need to trap signals, use the self-pipe trick.
>  http://www.skarnet.org/skalibs/selfpipe.html

Yep, that's definitely The Right Way.

tks
--
pica


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: multiple log streams
  2009-09-23 14:20             ` Joan Picanyol i Puig
@ 2009-09-25 20:45               ` Laurent Bercot
  0 siblings, 0 replies; 12+ messages in thread
From: Laurent Bercot @ 2009-09-25 20:45 UTC (permalink / raw)
  To: supervision

> I have multiple consumers, some real-time and some batch. I need to be
> able to easily adapt to more consumers appearing. Batch consumers are
> handled at rotation time, real-time must feed from current. In case of >
> 1 real-time consumers, I should be able to get by with multitee.

 The problem with multitee is that it doesn't dynamically adapt. You need
to write a couple specific programs so that your requirements are exactly
met.

 If I understand your requirements correctly, I suggest the following
architecture:

 - /service/producer: your producer

 -  /service/producer/log: a specific program (most likely written in C or
perl) that
   * opens a Unix domain socket, binds it to /service/producer/log/s and
listens to it, accepting connections from real-time consumers' uids-gids
   * reads from stdin and reliably writes to every client connection it has.
This is the equivalent of multitee, but it can dynamically adapt to more
or less real-time consumers. You will always have at least one client,
which is...

 - /service/prodlogger: actually just "ipcclient /service/producer/log/s
fdmove 0 6 multilog blahblah" in the run file.
This is your main real-time consumer ; its purpose is just to feed a copy of
the stream to a multilog or svlogd process that reliably saves it to the
filesystem. The logging script is designed to trigger batch consumers.

 - "ipcclient /service/producer/log/s fdmove 0 6 realtimeconsumerprog" can
be how you generally run your real-time consumers, if realtimeconsumerprog
reads the stream on stdin.


> I do usleep() every iteration, which does not count as active waiting in
> my book.

 Sorry, I said "active waiting" but I meant "polling".
 Using notification mechanisms instead of polling mechanisms whenever you
can is clever use of resources. :)

-- 
 Laurent


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2009-09-25 20:45 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-04-02  8:47 multiple log streams Joan Picanyol i Puig
2009-04-02  8:57 ` Alex Efros
2009-04-02  9:24   ` Joan Picanyol i Puig
2009-04-02  9:47     ` Alex Efros
2009-04-02 13:47       ` Joan Picanyol i Puig
2009-04-03  8:19         ` Laurent Bercot
2009-09-03  9:02         ` Joan Picanyol i Puig
2009-09-03 21:34           ` Laurent Bercot
2009-09-03 22:35             ` Charlie Brady
2009-09-04  7:51               ` Laurent Bercot
2009-09-23 14:20             ` Joan Picanyol i Puig
2009-09-25 20:45               ` Laurent Bercot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).