프로그래밍 방식으로 장기 실행 프로그램을 모니터링하는 방법


11

내가 현재 가지고있는 것은이 의사 코드와 요약 할 수 있습니다.

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

이 프로그램은 서버에 예약 된 작업으로 설정되었습니다. 우리는 프로그램을 소유하고 있으며 우리가 원하는 것을 할 수 있습니다. 내 질문은 자동 모니터링 확인에 관한 블로그에서 나옵니다 (링크가 없습니다).

그래서 제가 생각하게되었습니다 : 세상에서 다른 "모니터링"프로그램을 실행할 수 있도록 어떻게 프로그램을 수정할 수 있습니까? 또는 콘솔 프로그램에서 숨겨진 WPF 프로그램으로 변경해야 합니까?

전반적으로, 나는 네트워크를 통해 프로그램의 진행 상황을 확인하는 컴퓨터에서 프로그램을 실행하는 것을 선호하므로 상태를 확인하기 위해 서버에 RDP 할 필요가 없습니다 (그러나 그렇지는 않습니다) 세상의 끝이 되십시오).

전반적으로, 나는 다음과 같은 창을보고 싶다고 가정합니다 : 지금까지 x의 프로세스 x, 다음 항목이 처리되고 있습니다. 항목을 표와 같이 나열하고 "업로드"또는 "응답 대기 중"이라고 말합니다. 어쩌면 내가 미쳤다면 어떻게 실패한 항목 대기열을 얻을 수 있었는지 (그러나 그것은 추가 일 것입니다).

내 마음은 계속 이벤트에 기대어 있지만 실행중인 프로그램을 구독하고 구독 취소 할 수있는 프로그램을 어떻게 실행할지 알 수 없습니다. 이것이 가능합니까?


(10 분 지속) 업로드 / 응답 작업 내에서 진행 상황을 모니터링하거나 "Parallel.ForEach"루프 내에서 발생한 업로드 수를 알고 싶습니까?
Doc Brown

@DocBrown은 편집을 참조하십시오. (마지막 두 단락)
Robert Snyder

1
원하는 것은 아마도 간단한 UDP 수신기 프로그램 일 것입니다. 네트워크에서 상태 패킷을 삭제할 수 있으며 수신 할 패킷이 없으면 해를 입히지 않습니다.
Robert Harvey

답변:


7

필요한 것은 프로그램을 서로 연결하지 않는 프로그램간에 통신하는 방법입니다. 이 작업을 수행하는 방법에는 여러 가지가 있습니다. 작업을 파일에 쓰고 파일에서 읽은 것을 모니터링하고 WCF를 통해 작업을 사용할 수있게하여 모니터가 변경 사항에 대해 '폴링'할 수 있도록 네트워크를 사용할 수 있습니다.

바퀴를 다시 만들지 않으려면 log4net 로깅 대상을 살펴보십시오. 이와 같은 것을 구현하려면 아마도 log4net을 사용하고 UDP 또는 Telnet에 로그하고 다른 쪽 끝에 모니터를 연결하십시오. log4net은 활성화 된 모니터가 없을 때 예외를 발생시키지 않는 것을 포함하여 모든 것을 처리합니다.


나는 우리가 이미 log4net을 잘 사용하고 있기 때문에이 답변을 사용하기 위해 기뻐한다고 생각합니다. log4net이 이것을 할 수있는 단서가 없었습니다! 감사합니다
Robert Snyder 1

9

귀하의 의견에서 클라이언트 / 서버 데이터베이스를 사용할 수 있으며 업 로더가 이미 연결 및 쓰기 권한이 있습니까? 그런 다음 데이터베이스에 "모니터링"또는 "상태"테이블을 추가하고 업 로더가 진행 상황을보고하게하는 것이 가장 쉬울 것입니다 (각각 "흥미로운"단계, 위에 나열된 5 단계를 기록하십시오).

상태를 보려면 GUI로 두 번째 프로그램을 작성하십시오. GUI를 사용하여 데이터베이스에 연결하고 상태를 표시하십시오 (예 : 1 분 간격으로 폴링). 로컬 데스크톱에서 해당 프로그램을 실행할 수 있으며 거기에서 데이터베이스에 연결할 수 있다고 가정합니다.

물론, 상태 테이블에 쓰는 것이 데이터베이스 트랜잭션을 방해 할 때 별도의 연결을 사용할 수 있습니다. MSQM 과 같은 메시지 큐 메커니즘을 활용할 수도 있지만 간단한 경우에는 너무 큰 솔루션 일 수 있습니다.


+1 이것은 단순하게 유지하고 너무 복잡하지 않아야하는 것을 지나치게 복잡하게하지 않는 가장 좋은 방법입니다.
Thomas Stringer

3

@JDT의 답변을 바탕으로하는 일반적인 방법은 메시지를 메시지 대기열에 쓰는 것입니다. 응용 프로그램에서 중요한 일이 발생할 때마다 메시지를 작성하여 메시지 큐로 보냅니다. 일반적으로 메시지 형식은 XML 또는 유사합니다. 큐 라이터입니다.

모니터링 애플리케이션은 큐를 읽고 (큐 리더) 메시지를 선택하고 저장하고 메시지와 이전 메시지 또는 조건을 분석하여 메시지를 처리합니다. 조건이 충족되면 모니터링 응용 프로그램이 잠재적 문제를 나타내는 경고를 발생시킵니다.

이것은 단지 메시지를 발생시키기 때문에 어플리케이션 자체의 모니터링을 분리시킵니다. 현재 메시지를 기반으로 언제 좋은 일이 있었는지 판단하는 것은 모니터링 응용 프로그램에 달려 있습니다. 큐는 손실없이 메시지를 저장하는 좋은 수단을 제공하기 때문에 사용됩니다.

응용 프로그램 인스턴스가 여러 개 실행중인 경우 중앙 집중식 메시징을 원합니다. 인스턴스가 하나만 있으면 Windows 이벤트 로그 나 파일과 같은 다른 저장소를 사용하는 것으로 충분할 수 있습니다.

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