17

I have a systemd service:

[Unit]
Description=My application

[Service]
ExecStart=/bin/java myapp.jar
Type=simple
User=photo

There is an option: StandardOutput= but I don't understand how to use it to write to a file. https://www.freedesktop.org/software/systemd/man/systemd.exec.html

I was expecting to put a filepath somehere but the documentation talks about sockets and file descriptors. seems it needs more configuration than just that keyword.

Where to put the filepath ? I can't find any examples of that use

Thanks

exeral
  • 338
  • 1
  • 2
  • 6
  • 2
    This is a duplicate of [Redirect systemd service logs to file](https://unix.stackexchange.com/q/321709/22142)... However, the answer there does not answer your question (it doesn't answer the duplicate question either). You might find [this answer useful...](https://stackoverflow.com/a/43830129/1601027) – don_crissti Dec 05 '17 at 13:16
  • my workaround: create a shell launcher that redirect stdout to file and launch that script through systemd. – exeral Dec 13 '17 at 13:23
  • @exeral There is also a `StandardOutput=file:/path/to/here.log` option. – peterh Feb 06 '19 at 10:27
  • yea, seems it would do the job now. this feature was added in v236, few days later..! – exeral Feb 06 '19 at 13:50
  • 1
    Does this answer your question? [redirect systemd service logs to file](https://unix.stackexchange.com/questions/321709/redirect-systemd-service-logs-to-file) – Cirelli94 May 28 '21 at 10:14

2 Answers2

21

Use:

[Unit]
Description=My application

[Service]
ExecStart=/usr/bin/java -jar myapp.jar
Type=simple
User=photo
StandardOutput=file:/var/log/logfile

as documented here: https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

Note that this way log files contents will be overwritten each time service restarts. StandardOutput/Error systemd directives do not support appending to files.

If you want to maintain file log between service restarts and just append new logged lines to it, use instead:

[Unit]
Description=My application

[Service]
ExecStart=/usr/bin/sh -c 'exec /usr/bin/java -jar myapp.jar'
Type=simple
User=photo

exec means that shell program will be substituted with /bin/java program after setting up redirections without forking. So there will be no difference from running /bin/java directly after ExecStart=.

Eugene Lebedev
  • 157
  • 1
  • 5
Piotr Jurkiewicz
  • 1,900
  • 1
  • 17
  • 17
10

If your app is a Python script you also need to set

Environment=PYTHONUNBUFFERED=1

Otherwise you will not see any log messages until the buffer is flushed.

laktak
  • 5,616
  • 20
  • 38
  • 2
    I realize this doesn't answer the original question, but as somebody searching for why my (python-based) service isn't logging stdout, this solves my problem. – Brad Grissom May 18 '21 at 16:23