[linux] 시스템 서비스 출력을 파일로 리디렉션하는 방법

systemd서비스 출력을 파일 로 리디렉션하려고 하지만 작동하지 않는 것 같습니다.

[Unit]
Description=customprocess
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server
StandardOutput=/var/log1.log
StandardError=/var/log2.log
Restart=always

[Install]
WantedBy=multi-user.target

내 접근 방식을 수정하십시오.



답변

문제를 해결하는 더 우아한 방법이 있다고 생각합니다. stdout / stderr을 식별자를 사용하여 syslog로 보내고 syslog 관리자에게 출력을 프로그램 이름으로 나누도록 지시하십시오.

시스템 서비스 단위 파일에서 다음 특성을 사용하십시오.

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<your program identifier> # without any quote

그런 다음 배포에서 rsyslog를 사용하여 syslog를 관리한다고 가정 /etc/rsyslog.d/<new_file>.conf하면 다음 내용으로 파일을 만듭니다 .

if $programname == '<your program identifier>' then /path/to/log/file.log
& stop

이제 syslog에서 로그 파일을 쓸 수있게 만드십시오 :

# ls -alth /var/log/syslog
-rw-r----- 1 syslog adm 439K Mar  5 19:35 /var/log/syslog
# chown syslog:adm /path/to/log/file.log

rsyslog ( sudo systemctl restart rsyslog)를 다시 시작 하고 즐기십시오! 프로그램 stdout / stderr는 여전히 journalctl ( sudo journalctl -u <your program identifier>)을 통해 사용할 수 있지만 선택한 파일에서도 사용할 수 있습니다.

archive.org를 통한 출처


답변

당신이 새와 새로운 배포판이있는 경우 systemd( systemd버전 236 이상을 ), 당신은의 값을 설정할 수 있습니다 StandardOutput또는 StandardError로를 file:YOUR_ABSPATH_FILENAME.


긴 이야기:

새로운 버전에서는 systemd비교적 새로운 옵션이 ( GitHub의 요청 2016에서 틱하고 향상 / 합병 2017 분에 폐쇄한다 ) 당신이의 값 설정할 수 StandardOutput또는 StandardError로를 file:YOUR_ABSPATH_FILENAME. 이 file:path옵션은 최신 systemd.exec매뉴얼 페이지에 설명되어 있습니다.

이 새로운 기능은 비교적 새로운 기능이므로 centos-7 (또는 그 이전의 centos)과 같은 오래된 배포판에서는 사용할 수 없습니다.


답변

이 오류가 발생할 수 있습니다.

Failed to parse output specifier, ignoring: /var/log1.log

로부터 systemd.exec(5)매뉴얼 페이지

StandardOutput=

실행 된 프로세스의 파일 디스크립터 1 (STDOUT)이 연결되는 위치를 제어합니다. 중 하나를 간다 inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console또는 socket.

systemd.exec(5)매뉴얼 페이지 로깅 관련된 다른 옵션에 대해 설명합니다. systemd.service(5)systemd.unit(5)매뉴얼 페이지 도 참조하십시오 .

또는 다음과 같은 것을 시도해 볼 수 있습니다 (모두 한 줄에).

ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log'


답변

systemd 파일 자체에 파일을 추가 stdout하고 제안하는 것이 좋습니다 .stderrservice

참조 : https://www.freedesktop.org/software/systemd/man/systemd.exec.html#StandardOutput=

구성 했으므로 다음을 좋아하지 않아야합니다.

StandardOutput=/home/user/log1.log
StandardError=/home/user/log2.log

그것은해야한다:

StandardOutput=file:/home/user/log1.log
StandardError=file:/home/user/log2.log

서비스를 다시 시작하고 싶지 않을 때 작동합니다 .

새 파일이 만들어지고 기존 파일에 추가되지 않습니다.

대신 사용하십시오 :

StandardOutput=append:/home/user/log1.log
StandardError=append:/home/user/log2.log

참고 : 디렉토리를 이미 작성했는지 확인하십시오. 디렉토리 생성을 지원하지 않는 것 같습니다.


답변

어떤 이유로 rsyslog를 사용할 수없는 경우 다음을 수행합니다.

ExecStart=/bin/bash -ce "exec /usr/local/bin/binary1 agent -config-dir /etc/sample.d/server >> /var/log/agent.log 2>&1"


답변

로그가 이미 stdout / stderr 에 있고 시스템 장치의 로그인 이 있다고 가정합니다 ./var/log/syslog

journalctl -u unitxxx.service

Jun 30 13:51:46 host unitxxx[1437]: time="2018-06-30T11:51:46Z" level=info msg="127.0.0.1
Jun 30 15:02:15 host unitxxx[1437]: time="2018-06-30T13:02:15Z" level=info msg="127.0.0.1
Jun 30 15:33:02 host unitxxx[1437]: time="2018-06-30T13:33:02Z" level=info msg="127.0.0.1
Jun 30 15:56:31 host unitxxx[1437]: time="2018-06-30T13:56:31Z" level=info msg="127.0.0.1

rsyslog 구성 (시스템 로깅 서비스)

# Create directory for log file
mkdir /var/log/unitxxx

# Then add config file /etc/rsyslog.d/unitxxx.conf

if $programname == 'unitxxx' then /var/log/unitxxx/unitxxx.log
& stop

rsyslog를 다시 시작하십시오.

systemctl restart rsyslog.service


답변

우리는 systemd와 함께 스프링 부트 어플리케이션 인 Centos7을 사용하고 있습니다. 나는 아래와 같이 자바를 실행했다. StandardOutput을 파일로 설정하는 것이 작동하지 않았습니다.

ExecStart=/bin/java -jar xxx.jar  -Xmx512-Xms32M

아래의 해결 방법은 StandardOutput을 설정하지 않고 작동합니다. 다음과 같이 sh를 통해 java를 실행하십시오.


ExecStart=/bin/sh -c 'exec /bin/java -jar xxx.jar -Xmx512M -Xms32M >> /data/logs/xxx.log 2>&1'

여기에 이미지 설명을 입력하십시오