programing

SQL 데이터베이스 또는 파일에 로그를 저장하는 것이 더 효율적입니까?

lovejava 2023. 8. 27. 08:49

SQL 데이터베이스 또는 파일에 로그를 저장하는 것이 더 효율적입니까?

나는 cron에 의해 꽤 자주 로딩되는 스크립트가 거의 없습니다.지금은 로그를 저장하지 않으므로 스크립트를 로드하지 못하면 결과를 볼 때까지 결과를 알 수 없습니다. 결과가 올바르지 않은 경우에도 실패한 스크립트를 모르기 때문에 아무것도 할 수 없습니다.

로그를 저장하기로 했는데 어떻게 해야 할지 아직 잘 모르겠어요.그래서 제 질문은 로그를 SQL 데이터베이스나 파일에 저장하는 것이 더 효율적인가 하는 것입니다.

mysql 데이터베이스에 'logs' 테이블을 만들고 각 로그를 별도의 행에 저장하거나, php의 file_put_contents 또는 fopen/fwrite를 사용하여 로그를 별도의 파일에 저장할 수 있습니다.

스크립트는 작업하는 동안 분당 약 5개의 로그(총)를 추가합니다.fopen/fwrite 또는 mysql의 insert 중 무엇이 더 빠른지 확인하기 위해 몇 가지 테스트를 수행했습니다.저는 "삽입" 문을 3000번 반복하여 3000행을 만들고 fopen/fwrite를 3000번 반복하여 샘플 텍스트로 3000개의 파일을 만들었습니다.Fwrite는 sql의 insert보다 4-5배 더 빠르게 실행되었습니다.저는 두 번째 루프를 만들었습니다. - '선택' 문을 루프하고 문자열에 3000번 할당했습니다. - 또한 'fopen'을 사용하여 3000개의 파일을 열고 결과를 문자열에 할당했습니다.결과는 동일했습니다. fopen/fwrite 작업이 4-5배 더 빨리 완료되었습니다.

그렇다면 경험이 풍부한 프로그래머들에게 로그 저장에 대한 경험은 무엇입니까?조언이 있습니까?

4.09.2011 EDIT - 답변해주신 모든 분들께 감사드리며, 많은 도움이 되었습니다.각각의 게시물은 가치가 있어서 하나의 답변만 받아들이기가 꽤 어려웠습니다 ;-)

파일을 사용하는 로그가 더 효율적이지만 데이터베이스에 저장된 로그는 원격으로도 읽기가 더 쉽습니다(예: 필요한 경우 웹 프런트 엔드를 작성할 수 있음).

그러나 데이터베이스에 행을 연결하고 삽입하는 것은 오류가 발생하기 쉽습니다(데이터베이스 서버 중단, 암호 오류, 리소스 부족). 데이터베이스를 사용하기로 결정한 경우 이러한 오류를 어디에 기록하시겠습니까?

Zend_Log와 같은 구성 요소를 사용하여 동일한 로그 인스턴스에 연결된 작성기의 개념을 기본적으로 지원할 수 있습니다.이렇게 하면 로깅 코드를 변경할 필요 없이 동일한 메시지를 하나 이상의 다른 위치에 기록할 수 있습니다.또한 언제든지 코드를 변경하여 로그 시스템을 바꾸거나 간단한 방법으로 새 로그 시스템을 추가할 수 있습니다.

당신의 질문에 대해, 저는 당신(개발자)만이 로그 메시지를 읽어야 한다면 파일에 대한 로그가 더 간단하고 더 적절하다고 생각합니다.

웹 인터페이스에서 다른 사용자가 로그를 읽어야 하거나 로그를 검색하는 기능이 필요한 경우 대신 db에 로그를 기록합니다.다른 사람이 동시성 문제도 지적했듯이 사용자가 많으면 db에 로그온하는 것이 더 잘 확장될 수 있습니다.

마지막으로 분당 5개 메시지의 로그 빈도는 애플리케이션의 CPU를 거의 필요로 하지 않으므로 성능에 대해 걱정할 필요가 없습니다.이 경우 로그 파일로 시작한 다음 요구 사항이 변경되면 변경(또는 작성자를 추가)합니다.

결과에 대한 의견을 제시합니다.

파일 작성에 관해서는 아마 당신이 옳을 것입니다.
판독에 관해서는 당신이 완전히 틀렸습니다.

데이터베이스에 쓰기:

  1. MyISAM이 삽입물에서 전체 테이블을 잠그고 잠금 경합을 일으킵니다.행 잠금 기능이 있는 InnoDB를 사용합니다.
  2. 1과 반대로.로그에서 전체 텍스트 검색을 수행하려는 경우.MyISAM을 사용하면 전체 텍스트 색인을 지원합니다.
  3. 만약 당신이 정말로 빠르기를 원한다면 당신은 사용할 수 있습니다.memoryRAM에 테이블을 기록합니다.CPU 로드가 낮을 때 데이터를 디스크 기반 테이블로 전송합니다.

데이터베이스에서 읽는 중

이것이 바로 데이터베이스가 진정으로 빛을 발하는 부분입니다.
다양한 항목의 모든 종류의 정보를 플랫 파일보다 훨씬 빠르고 쉽게 결합할 수 있습니다.

SELECT logdate, username, action FROM log WHERE userid = '1' /*root*/ AND error = 10;

에 가 있는 where조항 결과가 거의 즉시 반환됩니다. 플랫 파일에서 그렇게 해 보십시오.

SELECT username, count(*) as error_count 
FROM log 
WHERE error <> 0 
GROUP BY user_id WITH ROLLUP

테이블이 표준화되지 않았다는 사실은 신경쓰지 마십시오. 플랫 파일을 사용하면 훨씬 더 느리고 더 어렵습니다.
그건 정말로 머리가 좋지 않습니다.

속도가 전부는 아닙니다.예, 파일에 쓰는 것이 빠르지만 데이터베이스에 있는 경우 로그에서 필요한 내용을 찾는 것이 훨씬 빠릅니다.몇 년 전에 저는 CMS를 파일 기반 로그에서 Mysql 테이블로 변환했습니다.테이블이 더 좋습니다.

로그 크기와 동시성 수준에 따라 다릅니다.최신 버전 때문에 테스트가 완전히 무효화되었습니다. 사이트에 100명의 사용자가 있고 동일한 파일에 10개의 스레드를 쓴다고 가정하면 fwrite는 그렇게 빠르지 않을 것입니다.RDBMS가 제공하는 것 중 하나는 동시성 제어입니다.

이 값은 수행하려는 요구 사항과 로트 유형의 분석에 따라 달라집니다.기록을 읽는 것만으로도 쉽지만, 정의된 기간 동안 일부 데이터를 집계하는 것은 어떻습니까?

대규모 웹 사이트에서는 Scribe와 같은 시스템을 사용하여 로그를 작성합니다.

하지만 분당 5개의 레코드를 말하는 것이라면, 이것은 정말 낮은 부하이기 때문에, 주요 질문은 당신이 그것들을 어떻게 읽을 것인가입니다.파일이 필요에 적합한 경우 해당 파일로 이동합니다.일반적으로 추가 전용 쓰기(로그의 경우 일반적)는 매우 빠릅니다.

로그를 데이터베이스에 저장하는 것은 좋은 생각이 아니라고 생각합니다.파일을 통해 로그를 데이터베이스에 저장하는 장점은 SQL을 사용하여 로그를 훨씬 쉽게 분석할 수 있다는 것입니다. 그러나 데이터베이스 유지 관리에 훨씬 더 많은 시간을 투자해야 한다는 것입니다.로그를 저장하도록 별도의 데이터베이스 서버를 설정하는 것이 좋습니다. 그렇지 않으면 로그가 너무 많을 수 있습니다.INSERT따라서 운영 환경에서 데이터베이스 성능이 저하될 뿐만 아니라 파일(로그로테이션 등)에 비해 데이터베이스에 로그를 보관하는 것이 쉽지 않습니다.

요즘에는 로그를 처리하는 데 특별한 기능이 풍부한 로깅 시스템을 사용해야 합니다. 예를 들어 logstash(http://logstash.net/) 에는 로그 수집기, 필터가 있으며 로그를 시각화하고 분석할 수 있는 아름다운 프런트 엔드와 함께 탄력적인 검색과 같은 외부 시스템에 로그를 저장할 수 있습니다.

참조:

파일 시스템을 작성하는 것이 항상 더 빨라야 합니다.

그러나 그것은 당신의 관심사가 되어야 합니다.간단한 삽입 작업과 파일 시스템에 쓰기 작업 모두 빠른 작업입니다.여러분이 걱정해야 할 것은 데이터베이스가 다운될 때 발생하는 일입니다.저는 개인적으로 두 가지 모두에게 편지를 쓰는 것을 좋아하기 때문에 문제가 생기면 항상 로그가 있지만 데이터베이스에서 쉽게 검색할 수 있습니다.

오류 기록은 데이터베이스에 문제가 있는 경우에도 기록할 수 있기 때문에 파일로 제한하는 것이 가장 좋습니다.오류 기록에 데이터베이스 연결이 필요한 경우에는 이 옵션을 사용할 수 없습니다!

그러나 일반적인 로깅은 데이터베이스 내에 남겨두지만 감사 내역 등에 대해 많은 로깅을 수행하는 경우에만 적용됩니다.

개인적으로 로그 파일을 선호하기 때문에 두 가지 기능을 만들었습니다.

<?php
function logMessage($message=null, $filename=null)
{
    if (!is_null($filename))
    {
        $logMsg=date('Y/m/d H:i:s').": $message\n";
        error_log($logMsg, 3, $filename);
    }
}

function logError($message=null, $filename=null)
{
    if (!is_null($message))
    {
        logMessage("***ERROR*** {$message}", $filename);
    }
}
?>

저는 상수 또는 두 개를 정의하고(나는 ACTIVE_LOG와 ERROR_LOG를 모두 동일한 파일로 설정하여 실행 중인 전체를 보기 위해 두 개의 파일을 나란히 참조할 필요가 없도록 함) 적절한 호출을 합니다.또한 전용 폴더(/var/log/phplogs)를 생성했으며 작성하는 각 응용 프로그램에는 고유한 로그 파일이 있습니다.마지막으로 로그를 순환하여 고객에게 다시 참조할 수 있는 기록을 확보합니다.

위의 기능을 자유롭게 사용한다는 것은 앱의 실행을 꽤 쉽게 추적할 수 있다는 것을 의미합니다.

언급URL : https://stackoverflow.com/questions/7257242/whats-more-efficient-storing-logs-in-sql-database-or-files