/dev/log 확인

/dev/log 확인

/dev/log시스템 로깅의 기본 항목입니다. systemd 구현(이 예)의 경우 /run/systemd/journal/dev-logsyslog 데몬에 의해 처리된 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, 해당 권한 및 이를 사용하는 사람을 확인해야 합니다. 링크를 확인하고 계십니다.

관련 정보