이에 대한 관련 패턴을보고 싶지만 여기에 내 즉각적인 특정 문제가 있습니다.
나는이 요구 로그의 모든 항목이 로그 항목 결과 코드를 실행에 대한 책임이있는 엔티티 (사용자 이름 또는 프로세스 이름) 주석되도록 웹 응용 프로그램에서 로깅을 수정할 수 있습니다. 예를 들면 다음과 같습니다.
타임 스탬프 수준 loggerName 데이터베이스에서 민감한 개체가 삭제되었습니다.
당신은 얻을 것이다
타임 스탬프 수준 loggerName [ELLIOT.ALDERSON] 민감한 개체가 데이터베이스에서 삭제되었습니다.
또는
타임 스탬프 수준 loggerName [DAILY CRON JOB] 중요한 개체가 데이터베이스에서 삭제되었습니다.
작업을 수행 한 "사용자"(또는 프로세스)를 식별하는 것 외에도 사용자 인 경우 요청 자체에 대한 정보 (예 : IP 주소, 사용자 에이전트, 헤더 등)를 기록해야하는 요구 사항 도 있습니다 . 해당 데이터는 부속 로그에 기록 될 수 있으므로 기본 로그 자체를 읽을 수 있습니다.
Java에서 이것은 우리가 사용하는 HTTP 서버 (Tomcat)가 하나의 요청 / 하나의 스레드를 '보장'하여 사용자 정보와 요청 정보를 모두 스레드에 넣을 수 있기 때문에 로거에 대한 인터페이스를 수정 하지 않고 수행하는 것이 상대적으로 간단했습니다. 지역 변수. 내 코드는 어디에서나 "누가"호출했는지 파악하고 현재 사용자와 해당 스레드와 관련된 요청을 요청하여 요청 속성에 액세스 할 수 있습니다. 전체 애플리케이션을 통해 모든 메서드의 사용자 및 요청 변수를 전달할 필요가 없습니다. 즉, 내 코드가 로그에 기록 될 때 최소한으로 수정 된 로거 코드가 내 애플리케이션의 로거에 대한 단일 호출을 변경하지 않고도 원하는 출력을 생성 할 수 있습니다.
C # .NET에서는이 작업을 수행하는 방법을 모릅니다. IIS는 풀에서 스레드 재사용을 거의 보장하므로 스레드 로컬 변수를 사용하여 특정 메서드 호출과 관련된 사용자 및 요청을 식별합니다 (따라서 해당 메서드에 의해 수행 된 로거 호출에 연결되는 사용자 / 요청). 내가 읽은 모든 AOP 기사는 그렇게 많은 데이터가 아니라 행동 을 적용하는 것에 대해 다룹 니다.. 물론 컨트롤러 메서드 자체에서 세션을보고 정보를 요청할 수 있습니다. 그러나 컨트롤러는 메소드를 호출하는 메소드를 호출하는 메소드를 호출합니다. 광고 메스꺼움, 세션 및 요청이 비스타 터 인 모든 메소드에 추가 매개 변수로 전달되지 않는 한 해당 메소드는 가시성이 없습니다. 스택을 컨트롤러까지 걸어가거나 컨트롤러가 없다고 확신 할 때까지 기각했습니다. 그러나 스택 추적은 기본적으로 특정 프레임과 관련된 소스 코드를 식별 할뿐 스택의 실제 개체에 대한 액세스 권한을 부여하지 않습니다. 또한 로그 데이터를 포맷하고 쓰는 것만 큼 비싸지 만 스택을 걷는 데 드는 추가 비용은 약간 과도하게 보입니다).
교차 절단 우려 코드에 대해 임의의 컨텍스트 별 데이터 (이 경우 세션 및 요청 객체)에 대해 동일한 종류의 가시성을 허용하는 기술이 있습니까?
현재 요청 데이터에 대한 정적 액세스가 필요한 경우 HttpContext.Current.Items를 사용할 수 있습니다. 그것은 문자열, 객체의 사전이며 모든 요청에 따라 다릅니다. 스레드를 변경하면 (즉, async await를 사용하는 경우) 컨텍스트가 유지되고 올바른 데이터를 찾을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다