StandardOutput
로그 위치에 로그인하도록 구성된 서비스가 있습니다. 일부 사용자는 로그 데이터 수집 시 로그 경로를 삭제할 수 있습니다. 서비스를 다시 시작했는데 경로가 존재하지 않으면 서비스가 실패합니다. 해결 방법이 있나요? 우선 순위에 따른 솔루션은 다음과 같습니다.
[Unit]
Description=Some service
[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:<path_to_logs>/service-stdout.log
[Install]
WantedBy=default.target
- StandardOutput을 기록할 경로를 만듭니다. StartExecPre와 내 서비스 스크립트 자체를 사용하여 시도했지만 성공하지 못했습니다.
ExecStartPre=mkdir -p <path_to_logs>
경로가 존재하지 않는다는 것을 무시하고 아무것도 기록하지 않고 계속합니다.
기본 위치에 로그인합니다. 로그에서 출력을 찾으려고 했지만 전혀 표시되지 않습니다. 서비스에 StandardOutput 매개변수가 지정되지 않은 경우 실제로 기본적으로 기록됩니까?
미리 감사드립니다
답변1
man systemd.exec
설명하다:
추가:경로는 위의 파일:경로와 비슷하지만 파일을 추가 모드로 엽니다.
file:path 옵션... 경로가 파일 시스템의 일반 파일을 참조하는 경우 해당 파일을 엽니다(또는 아직 없으면 만듭니다)...
따라서 파일이 존재할 필요는 없습니다. 그러나 그것이 있는 디렉토리는 아마도 존재해야 할 것입니다.
로그 디렉터리가 존재하는지 확인하는 방법에는 여러 가지가 있습니다.
- 소프트웨어가 패키지된 경우 에 영구 디렉토리를 생성하십시오
mkdir -p /var/log/...
.postinst
그러면 영구 디렉토리가 생성됩니다. 이건 사소한 일이라 자세히 다루지는 않겠습니다. - TMP 파일.d. 이렇게 하면 디렉터리가 존재하는지 확인할 수 있습니다. 삭제된 경우(또는 tmpfs에 존재하는 경우) 다음 부팅 시 다시 생성됩니다. 이것이 systemd가 보장
/run/log/journal
되고/var/log/journal
존재하는 방식입니다. LogsDirectory=
장치를 시작할 때 로그 디렉터리를 만드는 데 사용할 수 있습니다.- 경로 단위. 시작 시 디렉터리가 생성되고 모니터링되도록 하는 "myservice.path"라는 완전히 새로운 단위를 만들 수 있습니다. 디렉터리가 삭제되면 장치는
mkdir -p
디렉터리를 다시 생성하기 위해 실행되는 서비스를 트리거할 수 있습니다.
임시 파일.d:
네가 원한다면:
[Service]
StandardOutput=append:/var/log/myservice/log.log
그런 다음 이 파일을 만듭니다.
# /etc/tmpfiles.d/myservice.conf
#Type Path Mode User Group Age Argument
d /var/log/myservice 0755 root root - -
이 경우 사용자는 이 디렉터리를 읽을 수 있지만 삭제할 수는 없습니다(관리자 권한 없이). 삭제한 경우 systemd-tmpfiles-setup.service
재시작 또는 재시작을 통해 다시 생성할 수 있습니다.
로그 디렉토리 =
man tmpfiles.d
설명하다:
시스템 데몬에는 개인 런타임 디렉토리가 필요한 경우가 많습니다. 이를 위해 tmpfiles.d에서 제공하는 유연성이 필요하지 않은 경우 해당 유닛 파일에서 RuntimeDirectory=를 사용하는 것이 가장 좋습니다(자세한 내용은 systemd.exec(5) 참조). 장점은 장치에 필요한 구성이 한 곳에 있고 디렉터리의 수명 주기가 서비스 자체의 수명 주기와 연결되어 있다는 것입니다. 마찬가지로 ..., LogsDirectory=, ...를 사용하여 ... /var/log/... 아래에 디렉터리를 생성해야 합니다. tmpfiles.d는 수명 주기가 서비스와 독립적이거나 더 복잡한 파일에 사용해야 합니다. 구성.
따라서 다음을 사용하는 것이 좋습니다.LogsDirectory=
.
한 가지 장점은 사용자가 디렉터리를 삭제하면 서비스를 다시 시작할 때마다 디렉터리가 자동으로 생성된다는 것입니다.
예는 다음과 같습니다.
[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:/var/log/myservice/service-stdout.log
LogsDirectory=myservice
이 디렉터리의 경로는 서비스에 환경 변수로 제공될 수도 있습니다 $LOGS_DIRECTORY
.
이 솔루션의 단점은 디렉터리가 항상 .로 끝나는 것으로 가정한다는 것입니다 /var/log
. 일부 샌드박스 구성에서는(아마도 . 를 사용할 때 DynamicUser=
) 또는 이 장치가 버스로 이동될 때 그렇지 않을 수도 있습니다 --user
.
답변2
로그에서 로그를 찾으려면 stdout을 syslog로 설정하고 StandaedOutput=syslog
다음 rsyslog
을 사용하여 서비스를 다시 시작해야 합니다.systemctl restart rsyslog
이것을 참고하세요——https://stackoverflow.com/questions/37585758/how-to-redirect-output-of-systemd-service-to-a-file