I have a program which is started by systemd service myprogram.service. Problem is that it is writing its logs directly to the log file /opt/myprogram/logs.txt. I want to redirect its logs into systemd journal, so I will be able to read them with journalctl.

Is it possible to amend myprogram.service to tell Systemd to pipeline text from specific file into its journal?

  • Is the application able to instead write its output to stdout? Some applications do that when run with a --no-daemon (or similar) flag.
    – Wieland
    Apr 2, 2022 at 10:53
  • Or a --syslog switch.
    – Bib
    Apr 2, 2022 at 12:47
  • @Wieland Problem with that particular application is that it is hardcoded to write logs into file. That is why I'm trying to pipeline it.
    – anlar
    Apr 3, 2022 at 18:22

2 Answers 2


As a start, I would try a combination of tail and logger.

tail -f /opt/myprogram/logs.txt | logger

tail will continuously read all new lines from the file and duplicate them in stdout. And logger will take those lines and send them to system log.


Since the piping is doing buffering there is a chance that the logger will sleep for some time (until the default buffer of 4Kb fills out). That can be remedied by disabling buffering with stdbuf or unbuffer:

stdbuf -i0 -o0 tail -f /opt/myprogram/logs.txt | logger
  • I have tried to add ExecStartPost=/bin/sh -c 'tail -F /opt/myprogram/data/log.txt | systemd-cat' to systemd service. It works but as tail should be left running when I'm trying to start service it is fail with timeout, because systemd waits for tail to exit.
    – anlar
    Apr 3, 2022 at 18:24
  • Disable pipe bufering. Add unbuffer or stdbuf -i0 -o0 to the tail. For example: stdbuf -i0 -o0 tail -f ...
    – White Owl
    Apr 3, 2022 at 22:05
  • It fails with the same error # systemctl start myprogram Job for myprogram.service failed because a timeout was exceeded.. Systemd waits until tail returns exit code so buffering shouldn't help with it.
    – anlar
    Apr 4, 2022 at 16:56
  • I think you are mixing something. The suggested tail+logger solution works for sure in the user mode. If you starting it from systemd.service.... it could be a cause of the error. Not sure how exactly, but 'systemctl' in the error message points in that direction. Try running tail+logger from a script which starts your application, of if the app itself is running by systemd - just add a log copy script to startup (or just run it manually).
    – White Owl
    Apr 5, 2022 at 1:25

If you have no way to change the output filename in the app, maybe you could forced create /opt/myprogram/logs.txt as a symlink to /dev/stdout in the service unit, either as a prestart or poststart step or both?

  • This could also be to /dev/stderr depending on your needs.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .