By embedded I was pointing more the idea that we can't access the
device easily, CPU and memory usage is not really an issue.

However you're right that sd-journal also has this rate limit feature
that already bit us, I get your point of people going crazy with
partial logs.

Thank you for your reply.

Le mar. 20 mai 2025 à 16:22, Vito Caputo <vcap...@pengaru.com> a écrit :
>
> On Tue, May 20, 2025 at 10:13:32AM +0200, Etienne Doms wrote:
> > Hi,
> >
> > We're developing an embedded application which is run through a
> > systemd service, and we use sd-journal for logging.
> >
> > We just figured out that something is not scaling up: we log at INFO
> > level things like "user pushed that button so we did that" (which
> > occurs once in a while) and at DEBUG level "received that frame from
> > /dev/ttyUSB42" which occurs every 40ms on various serial lines. There
> > is no I/O issue since we use Storage=volatile, but the journal is
> > rotating way too fast.
> >
> > At first sight, it seems we just need to dynamically enable/disable
> > DEBUG messages but the problem is that we can't: in the wild, the
> > operator of our system can press a "something went wrong" button which
> > basically does a journal export that we can inspect later, and
> > obviously we can't predict when a problem is about to happen...
> >
> > So basically, we need to be able at any time to persist one hour of
> > INFO messages and the last five minutes of DEBUG messages. From what I
> > understood, the retention strategy is global to a systemd-journald
> > instance, I read about sd-journal namespaces, and my first intent was
> > to log INFO stuff in the system journal and DEBUG stuff in dedicated
> > namespaces (maybe one per serial lines), so I've been looking for some
> > sd_journal_print_with_namespace() or sd_journal_sendv([MESSAGE="foo",
> > NAMESPACE="bar"])...
> >
> > Now, two questions:
> >
> > * What I'm looking for does not exist, a systemd unit is bound to a
> > single journal namespace, and it's actually the .service that defines
> > to which namespace the application logs. Am I right? To achieve what I
> > want, I need to split my application into several services?
> > * Is systemd-journald designed so that it can record hundreds (if not
> > thousands...) of records per second?
> >
> > $COLLEAGUE proposed to switch to rsyslog, but I'd like your reading about 
> > this.
> >
>
> In your shoes I would agree with your colleague.  Unless you have a good
> reason to need journald-specific features, in an embedded situation
> you're likely better served by a dead simple sysklogd like busybox
> provides.
>
> It's smaller in both code and execution footprint, easier to reason
> about, and less likely to result in lost logs.
>
> There are _still_ problems when it comes to journald/journalctl reliably
> associating metadata with the logged data.  So when your team starts
> coming to depend on the features listed on the box, like `journalctl -u
> $unit`, then assuming all the related logs will be found using such
> filters, you'll be sorely disappointed.  If journalctl drops messages
> because the metadata isn't there, the logs are effectively lost.
>
> None of these problems exist when the on-device logging is little more
> than a pipe redirected to an O_APPEND file in /var/log.  Get the files
> off the device in that form, and do whatever you want in post.  It's not
> perfect, but neither is journald.  At least this way you minimize loss
> potential, minimize on-device load, and avoid driving everyone insane
> debugging problems with lossy logs.
>
> - Vito

Reply via email to