프로덕션에서 사용자 작업 로깅을위한 모범 사례


22

나는 프로덕션 환경에서 사용자가 할 때와 같은 많은 다른 것들을 로깅 할 계획이었습니다.

  • 로그인, 로그 오프
  • 프로필 변경
  • 계정 설정 편집
  • 비밀번호 변경 ... 등

프로덕션 환경에서이 작업을 수행하는 것이 좋은 방법입니까? 또한이 모든 것을 기록하는 좋은 방법은 무엇입니까? 현재 다음 코드 블록을 사용하여 로그인하고 있습니다.

public void LogMessageToFile(string msg)
        {

            System.IO.StreamWriter sw = System.IO.File.AppendText(
                GetTempPath() + @"MyLogFile.txt");
            try
            {
                string logLine = System.String.Format(
                    "{0:G}: {1}.", System.DateTime.Now, msg);
                sw.WriteLine(logLine);
            }
            finally
            {
                sw.Close();
            }
        }

프로덕션에 괜찮을까요? 내 응용 프로그램은 매우 새롭기 때문에 즉시 수백만 명의 사용자를 기대하지 않으며 웹 사이트에서 작업을 추적하는 모범 사례를 찾거나 모범 사례를 찾고 있습니다.


1
아마 Database텍스트 파일 이상을 제안 할 것입니다 ...

@DaveZych : 로깅 목적에 따라 다릅니다. 오류 추적 / 추적이 해당 목적의 일부이면 데이터베이스가 사용되지 않는 것입니다. 참조 programmers.stackexchange.com/questions/92186/...
마르 얀 Venema의에게

나는의 기본 구현을했다 a User Activity Logger that hooks up various events당신은 여기에서 볼 수 있습니다 : stackoverflow.com/questions/30326673/... . 즐겨!
Jeremy Thompson

답변:


30

이것은 질문에 대한 직접적인 대답이 아니며 더 많은 질문에 대한 답변입니다.

새 앱을 시작할 때 사용자가하는 모든 작업을 로그인 하는 것이 좋습니다 . 로그인, 로그 아웃, 긁힘 a * 등 모든 것. 웹 기반 인 경우 히트 맵 사용을 고려하여 마우스의 동작을 파악하십시오.

70 년대 후반 제록스 의 BravoX 프로젝트 에 있었을 때 우리는 사용자가 WYSIWYG 편집기라고하는이 이상한 것을 어떻게 사용하는지 알아 내기 위해 픽셀 단위 마우스 움직임을 기록했습니다. 점심 시간에는 사용자 세션의 재생을 볼 것입니다. 그것은이었다 매우 유익. 우리는 Charlie Browning이라는 사용 패턴을 발견했습니다. 사용자는 일부 텍스트를 선택하고 이탤릭체로 만들었습니다. 그런 다음 실행 취소합니다. 그런 다음 앞뒤로 다시 실행합니다. 그들이 감정적 인 수준에서이 내용을 이해하려고 노력한 것으로 나타났습니다. 따라서 (Greg Kusnik은 메모리가 제공되는 경우 코드를 사용하여)이 동작을 정확하게 지원하기 위해 특정 최적화를 수행했습니다.

녹음이 없었다면 우리는 이것을하지 않았다고 생각했을 것입니다.


1
이 의견만을 중심으로 책을 쓸 수 있습니다!
주교

이 특정 유형의 로깅은 모두 실시간 사용자 경험에 관한 것이 었으므로 저자는 아닙니다. 저는 하드 카피 씨였습니다. 인쇄 를 누르면 문서의 내부 표현을 가져 와서 페이지 설명 언어로 변환 한 다음 이더넷 이라는 이상한 것을 통해 홀 바로 아래에있는 세계 최초의 레이저 프린터 로 보냈습니다 . 제가 가장 많이 교류 한 그룹은 미 상원 타이포그래피 부서와 IMF의 인쇄 그룹으로 가장 까다로운 베타 테스트 사이트 2 곳입니다. 나는 그 사람들로부터 레이아웃, 글꼴 등에 대해 많은 것을 배웠습니다 . 좋은 시간.
피터 로웰

9

내가 당신이고 텍스트 파일에 쓰는 것을 고집하고 있다면 log4net을 사용 하고 특정 "UserActions.log"파일에 로그인합니다. 이렇게하면 일반 로깅을 방해하지 않습니다. log4net (또는 다른 로깅 프레임 워크)을 사용하면 휠을 다시 발명하지 말고 롤링 파일 어 펜더, 경고 / 오류 / 디버그 / 정보 코드, 배치 파일 쓰기 등을 활용할 수 있습니다. 모든 생산 수준 응용 프로그램.

그러나 실제로는이 모든 정보를 데이터베이스에 저장하는 것이 좋습니다. 데이터베이스를 사용하면 정렬, 집계 및 통계를보다 쉽게 ​​수행 할 수 있습니다.


3
케이크를 먹고 먹을 수 있습니다 : log4net 용 DatabaseAppender가 있습니다 : logging.apache.org/log4net/release/config-examples.html . 그러나 성능이 염려되면 파일에 로깅하여 별도의 서비스로 파싱하여 더 빠른보고 (보고서 데이터베이스 일 수 있음)를 위해 데이터를 준비 할 수 있습니다.
절망의 그리움

9

로그 파일은 시스템 오류 디버깅을위한 정보를 얻기 위해 사용됩니다. 2. 장난에 대한 사용자 활동을 조사하거나 3. 사람들이 시스템을 볼 수 없을 때 어떻게 시스템을 사용하는지 이해합니다. 그것을 염두에두고 :

  • 응용 프로그램 시작시 환경 (예 : 환경 변수, 기타 설정 등)을 기록합니다. 이것은 디버깅 문제에 유용합니다.
  • 각 요청에 대한 사용자 및 조치 (URL의 고유 한 부분)를 기록하십시오.
  • 비밀번호 요청을 제외한 각 요청에 대한 모든 매개 변수를 기록하십시오 . 로그의 각 매개 변수 주위에 구분 기호를 넣고 싶습니다 phone{(999)999-9999} email{aaa@aaa.com}. 비밀번호는 어디에도 쓰지 않아야합니다 한 가지 방법으로 데이터베이스를 제외한 , 각 사용자마다 고유 한 소금과 여러 라운드의 해싱을 사용하여 암호로 안전한 해시 함수입니다 (각주 참조)
  • 로그인 할 때 사용자의 IP 주소, 사용자 ID, 이름, 로그인 실패 횟수, 브라우저, 쿠키 세션 ID, 암호는 기록하지 않아야합니다.
  • 로그인 페이지에 비밀번호를 기록하지 마십시오 비밀번호 변경 페이지에 비밀번호를 기록하지 말고, 해당 기능이있는 경우 비밀 질문이나 답변을 기록해서는 안됩니다. 다른 비밀번호 나 암호화 키는 기록하지 않아야합니다. 이 매개 변수에 대해 6 개의 별과 같은 것을 로그에 작성하는 것이 좋습니다. 따라서이 데이터를 억제하는 것을 기억했음을 알 수 있습니다.
  • 각 요청을 처리하는 데 걸리는 총 시간을 기록하고 싶습니다. Done: 49ms
  • 세션 상태에 변경 사항을 기록하고 싶습니다. 이것들은 드 물어야합니다.
  • 다른 사람들이 말했듯이 파일에 로깅 할 수있는 훌륭한 로깅 라이브러리가 있지만 데이터베이스에 로깅할지는 확실하지 않습니다.
  • 로그를 안전하게 저장하십시오. 암호가 없어도 개인 식별 정보에 관한 주법, 연방법 및 국제법이 있습니다 ( Safe Harbor 참조) )에 로그 데이터를 기밀로 유지합니다.
  • 백업하십시오. 매일 밤 전체 드라이브 백업으로 이동하게하려면 새 서버로 업그레이드하기 전에 다른 위치에 백업 해 두어야합니다 (배우는 방법을 묻지 마십시오).

다른 팁

각주 : 누군가 로그인하려면 동일한 해싱 알고리즘을 사용하여 제공된 비밀번호를 해시하고 해당 사용자에 대한 원래 해시의 솔트를 사용하십시오. 제공된 비밀번호의 해시가 데이터베이스에 저장된 비밀번호 해시와 일치하면 해당 비밀번호가 로그인됩니다.이를 위해서는 비밀번호의 문자 세트를 정의하고 유니 코드 대체 문자 및 세트 외부의 다른 문자를 허용하지 않아야합니다.


2

데이터베이스를 사용하고 있는지 여부를 지정하지는 않지만 데이터베이스를 사용하고 있고 해당 데이터베이스가 SQL Server 인 경우 자동 감사 라는 것을 추가하고 데이터와의 모든 상호 작용을 자동으로 기록 할 수 있습니다 . 감사 할 객체 만 지정하십시오.

그러나 어쨌든 유지 관리의 악몽을 초래할 수 있으므로 추적을 수동으로 코딩하려고 시도하지 않습니다.

또한 로깅을 위해 직접 롤링하지 말고 Enterprise Library Logging 또는 Log4Net 등을 사용하십시오 .


2

일반적인 조언입니다. 질문과 직접 ​​관련이 없을 수 있습니다.

로그를 무엇에 사용할 것인가에 달려 있습니까? 대부분 로그는 프로덕션에서 오류를 발생시키는 작업을 감지하는 데 사용됩니다. 사용자 작업을 추적하기 위해 보관하는 경우 이는 로그의 일부가 아닙니다. 이는 제품의 서버 측 기능이어야합니다. 이러한 것들이 나중에 연구를 위해 반드시 데이터베이스에 들어가야합니다. 그러나 "일부 텍스트가 비어 있으면 오류가 발생했습니다"와 같은 서버 측 로그는 기능의 일부가 아닙니다. 이것들은 파일 시스템에 들어가야합니다. -user_id, error_number, error_text, file_name, function_name, thread_id, system_date_time 및 기타 컨텍스트와 함께 다음 내용이 있어야합니다.

이제 파일의 로그에 대해서만 이야기하고 있습니다.

1) 비동기로 유지하십시오. I / O 작업은 비용이 많이 듭니다.

2) 기능보다 클래스로 설계하십시오. 미래의 변화는 쉬울 것입니다.

3) 가능하면 싱글 톤으로 유지하십시오. 멀티 스레드에서는 싱글 톤이 어렵 기 때문에 제대로 디자인하십시오.

4) 또한 로거와 로지 간의 상호 작용을 단순하게 유지하는 것이 좋습니다. 대부분의 경우 실제 message_text보다 message_number를 보내고 로거가 숫자에서 메시지를 받도록합니다. 나중에 일반 로그 형식을 변경하려는 경우 도움이됩니다.

일반적으로 로거와 로깅해야 할 것은 디자인의 일부 여야합니다. 모든 관련 정보가 올바르게 기록되도록 디자인이 변경되는 경우를 보았습니다.


1

Log4Net을 사용해보십시오. 파일이나 데이터베이스에 로그인 할 수 있습니다. 여기 자습서 !

우리는 모든 프로젝트에서 Log4Net을 사용합니다.


0

로그 파일을 사용하면 몇 가지 문제가 있습니다. 먼저 여러 프로세스가 파일에 액세스하려고 할 때 오류가 발생할 수 있습니다. 시스템이 실행되는 동안 파일을 순환하거나 지우려고 할 때 문제가 발생할 수도 있습니다. 그 방법은 데이터베이스를 사용하는 것입니다.

따라서 1 단계는 데이터베이스 테이블을 작성하는 것입니다. 다음 필드를 제안합니다.
* userID
* 작업 (예 : 로그온, foo 삭제)
* 일부 설명 텍스트 (여기서는 null 허용)
* 타임 스탬프

2 단계, userID, 조치 및 설명 텍스트를 입력하여 스토어드 프로 시저를 작성하십시오. 현재 시간을 사용하여 타임 스탬프를 만드십시오.

3 단계, 편리한 공유 라이브러리에 로깅 메소드를 작성하여 어디서나 쉽게 포함하고 필요에 따라 해당 메소드를 호출하는 실습에 참여할 수 있습니다. 로깅 레벨 플래그 논리를 갖고 로그되는 내용을 변경할 수도 있습니다.

4 단계, 때때로 로깅 테이블에서 오래된 메시지를 지우는 유지 보수 루틴을 작성하십시오. 아마도 X보다 오래된 경우 삭제하거나 매주 또는 정기적 인 DB 유지 관리 (인덱스 재구성 등)의 일부로 실행하십시오.

일단 이것을 빌드하면 다른 프로젝트와 관련된 코드를 사용할 수 있어야합니다.

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