명령을 실행할 때마다 명령 출력을 새로운 새 파일로 리디렉션하는 Bash 한 줄짜리가 있습니다. 실행하는 각 명령의 출력을 기록하는 것이 중요합니다. ls
여기서는 예를 들어 사용하고 있지만 실제 명령은 ansible-playbook
다른 명령일 가능성이 높습니다.
$ ls -hl | tee logs/$(date "+%Y-%m-%d_%H:%M:%S").log
이것은 입력하기가 번거롭고 기억하기 어렵지만 내가 원하는 대로 작동합니다(초당 두 번 이상 명령을 실행하지 않는 한). 명령을 여러 번 실행하면 /logs
폴더에 로그가 생성됩니다. 예:
$ ls logs/
2018-12-21_10:28:20.log
2018-12-21_10:28:21.log
2018-12-21_10:31:11.log
2018-12-21_10:32:07.log
내가 알고 싶은 것은 동일하거나 매우 유사한 효과를 달성하는 내가 알지 못하는 기존 Bash 명령이 있습니까? 로그 이름의 형식이 중요합니다(날짜 또는 Unix epoch 선호).
답변1
이것을 쉘 함수로 변환하십시오.
dolog () {
local logdir="${1:-$HOME/logs}"
mkdir -p "$logdir" &&
tee "$logdir/$(date "+%F_%T").log"
}
이는 ~/.bashrc
파일로 이동하여 다음 새 대화형 셸에서 활성화됩니다.
이 기능은 두 가지 방법으로 사용할 수 있습니다.
utility | dolog
그러면 출력이 ~/logs
.
utility | dolog /some/path
그러면 출력이 아래 날짜 파일에 저장됩니다 /some/path
( .
현재 디렉터리에 로그 저장 사용). 디렉터리 /some/path
(또는 ~/logs
첫 번째 예)가 존재하지 않으면 디렉터리가 생성됩니다.
약간 더 고급 버전으로, 어떤 이유로 데이터를 로그 파일에 쓸 수 없는 경우(디렉토리를 만들 수 없거나 로그 파일을 쓸 수 없는 경우) 데이터를 표준 출력으로 전달하는 방식으로 되돌아갑니다. 이렇게 하면 로깅 문제가 발생하더라도 파이프되는 명령이 종료되지 않습니다.
dolog () {
local logdir="${1:-$HOME/logs}"
mkdir -p "$logdir" && tee "$logdir/$(date "+%F_%T").log" || cat
}
예:
$ touch ~/logs # this creates a file in my home directory
$ ls -l | dolog
mkdir: /home/myself/logs: Not a directory
total 0
-rw-r--r-- 1 myself staff 0 Dec 21 13:08 logs