Arch Linux의 로그에 로그 정보를 출력하는 여러 데몬(systemd 장치)을 실행하는 시스템이 있습니다. 이러한 단위 파일 중 일부의 로그 출력을 내가 지정한 위치에 있는 별도의 텍스트 파일로 지정하여 기본적으로 단위의 하위 집합에 대한 로그 파일을 생성하고 싶습니다. 어떻게 해야 하나요?
답변1
고쳐 쓰다:이것은 실제로 최신 systemd 버전(systemd 236 기준)에서 가능합니다. 바라보다시스템 실행 프로그램~을 위한표준 출력그리고표준 에러제전. 이는 다음 옵션을 지원합니다(발췌):
이것파일 경로옵션을 사용하여 특정 파일 시스템 개체를 표준 출력에 연결할 수 있습니다. 의미 체계는 StandardInput=과 동일한 옵션과 유사합니다(위 참조). 경로가 파일 시스템의 일반 파일을 참조하는 경우 파일 시작 부분에 쓰기 위해 열리지만(또는 존재하지 않는 경우 생성) 잘리지 않습니다. 표준 입력 및 출력이 동일한 파일 경로로 지정되면 읽기, 쓰기 및 복사를 위해 한 번만 열립니다. 이는 지정된 경로가 파일 시스템의 AF_UNIX 소켓을 참조할 때 특히 유용합니다. 이 경우 입력 및 출력에 대해 단일 스트림 연결만 생성되기 때문입니다.
추가: 경로위의 file:path와 비슷하지만 파일을 추가 모드로 엽니다.
자르기: 경로위의 파일:경로와 유사하지만 파일을 열 때 파일이 잘립니다. 여러 ExecStart=가 있는 Type=oneshot 서비스 또는 ExecCondition=, ExecStartPre= 또는 ExecStartPost=가 있는 서비스와 같이 여러 명령줄이 있는 장치의 경우 출력 파일이 다시 열리므로 각 명령줄에 대해 다시 잘립니다. 출력 파일이 잘리고 다른 프로세스에서 여전히 파일이 열려 있는 경우(예: ExecReload=를 ExecStart=와 동시에 실행하여) 다른 프로세스가 오프셋을 조정하지 않고 계속해서 파일에 쓰는 경우 파일에 대한 파일 포인터는 다음과 같습니다. 두 프로세스 사이의 공간이 NUL 바이트로 채워져 파일이 희박해질 수 있습니다. 따라서 truncate:path는 일반적으로 단일 ExecStart=가 있고 ExecStartPost=, ExecReload=, ExecStop= 또는 이와 유사한 서비스가 없는 서비스와 같이 한 번에 하나의 프로세스만 실행하는 장치에만 적합합니다.
[...]
이것FD: 이름옵션은 표준 출력을 소켓 장치에서 제공하는 특별히 명명된 파일 설명자에 연결합니다. 이름은 이 옵션의 일부로 지정될 수 있으며 그 뒤에 ":" 문자가 옵니다(예: "fd:foobar"). 이름이 지정되지 않으면 "stdout"이라는 이름이 암시됩니다(예: "fd"는 "fd:stdout"과 동일함). 지정된 이름을 정의하는 하나 이상의 소켓 단위는 Sockets= 옵션을 통해 제공되어야 하며 파일 설명자 이름은 포함된 소켓 단위의 이름과 다를 수 있습니다. 일치하는 항목이 여러 개 발견되면 첫 번째 일치 항목이 사용됩니다. 명명된 설명자와 해당 순서에 대한 자세한 내용은 systemd.socket(5)의 FileDescriptorName=을 참조하세요.
원래 답변:
이는 불가능하고 업스트림이 필요하지 않은 것 같습니다(stdout/stderr를 단일 파일로 리디렉션). 예를 들어 다음을 참조하세요.http://lists.freedesktop.org/archives/systemd-devel/2012-March/004705.html- 이것이 어떻게 작동하는지에 대한 자세한 내용을 보려면 전체 스레드를 읽으십시오.
당신이 할 수 있는 일은 syslog에 기록하고 단일 파일에 쓰는 것입니다. 또는 반대로 장치가 로그 자체를 기록할 수 있는 일부 프로그램을 호출하는 경우 해당 프로그램을 사용하여 파일에 기록합니다.
당신은 또한 살펴보고 싶을 수도 있습니다systemd 서비스의 stdout/stderr 보기
현재 설정으로 이미 수행할 수 있는 작업은
journalctl -u yourunitname > yourlogfile_for_yourunitname
"yourunitname" 유닛의 전체 로그 출력을 파일로 보내는 것입니다.
후반부에서는 위 메일링 리스트 스레드에 있는 Lennart의 팁도 살펴봐야 합니다.
최근 시스템 버전에서는 이와 같은 것이
systemd-journalctl -o cat _SYSTEMD_UNIT=postgresql.service
실제 메시지만 포함하고 다른 내용은 포함하지 않는 매우 간단한 출력을 생성해야 합니다. "-f"를 전달하여 적용할 수도 있습니다. "
편집하다:
실제로 최신 시스템 버전의 경우 명령은 다음과 같습니다.로그 제어내가 아는 한, 위의 긴 명령은 동일하며 출력을 "따를" journalctl -u yourunitname
수도 있습니다 -f
( tailf 또는 tail -f에서와 같이).