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>
)을 통해 사용할 수 있지만 선택한 파일에서도 사용할 수 있습니다.
답변
당신이 새와 새로운 배포판이있는 경우 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
하고 제안하는 것이 좋습니다 .stderr
service
참조 : 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'