2012-06-01 6 views
1

Sql Server 데이터베이스에 정보를 기록하는 데 Log4Net을 사용하는 WCF 서비스가 있습니다. Log4Net의 GlobalContext를 사용하여 트랜잭션 이름, 상태, 메시지 및 기타 몇 가지 추가 정보를 기록합니다. 이 시스템에서 중요한 트랜잭션 중 일부는 읽기, 쓰기 및 로그인입니다.Log4Net에서 잘못된 데이터를 기록합니다.

  • 이 -------- "성공"을 "읽기"
  • "쓰기", "XXX 고객 데이터를 읽기"-------- : 같은

    로그가 보일 것입니다 -------- "성공"-------- "xxx 고객의 데이터"

  • "로그인"-------- "실패"-------- "사용자 세션이 이미 있습니다."

정상적인 테스트를 실행하면 모든 것이 정상적으로 작동합니다. 로그는 데이터베이스에 완벽하게 기록됩니다. 그러나 최근에는 JMeter를 사용하여 부하 테스트를 수행했습니다. 위에서 언급 한 세 가지 트랜잭션은 100 개의 동시 스레드에서 3 분 동안 테스트되었습니다. DB 로그를 검사했을 때 일부 정보가 잘못 기록 된 것으로 나타났습니다.

예 :

  • 이 -------- "성공"-------- "읽기" "사용자 세션이 이미 존재합니다."
  • 이 -------- "XXX 고객 데이터를 읽기"-------- "성공", "쓰기"

이 Log4Net GlobalContext 스레드 안전되지 않는에 문제가 있습니까? GlobalContext 대신 ThreadContext를 사용했지만 많은 정보가 기록되지 않은 것처럼 보입니다.

+0

DB에 동시에 쓰려고했기 때문에 메시지를 작성하는 동안 db에 메시지가 섞여있는 것처럼 보입니다. 디버거를 자세히 살펴보고 전체 체인을 검사해야합니다. –

+0

GlobalContext는 문서 당 스레드로부터 안전합니다. http://logging.apache.org/log4net/release/manual/contexts.html – VJAI

+0

@ 마크 : 나는 그것을 보았습니다. 그러나, 내가 직면 한 이슈는 내가 다른 생각을하게 만든다 !!! – Thomas

답변

0

LogicalThreadContext가 나를 위해 속임수를 사용했습니다!

관련 문제