특정 장치의 로그 출력을 특정 파일로 지정하려면 어떻게 해야 합니까?

특정 장치의 로그 출력을 특정 파일로 지정하려면 어떻게 해야 합니까?

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에서와 같이).

관련 정보