Sql Server 데이터베이스에 정보를 기록하는 데 Log4Net을 사용하는 WCF 서비스가 있습니다. Log4Net의 GlobalContext를 사용하여 트랜잭션 이름, 상태, 메시지 및 기타 몇 가지 추가 정보를 기록합니다. 이 시스템에서 중요한 트랜잭션 중 일부는 읽기, 쓰기 및 로그인입니다.Log4Net에서 잘못된 데이터를 기록합니다.
- 이 -------- "성공"을 "읽기"
- "쓰기", "XXX 고객 데이터를 읽기"-------- : 같은
로그가 보일 것입니다 -------- "성공"-------- "xxx 고객의 데이터"
- "로그인"-------- "실패"-------- "사용자 세션이 이미 있습니다."
정상적인 테스트를 실행하면 모든 것이 정상적으로 작동합니다. 로그는 데이터베이스에 완벽하게 기록됩니다. 그러나 최근에는 JMeter를 사용하여 부하 테스트를 수행했습니다. 위에서 언급 한 세 가지 트랜잭션은 100 개의 동시 스레드에서 3 분 동안 테스트되었습니다. DB 로그를 검사했을 때 일부 정보가 잘못 기록 된 것으로 나타났습니다.
예 :
- 이 -------- "성공"-------- "읽기" "사용자 세션이 이미 존재합니다."
- 이 -------- "XXX 고객 데이터를 읽기"-------- "성공", "쓰기"
이 Log4Net GlobalContext 스레드 안전되지 않는에 문제가 있습니까? GlobalContext 대신 ThreadContext를 사용했지만 많은 정보가 기록되지 않은 것처럼 보입니다.
DB에 동시에 쓰려고했기 때문에 메시지를 작성하는 동안 db에 메시지가 섞여있는 것처럼 보입니다. 디버거를 자세히 살펴보고 전체 체인을 검사해야합니다. –
GlobalContext는 문서 당 스레드로부터 안전합니다. http://logging.apache.org/log4net/release/manual/contexts.html – VJAI
@ 마크 : 나는 그것을 보았습니다. 그러나, 내가 직면 한 이슈는 내가 다른 생각을하게 만든다 !!! – Thomas