사용자 공간 프로그램은 어디에 로그를 저장해야합니까?


23

권한없이 실행하려는 스크립트를 작성 중입니다. 스크립트에서 발생한 오류가 일부 로그 파일에 기록되기를 원합니다. 에 쓸 수있는 권한이 없습니다 /var/log. 그리고 나는 내 홈 디렉토리에 하나를 갖고 싶지 않습니다.

사용자 공간 스크립트가 런타임 정보를 기록 할 수있는 위치가 있습니까? /var/log잠재적 인 보안 문제없이 스크립트 로그 정보를 작성 하는 가장 좋은 방법은 무엇입니까 ? 스크립트에 uid / gid를 설정하는 것을 망설입니다.

답변:


8

일반 사용자로 / var / log에 쓸 수는 없지만 syslog 데몬이 요청하면이를 수행합니다. 표준 시스템 로그 (예 /var/log/syslog:)에 메시지를 기록하려면 시스템 에서 4.4BSD 유틸리티를 logger사용할 수 있습니다. 기본적으로 데비안에 설치되어 bsdutils있으며 데비안 파생 패키지에 있습니다.

시스템 로그 를 읽을 수 있는 권한이 필요 하지 않고 스크립트 메시지를 다른 프로그램의 메시지와 혼합 해야한다는 단점이있는 기존의 모든 로그 회전, 유지 관리 및 모니터링 도구 를 활용할 수 있습니다.

$ logger Hello
$ echo Goodbye | logger
$ sudo tail -2 /var/log/syslog
Feb 19 21:16:15 debian-host jander: Hello
Feb 19 21:16:21 debian-host logger: Goodbye

사용 가능한 몇 가지 구성 옵션이 있습니다. 에서 더 많은 내용을 읽을 수 있습니다 man logger.


이 유틸리티에 대한 언어 바인딩이 있습니까? 오히려 stdout 인앱의 각 줄에 대해 하위 프로세스를 생성하지 않습니다.
ThorSummoner

@ThorSummoner : Gilles의 답변에서 알 수 있듯이 syslogC 라이브러리 루틴이며 C ++는을 사용하여 C를 호출 할 수 있습니다 extern "C". 다른 언어는 종종 C에 대한 일반적인 바인딩 또는 특정 사물에 대한 바인딩을 제공하지만 언어에 따라 다릅니다.
dave_thompson_085

12

일반 사용자로서 프로그램을 실행하기로 결정한 경우, 로그의 자연스러운 위치는 홈 디렉토리에 있습니다. 홈 디렉토리는 사용자가 실행하는 프로그램의 로그이든 다른 파일이든 관계없이 모든 파일을 저장하기위한 것입니다.

프로그램이 시스템의 일부로 실행되고 일반적으로 전용 시스템 사용자로 실행되는 경우 로그의 자연스러운 위치는입니다 /var/log. 서브 디렉토리를 작성하고 /var/log/myapp응용 프로그램이 해당 디렉토리에 쓸 수 있도록 적절한 권한을 부여하십시오.

관련성이 있고 운영 체제에서 허용하는 경우 로그 파일을 추가 전용으로 표시하십시오. 오직 루트 만이 이것을 할 수 있습니다. 이는 응용 프로그램이 손상되면 과거의 로그를 지울 수 없으므로 손상에 대한 법 의학적 분석에 매우 유용합니다. 로그를 회전하려면 루트의 개입이 필요 chown합니다. 로그 파일을 더 이상 응용 프로그램, rename로그 파일에서 열 수 없도록 하고 적절한 소유권을 가진 새 추가 전용 파일을 만든 다음 새 빈 파일을 열도록 응용 프로그램에 알리십시오. .

당신은 호출하여 시스템 로그에 대한 응용 프로그램 로그를 만들 수 있습니다 logger(1)또는 syslog(3).


4

일반적으로 데몬의 경우 로그 파일이 생성되고 root권한이없는 사용자가 쓸 수 있도록 권한이 변경됩니다. logrotate그런 다음 회전 중에 권한을 유지하도록 설정됩니다.

데몬이 아닌 명령 인 경우 /tmp(바람직하게 사용 mktemp) STDOUT에 로그인하고 로그가 어디로 갔는지 사용자에게 알리십시오 .


좋은 생각. ~ / .profile에 dropbox 악마가 실행 중인지 확인하고 그렇지 않은 경우 시작하는 몇 줄이 있습니다. &프롬프트를 유지하지 않기 위해를 추가하는 것을 고려하고 있었지만 dropbox 쓰기를 시작하면 콘솔에 기록됩니다. 현재 출력을로 리디렉션 /dev/null중이지만 보관 용 계정이 시작되지 않으면 디버깅 할 수있는 방법이 필요합니다.
주님로.

1
확인하십시오 daemonize.
bahamat

"권한은 권한이없는 사용자가 쓸 수 있도록 변경됩니다." 이것은 단순히 chmod 666에 의해 수행됩니까? 또는 그룹이나 그와 비슷한 것에 사용자를 추가해야합니까?
주님로.

/ var / tmp에서는 / tmp가 부팅 후에도 유지 되지 않을 수 있습니다.
vonbrand

@LordLoh .: 예 chmod. 일반적으로 0644또는 0664사용자 / 그룹 소유권도 여기에 쓸 것으로 예상되는 데몬의 소유권으로 변경됩니다.
bahamat

3

사용자 공간 프로그램은 기본적으로 로그를 버릴 것으로 예상됩니다. 다양한 프로그램이 원하는 곳에서 로그를 덤프하는 것을 보았습니다. 특히 내 시스템에서는 결코 환영받지 않습니다. 거대해질 때까지는 눈에 띄지 않는 어떤 위치에 쌓이는 경향이 있습니다.

나는 그들에게 명확한 장소가 있다면 선호합니다. 나는 그들을 위해 안정된 장소를 찾으려고 노력하고 있습니다.

내 첫 번째 아이디어는을 사용하는 /var/run/user/$UID/log것이었지만 내 시스템에서는 TMPFS 마운트이거나 충분히 크지 않거나 로그와 함께 사용하기에 적합하다는 것을 알았습니다.

그들을위한 장소를 만드십시오

/ var / run / user를 잘 이해할 수 없기 때문에 사용자 1000을 위해 수동으로 에뮬레이션하기로 선택했습니다.

# mkdir /var/log/user
# install -d /var/log/user/1000 --owner 1000 -g 1000 -m 0700

이 폴더 내의 구조에 대해 FHS / var / log spc 를 고수하는 것이 좋지만 사양이 자유 형식이므로 준수하지 않아도됩니다.

Logrotate 구성

시스템에서 제공 한이 디렉토리에는 기존 로그 순환이 없습니다. 시스템에 대한 로그 순환을 생성하는 것이 좋습니다.

# /etc/logrotate.d/userlogs

/var/log/user/*/log/*.log 
/var/log/user/*/log/**/*.log
{
        daily
        missingok
        rotate 7
        compress
        notifempty
        nocreate
}

아래는 이전의 / var / run / user / 1000 / log 게시물입니다. 실제로 무엇을하는지 알지 못한다면 추천 할 수 없습니다 (그렇게하면 방법도 알려주십시오!)

어쩌면 다음과 같이 할 수 있지만, 나는 이것이 의미가 있기 때문에 이것을 만들었습니다.

/var/run/user/1000/log/<app>.log
/var/run/user/1000/log/<app>/<context>.log

/ var / log / user / 1000과 통합 :

# Integrate with above /var/run/user, probably a bad idea:
# ln -s /var/log/user/1000/ /var/run/user/1000/log

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.