문제

좋아요, 시나리오는 이렇습니다.나는 수많은 레코드를 처리하고 그에 따라 데이터베이스에 정보를 입력하는 유틸리티를 가지고 있습니다.

이는 다중 스레드 배치로 이러한 레코드에 대해 작동합니다.이러한 각 배치는 각 레코드에 대한 워크플로 추적을 생성하기 위해 동일한 로그 파일에 기록됩니다.잠재적으로 우리는 하루에 백만 건에 가까운 로그 쓰기를 수행할 수 있습니다.

이 로그를 다른 서버에 있는 데이터베이스에 만들어야 합니까?고려사항:

  1. 여러 스레드가 동일한 로그 파일에 기록하는 경우의 명백한 단점은 로그 메시지가 서로 섞여 있다는 것입니다.데이터베이스에서는 배치 ID별로 그룹화할 수 있습니다.
  2. 성능 - 일괄 처리 속도가 더 느려지나요?로컬 파일에 쓰거나 동일한 네트워크에 있는 다른 서버의 데이터베이스에 로그 데이터를 보내는 것입니다.이론적으로는 로그 파일이 더 빠르지만 여기에 문제가 있습니까?

두 가지 접근 방식 모두에서 수행할 수 있는 최적화가 있습니까?

감사해요.

도움이 되었습니까?

해결책

여기서 다른 답변은 데이터로 수행하는 작업에 따라 다릅니다 .

여기에는 두 가지 시나리오가 있습니다.

  1. 우리가 구축 한 제품의 관리자는 모든 종소리와 함께 멋진 작은 앱에서 볼 수 있어야하므로 대부분의 로깅은 DB에 있습니다.

  2. 모든 진단 및 디버그 정보를 파일에 기록합니다.우리는 TBH를 정말로 "고맙게 생각"할 필요가 없으며 자주 필요하지도 않기 때문에 대부분의 경우 로그하고 보관합니다.

    사용자가 어떤 일을하고 있다면 DB에 로그인하면 파일로 충분할 것입니다.

다른 팁

흥미로운 질문은 데이터베이스에 로깅하기로 결정해야합니다. 데이터베이스 연결 오류를 어디에 기록합니까?

데이터베이스에 로깅하는 경우 통신 오류가 발생할 경우를 대비하여 항상 보조 로그 위치 (파일, 이벤트 로그 등)가 있습니다.나중에 문제를 쉽게 진단 할 수 있습니다.

한 가지 생각 나는 것은 각 스레드가 자체 로그 파일에 기록한 다음이를 결합하기 위해 매일 일괄 실행을 수행 할 수 있다는 것입니다.

데이터베이스에 로깅하는 경우 특히 DB가 네트워크를 통해있을 경우 일부 조정 및 최적화를 수행해야합니다.최소한 DB 연결을 재사용해야합니다.

또한 로그인 데이터베이스가 필요합니까?"grep"만 있으면 데이터베이스에 로그인해도 많은 것을 얻을 수 없다고 생각합니다.

도움이 되는지 확실하지 않지만 다음과 같은 유틸리티도 있습니다. 마이크로소프트 로그 파서 텍스트 기반 로그 파일을 구문 분석하고 데이터베이스인 것처럼 사용할 수 있는 것으로 추정됩니다.웹사이트에서:

Log Parser는 로그 파일, XML 파일 및 CSV 파일과 같은 텍스트 기반 데이터에 대한 범용 쿼리 액세스 및 이벤트 로그, 레지스트리와 같은 Windows® 운영 체제의 주요 데이터 소스에 대한 범용 쿼리 액세스를 제공하는 강력하고 다양한 도구입니다. 파일 시스템 및 Active Directory®.로그 파서에게 필요한 정보와 원하는 정보를 알려줍니다.쿼리 결과는 텍스트 기반 출력으로 사용자 정의 형식으로 구성되거나 SQL, Syslog 또는 차트와 같은보다 전문적인 대상으로 지속될 수 있습니다.대부분의 소프트웨어는 제한된 수의 특정 작업을 수행하도록 설계되었습니다.로그 파서는 다릅니다 ...사용될 수있는 방법의 수는 사용자의 요구와 상상력에 의해서만 제한됩니다.세계는 로그 파서가있는 데이터베이스입니다.

저는 이 프로그램을 직접 사용해본 적은 없지만 꽤 흥미로운 것 같습니다!

아니면 대기열에 로깅하는 것은 어떻습니까?이렇게하면 다른 항목에 로그인 할 때마다 폴러를 전환 할 수 있습니다.롤오버 및 로그 파일 보관과 같은 작업을 매우 쉽게 만듭니다.예를 들어 다음과 같이 다른 항목에 기록하는 폴러를 추가 할 수 있기 때문에 좋습니다.

  • 오류 메시지를 찾아 FogBugz 계정에 게시하는 폴러
  • '해킹 시도'파일에 대한 액세스 위반 ( 'x가 /foo/y/bar.html 액세스 시도')을 찾는 폴러

데이터베이스-여러 스레드를 언급했기 때문입니다.동기화 및 필터링 된 검색이 제 답변에 대한 이유입니다.
파일로 전환하기 전에 성능 문제가 있는지 확인하십시오.
"Knuth : 조기 최적화는 모든 악의 근원입니다"저는 그 책에서 더 이상 이해하지 못했습니다 ... :)

There are ways you can work around the limitations of file logging.

You can always start each log entry with a thread id of some kind, and grep out the individual thread ids. Or a different log file for each thread.

I've logged to database in the past, in a separate thread at a lower priority. I must say, queryability is very valuable when you're trying to figure out what went wrong.

How about logging to database-file, say a SQLite database? I think it can handle multi-threaded writes - although that may also have its own performance overheads.

I think it depends greatly on what you are doing with the log files afterwards.

Of the two operations writing to the log file will be faster - especially as you are suggesting writing to a database on another server.

However if you are then trying to process and search the log files on a regular basis then the best place to do this would be a database.

If you use a logging framework like log4net they often provide simple config file based ways of redirecting input to file or database.

I like Gaius' answer. Put all the log statements in a threadsafe queue and then process them from there. For DB you could batch them up, say 100 log statements in one batch and for file you could just stream them into the file as they come into the queue.

File or Db? As many others say; it depends on what you need the log file for.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top