2010-03-25 5 views
1

잘못된 접근 방식을 시도했을 수 있으므로 제안 사항은 공개되어 있습니다.Powershell : log4net 개체를 백그라운드 작업으로 전달하려면 어떻게해야합니까?

저는 각각 IIS 서버의 웹 사이트 분석을 수행하는 3 개의 스크립트를 실행 중이며 몇 백 개의 서버에 대해 실행하고 있습니다. 필자는 Start-Job 프로세스로서이를 수행한다는 개념을 증명하므로 병렬로 실행하고 훨씬 더 빨리 끝낼 수 있습니다. 이러한 스크립트는 대부분 WMI 및 파일 시스템이 데이터를 수집하고 반환하기 때문에 대기하므로 병렬 대기가 많은 의미를 갖습니다.

하지만 로그 작업을 할 수 없습니다. 스크립트에 데이터 행을 파이핑하고 Log4net $ Logger를 매개 변수로 보내려고하지만 새로운 Powershell 프로세스는 아무 것도 할 수 없습니다. 여기에 내가 무엇을 시도했다입니다 : (호출 스크립트에서) $ 작업 + = 시작 - 작업 -InputObject $ 응용 프로그램 -FilePath $ 명령 -Name $ app.Name -ArgumentList $ 로그 (호출 된 스크립트에서)

param ([parameter(Mandatory=$false,ValueFromPipeline=$true)] 
$object, 
[parameter(Position=0)] 
$Logger) 

내가 호출 된 스크립트에 log4net.dll로드의 다양한 맛을 시도했습니다

Unable to find type [log4net.ThreadContext]: make sure that the assembly containing this type is loaded. 

(결과). 하지만 정확하게, 나는 또한 단지 호출 된 스크립트 프로세스에 새로운 $ 로거의 인스턴스를 시도했습니다, 그 어떤 로그 조치를 받게 않습니다

Method invocation failed because [Deserialized.log4net.Core.LogImpl] doesn't contain a method named 'Info' 

: 그 결과. 20 개의 프로세스 중 9 개에서 일부 메시지 만 받고 모든 메시지는 아무 것도받지 못합니다.

로깅 할 수없는 옵션은 없습니다. 그 일은 복잡하다. 스크립트의 각 인스턴스에 대해 서로 다른 로그를 실행하는 것은 가능할 수 있지만 더럽고 불쾌한 성가신 일입니다. 대부분, 나는 단지 내가 무언가를하고 있다고 생각한다.

+1

항상 학습 경험. 승인. 새 Powershell 프로세스는 log4net 개체 참조를 동화 할 수 없습니다. 개체가 새 프로세스에 존재하지 않기 때문입니다. 그것은 단지 거기에 없다. 그래서 새로운 객체를 인스턴스화해야합니다. 기간. 하지만 1 개의 부모 스레드와 20 개의 자식 스레드가 다른 프로세스에 있으면 Log4Net은 더 이상 스레드 세이프가 될 수 없습니다. 맞습니까? 승인. 새로운 솔루션을 소개합니다. 어쩌면 파일이 아닌 다른 것으로 로깅하는 것일까 요? 잠금을 해제하면 문제가 발생합니다. – codepoke

+0

데이터베이스를 사용할 수 없지만 (묻지 않음) Windows 이벤트 뷰어에 원활하게 로그온 할 수있었습니다. – codepoke

답변

0

각 생성 된 PowerShell 프로세스는 고유 한 메모리 공간입니다. 그들 간에는 아무 것도 공유되지 않으므로 log4net에 여러 생성 된 작업에서 파일 시스템 로그를 안전하게 조작하도록 요청하는 것은 실패합니다. 데이터베이스 또는 이벤트 로그 기록은 안전 문제를 적절히 처리하고이 질문을 해결합니다.

관련 문제