[syslog-ng] RFC5424 sending - dest=unix-stream. Framing?
Declan White
declanw at is.bbc.co.uk
Mon Feb 5 20:52:10 UTC 2018
On Sat, Feb 03, 2018 at 03:23:06PM +0100, Scheidler, Bal?zs wrote:
> You could use tcp(flags(syslog-protocol)) to send rfc5424 without framing.
I was already sending without framing but, now you've mentioned it, I've gone over the differences between network(flags(syslog-protocol)) and syslog() again.
I'd thought they were synonymous/equivalent - I was mistaken!
EUREKA! Switching the receiver from syslog() to network(flags(syslog-protocol)) gets everything working.
Thanks! :)
- Declan
PS: the recompile didn't kill the Solaris heisenbug, but I'll happily take this escape route instead.
> On Feb 3, 2018 06:16, "Declan White" <declanw at is.bbc.co.uk> wrote:
>
> > On Fri, Feb 02, 2018 at 07:01:55PM +0000, Declan White wrote:
> > > Yeah, disregard me. Sorry.
> > > Looks like the tunnel I'm using is unclean..
> >
> > Well, I fixed the tunnel, but it turned out to be a red herring. It seems
> > I've got two different problems in syslog-ng (on Solaris) :
> >
> > 1) If I read from a unix-stream->unix-stream source, recvmsg() reliably
> > EFAULT's the second read of a new connection. Unless I attach a library
> > call tracer.. and then it won't. Heisenbug...
> > 10109/11: write(2, 0x00059898, 58) =
> > 58
> > 10109/11: S e t t i n g v a l u e ; m s g = ' 4 7 b 1
> > 0 ' , n a m e
> > 10109/11: = ' S O U R C E ' , v a l u e = ' i n _ t e s
> > t '
> > 10109/11: write(2, "\n", 1) = 1
> > 10109/11: recvmsg(15, 0xFE66B4B4, 0)
> > Err#14 EFAULT
> >
> > I think my build env may have eaten something bad. I'm recompiling all the
> > dependant libs with GCC, and dumping libwrap, to see if that changes
> > anything.
> >
> > Is any of this compiler noise relevant? :
> > ../source/syslog-ng-3.12.1/modules/afsocket/socket-options-inet.c:47:8:
> > warning: unused variable 'on' [-Wunused-variable]
> > gint on = 1;
> > ../source/syslog-ng-3.12.1/modules/afsocket/transport-unix-socket.c:52:35:
> > warning: format '%d' expects argument of type 'int', but argument 4 has
> > type 'pid_t {aka long int}' [-Wformat=]
> > g_snprintf(buf, buflen, "/proc/%d/%s", pid, proc_file);
> > ../source/syslog-ng-3.12.1/modules/afsocket/transport-unix-socket.c:138:1:
> > warning: '_add_nv_pair_proc_readlink' defined but not used
> > [-Wunused-function]
> > ../source/syslog-ng-3.12.1/modules/afsocket/transport-unix-socket.c:118:1:
> > warning: '_add_nv_pair_proc_read_argv' defined but not used
> > [-Wunused-function
> > ../source/syslog-ng-3.12.1/modules/afsocket/transport-unix-socket.c:104:1:
> > warning: '_add_nv_pair_proc_read_unless_unset' defined but not used
> > [-Wunused-function]
> > ../source/syslog-ng-3.12.1/modules/afsocket/transport-unix-socket.c:38:1:
> > warning: '_add_nv_pair_int' defined but not used [-Wunused-function]
> > ../source/syslog-ng-3.12.1/modules/afstreams/afstreams.c: In
> > function 'log_transport_streams_new':
> > ../source/syslog-ng-3.12.1/modules/afstreams/afstreams.c:97:14:
> > warning: assignment from incompatible pointer type
> > [-Wincompatible-pointer-types]
> > self->read = log_transport_streams_read;
> > ../source/syslog-ng-3.12.1/modules/afstreams/afstreams.c: In
> > function 'afstreams_init_door':
> > ../source/syslog-ng-3.12.1/modules/afstreams/afstreams.c:133:11:
> > warning: implicit declaration of function 'close'; did you mean 'pclose'?
> > [-Wimplicit-function-declaration]
> > close(fd);
> >
> > 2) If I avoid that unix-stream source and socat the client from a unix
> > domain socket destination into a syslog port source, syslog-ng now has a
> > mismatch of a source sending no framing, and a destination expecting it.
> >
> > syslog()
> > write(5, 0x000721E8, 60) = 60
> > 5 7 < 1 3 > 1 2 0 1 8 - 0 2 - 0 3 T 0 3 : 1 1 : 2 0 + 0 0 :
> > 0 0 o p s t e s t 6 a - - - - t e s t 0 8\n
> >
> > unix-stream()
> > read(6, 0x00072B00, 8192) = 57
> > < 1 3 > 1 2 0 1 8 - 0 2 - 0 3 T 0 2 : 0 5 : 0 5 + 0 0 : 0 0
> > o p s t e s t 6 a - - - - t e s t 0 7\n
> >
> > I take it that if I did something evil like faking up a length header with
> > length() in a template() I might get unix-stream -> syslog working?
> >
> >
> > > On Fri, Feb 02, 2018 at 06:48:09AM +0100, Scheidler, Bal?zs wrote:
> > > > If the new lines at the end are ok, and the messages dont contain
> > newlines
> > > > themselves, you should be fine. If both destination and source is
> > > > unix-STREAM(). Don't you hapoen to use unix-dgram() somewhere? That
> > would
> > > > take the datagram fragments as individual messages.
> > > >
> > > > Can you show me the framing errors you mention?
> > > >
> > > >
> > > > On Feb 1, 2018 22:33, "Declan White" <declanw at is.bbc.co.uk> wrote:
> > > >
> > > > I have syslog-ng pumping data into a unix-stream destination
> > > > socketfilething.
> > > >
> > > > Data going into this domain socket has lots of adventures, and then
> > emerges
> > > > as a source unix-stream on another host.
> > > > Both have flags(syslog-protocol), but the data gets framing errors at
> > the
> > > > receiver.
> > > >
> > > > I think it's become a bytestream (instead of a message stream)
> > enroute, and
> > > > the recv() is relying on only getting one message at a time, because it
> > > > can't know the message length any other way, as unix-stream gets
> > messages
> > > > without framing(?).
> > > >
> > > > Is there a way to salvage this? (I noticed TLS might add framing, but
> > since
> > > > the tunnel is already TLS ...)
--
Declan White
More information about the syslog-ng
mailing list