여러 스크립트의 로그 출력

여러 스크립트의 로그 출력

프로세스 로깅에 대해 질문이 있습니다.

  • a.py, b.py 및 c.sh라는 3개의 스크립트가 있습니다.
  • a.py는 b.py를 호출하고, b.py는 c.sh를 호출합니다.

목표는 std out/err을 지속적으로 로그하는 것입니다(파일 및 콘솔에 쓰기).

현재 다음과 같은 초기 스크립트를 시작하려고 합니다.

python -u a.py 2>&1 | tee logfile.txt

이제 문제는 c.sh의 출력이 b.py가 실행을 완전히 마친 후에만 인쇄/기록된다는 것입니다. 그러나 저는 c.sh의 모든 행이 차례로 표시되지 않도록 활성화하고 싶습니다. , 전체 과정이 완료된 후 함께 나타납니다).

이것을 기록하는 더 좋은 방법이 있습니까? 아니면 티를 통해 어떻게든 달성할 수 있습니까?

답변1

내 개인적인 의견으로는 명령줄 스크립트나 응용 프로그램에서 가장 먼저 해야 할 일은 로깅 시스템을 설정하는 것입니다. 재사용 가능한 몇 줄만 사용하면 다양한 디버깅 수준에서도 모든 Python 애플리케이션에 로그인할 수 있습니다. :)

나는 tee가 있는 파일에 stdout을 쓰는 것을 기반으로 로깅하지 않고 단지 stdout과 로깅 채널에 로깅할 것입니다. 나는 당신이 Python 스크립트를 수정할 수 있고 아래의 모든 것이 이 경우에 작동할 것이라고 가정합니다. ("티셔츠 답변 사용"을 위해 아래로 스크롤하세요.:).

Python에서는 Logging 모듈을 사용할 수 있습니다(공식 Python 문서에서 Logging HOWTO를 확인하세요:https://docs.python.org/2/howto/logging.html) 그러나 불행하게도 다른 프로세스는 동일한 파일에 쓸 수 없습니다(동일한 프로세스의 다른 프로세스는 가능함).

따라서 귀하가 설명하는 이 시나리오에서는 기본 사례는 로깅 라이브러리 또는 syslog 라이브러리를 사용하여 syslog에 로그인하는 것이라고 생각합니다(https://docs.python.org/2/library/syslog.html).

모든 애플리케이션에서 syslog의 local0.* 기능에 로그인하고 syslog(내 경우에는 rsyslog)가 해당 파일에 쓰도록 할 수 있습니다.

local0.*                /var/log/myapp.log

이 시스템의 가장 좋은 점은 애플리케이션이 실행되는 컴퓨터뿐만 아니라 다른 컴퓨터의 원격 syslog 서버에도 로그인할 수 있다는 것입니다.

PS: 애플리케이션 로그 파일을 교체하려면 /etc/logrotate.d/myapp 정책을 설정하는 것을 잊지 마세요!

티 옵션

그래도 사용해야 한다면 두 번째 및 세 번째 프로세스에서 tee해당 플래그를 사용해 보셨나요? -a에서 언급했듯이http://docstore.mik.ua/orelly/unix/upt/ch13_10.htm:

tee(13.9) 명령은 표준 입력을 파일에 쓰고 동일한 텍스트를 표준 출력에 씁니다. 여러 명령의 출력을 수집하여 동일한 파일에 순차적으로 보낼 수 있습니다. 가장 확실한 방법은 -a 옵션을 사용하는 것입니다.

$ 일부 명령 | 티셔츠 티셔츠 파일

$ 다른 명령 |

$ 세 번째 명령 |

관련 정보