명령이 실행될 때마다 Bash 출력이 새 파일로 리디렉션됩니다.

명령이 실행될 때마다 Bash 출력이 새 파일로 리디렉션됩니다.

명령을 실행할 때마다 명령 출력을 새로운 새 파일로 리디렉션하는 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

관련 정보