user1933677
user1933677

Reputation:

Is there a way to redirect all stdout and stderr to systemd journal from within script?

I like the idea of using systemd's journal to view and manage the logs of my own scripts. I have become aware you can log to journal from my user scripts on a per message basis..

echo 'hello' | systemd-cat -t myscript -p emerg

Is there a way to redirect all messages to journald, even those generated by other commands? Like..

exec &> systemd-cat

Update:

Some partial success. Tried Inian's suggestion from terminal.

~/scripts/myscript.sh 2>&1 | systemd-cat -t myscript.sh

and it worked, stdout and stderr were directed to systemd's journal. Curiously,

~/scripts/myscript.sh &> | systemd-cat -t myscript.sh

didn't work in my Bash terminal.

I still need to find a way to do this inside my script for when other programs call my script.

I tried..

exec 2>&1 | systemd-cat -t myscript.sh

but it doesn't work.

Update 2:

From terminal

systemd-cat ~/scripts/myscript.sh

works. But I'm still looking for a way to do this from within the script.

Upvotes: 8

Views: 8280

Answers (3)

Helmut Grohne
Helmut Grohne

Reputation: 6778

If your script happens to not be a shell script, but some other programming language that allows loading extension modules linked to -lsystemd, there is another way. There is a library function sd_journal_stream_fd that quite precisely matches the task at hand. Calling it from bash itself (as opposed to some child) seems difficult at best. In Python for instance, it is available as systemd.journal.stream. What this function does in essence is connecting a unix domain stream socket and communicating what kind of data is being transmitted (e.g. priority). The difficult part with a shell here is making it connect a unix domain socket (as opposed to connecting in a child).

The key idea to this answer was given by Freenode/libera.chat user grawity.

Upvotes: 1

tripleee
tripleee

Reputation: 189417

A pipe to systemd-cat is a process which needs to run concurrently with your script. Bash offers a facility for this, though it's not portable to POSIX sh.

exec > >(systemd-cat -t myscript -p emerg) 2>&1

The >(command) process substitution starts another process and returns a pseudo-filename (something like /dev/fd/63) which you can redirect into. This is basically a wrapper for the mkfifo hacks you could do if you wanted to port this to POSIX sh.

Upvotes: 4

user1933677
user1933677

Reputation:

Apparently, and for reasons that are beyond me, you can't really redirect all stdout and stderr to journald from within a script because it has to be piped in. To work around that I found a trick people were using with syslog's logger which works similarly.

You can wrap all your code into a function and then pipe the function into systemd-cat.

#!/bin/bash

mycode(){
  echo "hello world"
  echor "echo typo producing error"
}
mycode | systemd-cat -t myscript.sh

exit 0

And then to search journal logs..

journalctl -t myscript.sh --since yesterday

I'm disappointed there isn't a more direct way of doing this.

Upvotes: 0

Related Questions