/dev/log
시스템 로깅의 기본 항목입니다. systemd 구현(이 예)의 경우 /run/systemd/journal/dev-log
syslog 데몬에 의해 처리된 Unix 소켓의 수신 끝이 무엇이든 가리킵니다.
~$ echo "hello" > /dev/log
bash: /dev/log: No such device or address
~$ fuser /dev/log
~$ ls -la /dev/log
lrwxrwxrwx 1 root root 28 Aug 23 07:13 /dev/log -> /run/systemd/journal/dev-log
글을 쓰려고 할 때 나타나는 오류에 대한 설명은 무엇입니까? 프로세스가 fuser /dev/log
빈 출력에서 파일을 저장하지 않는 이유는 무엇입니까?
시스템에서 로깅이 제대로 작동하고 있습니다.
~$ logger test
~$ journalctl --since=-1m
-- Logs begin at Thu 2018-05-24 04:23:46 CEST, end at Thu 2018-08-23 13:07:25 CEST. --
Aug 23 13:07:24 alan-N551JM alan[12962]: test
댓글 제안으로 확장
~$ sudo fuser /dev/log
/run/systemd/journal/dev-log: 1 311
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
답변1
의견을 완전한 답변으로 요약하고 있습니다. 알아채다@markplotnick올바른 해결책을 가장 먼저 지적해 보세요.
출력에서 볼 수 있듯이 ls -lL
링크가 가리키는 파일은 다음과 같습니다.소켓, 일반 파일이나 파이프가 아닙니다.
~$ ls -lL /dev/log
srw-rw-rw- 1 root root 0 Aug 23 07:13 /dev/log
출력의 첫 번째 문자를 살펴보십시오. 이는 s
파일이 소켓임을 의미합니다.
>
bash
쉘이 시도하기 때문에 소켓에 쓰기 위해 (또는 AFAIK, 다른 쉘)의 리디렉션 메커니즘을 사용할 수 없습니다.열려 있는이 파일은 소켓을 지원하지 않습니다 open
. 바라보다남자가 열다더 알아보기.
소켓에 연결하는 프로그램을 사용해야 합니다. 바라보다사람들은 연결된다더 알아보기.
예를 들어 다음을 사용할 수 있습니다. netcat
또는 socat
(참조Debian Squeeze에서 쉘을 통해 Unix 도메인 소켓과 통신하는 방법은 무엇입니까?).
완전성을 위해 파이프에서 리디렉션을 사용할 수 있습니다.
~$ mkfifo /tmp/fifo
~$ ls -l /tmp/fifo
prw-rw-rw- 1 root root 0 27 ago 15.04 /tmp/fifo
~$ echo "hello" > /tmp/fifo
ls
출력의 첫 번째 문자를 살펴보십시오 . 이는 p
파일이 파이프라는 것을 의미합니다.
답변2
/dev/log
허용되는(올바른) 대답에 몇 가지 추가 정보를 추가하려면 다음과 같이 작성하여 그것이 단지 UNIX 소켓의 범위임을 알 수 있습니다.
lmassa@lmassa-dev:~$ echo 'This is a test!!' | nc -u -U /dev/log
lmassa@lmassa-dev:~$ sudo tail -1 /var/log/messages
Sep 5 16:50:33 lmassa-dev journal: This is a test!!
내 시스템에서는 로깅 프로세스가 이 소켓을 수신하고 있는 것을 볼 수 있습니다.
lmassa@lmassa-dev:~$ sudo lsof | grep '/dev/log'
systemd 1 root 29u unix 0xffff89cdf7dd3740 0t0 1445 /dev/log
systemd-j 564 root 5u unix 0xffff89cdf7dd3740 0t0 1445 /dev/log
내 메시지를 수신하고 그에 따라 작업을 수행했습니다(예: /var/log/messages 파일에 추가됨).
저널이 말하는 syslog 프로토콜에는 스트림(TCP 생각)이 아닌 데이터그램(UDP 생각)이 필요하기 때문에 소켓에 직접 쓰려고 하면 nc
시스템 호출에 오류가 표시됩니다. 표시됨).
비교하다:
lmassa@lmassa-dev:~$ echo 'This is a test!!' | strace nc -u -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_DGRAM, 0) = 4
connect(4, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = 0
lmassa@lmassa-dev:~$ echo 'This is a test!!' | strace nc -U /dev/log 2>&1 | grep connect -B10 | egrep '^(socket|connect)'
socket(AF_UNIX, SOCK_STREAM, 0) = 3
connect(3, {sa_family=AF_UNIX, sun_path="/dev/log"}, 10) = -1 EPROTOTYPE (Protocol wrong type for socket)
명확성을 위해 일부 시스템 호출을 생략했습니다. 여기서 중요한 점은 첫 번째 호출이 /dev/log 소켓이 예상하는 SOCK_DGRAM을 지정하는 반면( /dev/log
소켓이 원래 생성된 방식 이므로 ) 두 번째 호출은 지정하지 않으므로 Got 오류가 발생한다는 것입니다.
답변3
/run/systemd/journal/dev-log, 해당 권한 및 이를 사용하는 사람을 확인해야 합니다. 링크를 확인하고 계십니다.