53.2. 서버 내보고 토토 베이

서버 코드 내에서 생성 된 토토 베이, 경고 및 로그 메시지를 사용하여 생성해야합니다.Ereport또는 그 오래된 사촌elog. 이 기능의 사용은 설명을 요구할 정도로 복잡합니다.

모든 메시지에 필요한 요소는 두 가지 있습니다 : 심각도 수준 (범위디버그topanic) 및 기본 메시지 텍스트. 또한 옵션 요소가 있으며, 그 중 가장 일반적인 요소는 SQL Spec의 SQLState 규칙을 따르는 토토 베이 식별자 코드입니다.Ereport자체는 메시지 생성을 C 소스 코드의 단일 함수 호출처럼 보이게하는 구문 편의를 위해 주로 존재하는 쉘 매크로입니다. 에 의해 직접 허용되는 유일한 매개 변수Ereport는 심각도 수준입니다. 기본 메시지 텍스트와 옵션 메시지 요소는와 같은 보조 함수를 호출하여 생성됩니다.errmsg, 내에서Ereport전화.

전형적인 호출Ereport다음과 같이 보일 수 있습니다 :

Ereport (토토 베이,
        errcode (errcode_division_by_zero),
        errmsg ( "division by zero");

이것은 토토 베이 심각도 레벨을 지정합니다토토 베이(실행 토토 베이). 그만큼errcode통화에 정의 된 매크로를 사용하여 SQLSTATE 토토 베이 코드를 지정합니다src/include/utils/errcodes.h. 그만큼errmsgCall은 기본 메시지 텍스트를 제공합니다.

보조 기능 호출을 둘러싼 여분의 괄호 세트와 함께이 오래된 스타일을 자주 볼 수 있습니다.

Ereport (토토 베이,
        (errcode (errcode_division_by_zero),
         errmsg ( "division by zero"));

추가 괄호는 전에 필요했습니다PostgreSQL버전 12이지만 이제 선택 사항입니다.

여기 더 복잡한 예가 있습니다 :

Ereport (토토 베이,
        errcode (errcode_ambiguous_function),
        errmsg ( "function %s는 고유하지 않습니다",
               func_signature_string (funcname, nargs,
                                     nil, real_arg_types)),
        errhint ( "최고의 후보 기능을 선택할 수 없습니다."
                "명시적인 타입 캐스트를 추가해야 할 수도 있습니다.");

이것은 런타임 값을 메시지 텍스트에 포함시키기 위해 형식 코드를 사용하는 것을 보여줍니다. 또한 선택 사항힌트메시지가 제공됩니다. 보조 기능 호출은 어떤 순서로든 작성할 수 있지만 일반적으로errcodeanderrmsg먼저 나타납니다.

심각도 레벨이토토 베이이상,Ereport현재 쿼리의 실행을 중단하고 발신자에게 반환하지 않습니다. 심각도 수준이보다 낮 으면토토 베이, EREPORT정상적으로 반환합니다.

사용 가능한 보조 루틴Ereportare :

  • errcode (sqlerrcode)조건에 대한 sqlstate 토토 베이 식별자 코드를 지정합니다. 이 루틴이 호출되지 않으면 토토 베이 식별자가 기본값으로errcode_internal_error토토 베이 심각도 레벨이있는 ​​경우토토 베이이상,errcode_warning토토 베이 레벨이있는 ​​경우경고, 그렇지 않으면 (for통지아래)errcode_successful_completion. 이러한 기본값은 종종 편리하지만 항상 생략하기 전에 적절한 지 생각하십시오.errcode ()전화.

  • errmsg (const char *msg, ...)기본 토토 베이 메시지 텍스트를 지정하고 실행 시간 값을 삽입 할 수 있습니다. 삽입은에 의해 지정됩니다.Sprintf-스타일 형식 코드. 에 의해 허용되는 표준 형식 코드 외에Sprintf, 형식 코드%m|strerror현재 값의 경우errno. [14] %m매개 변수 목록에 해당 항목이 필요하지 않습니다.errmsg. 메시지 문자열이 실행됩니다getText형식 코드가 처리되기 전에 가능한 현지화.

  • errmsg_internal (const char *msg, ...)|errmsg, 메시지 문자열이 국제화 메시지 사전에 번역되거나 포함되지 않는 것을 제외하고. 이것은에 사용되어야합니다.일어날 수 없습니다아마도 번역 노력을 소비 할 가치가없는 경우.

  • errmsg_plural (const char *fmt_singular, const char *fmt_plural, unsigned long n, ...)errmsg, 그러나 다양한 복수 형태의 메시지를 지원합니다.fmt_singular영어 단수 형식입니다.fmt_plural영어 복수 형식,n필요한 복수 양식을 결정하는 정수 값이며 나머지 인수는 선택한 형식 문자열에 따라 형식화됩니다. 자세한 내용은 참조섹션 54.2.2.

  • errdetail (const char *msg, ...)선택 사항을 제공세부 사항메시지; 이것은 기본 메시지에 부적절한 것으로 보이는 추가 정보가있을 때 사용됩니다. 메시지 문자열은와 같은 방식으로 처리됩니다.errmsg.

  • errdetail_internal (const char *msg, ...)|errdetail, 메시지 문자열이 국제화 메시지 사전에 번역되거나 포함되지 않는다는 점을 제외하고. 예를 들어 대부분의 사용자에게 유용하기에는 너무 기술적이기 때문에 번역 노력을 소비 할 가치가없는 세부 메시지에 사용해야합니다.

  • errdetail_plural (const char *fmt_singular, const char *fmt_plural, unsigned long n, ...)같아errdetail, 그러나 다양한 복수 형태의 메시지를 지원합니다. 자세한 내용은 참조섹션 54.2.2.

  • errdetail_log (const char *msg, ...)|errdetail이 문자열은 서버 로그에만 이동하지 않는 경우를 제외하고는 클라이언트에 절대 없습니다. 둘 다errdetail(또는 위에 해당하는 것 중 하나) 및errdetail_log사용됩니다. 그러면 하나의 문자열은 클라이언트에게, 다른 문자열은 로그로 이동합니다. 이것은 너무 보안에 민감하거나 너무 부피가 큰 토토 베이 세부 정보에 유용합니다.

  • errdetail_log_plural (const char *fmt_singular, const char *fmt_plural, unsigned long n, ...)같아errdetail_log, 그러나 다양한 복수 형태의 메시지를 지원합니다. 자세한 내용은 참조섹션 54.2.2.

  • errhint (const char *msg, ...)선택 사항을 제공힌트메시지; 이것은 무엇이 잘못되었는지에 대한 사실적인 세부 사항과 달리 문제를 해결하는 방법에 대한 제안을 제공 할 때 사용됩니다. 메시지 문자열은와 같은 방식으로 처리됩니다.errmsg.

  • errcontext (const char *msg, ...)일반적으로 직접 호출되지 않습니다Ereport메시지 사이트; 오히려 그것은에서 사용됩니다.ERROR_CONTEXT_STACK콜백 함수 PL 함수의 현재 위치와 같은 토토 베이가 발생한 컨텍스트에 대한 정보를 제공합니다. 메시지 문자열은와 같은 방식으로 처리됩니다.errmsg. 다른 보조 함수와 달리, 이것은 당시 두 번 이상 호출 될 수 있습니다EREPORT전화; 이렇게 제공되는 연속적인 줄은 신형 분리와 관련이 있습니다.

  • 토토 베이 (int cursorpos)쿼리 문자열 내에서 토토 베이의 텍스트 위치를 지정합니다. 현재 쿼리 처리의 어휘 및 구문 분석 단계에서 감지 된 토토 베이에만 유용합니다.

  • errtable (관계 rel)토토 베이 보고서에 이름과 스키마 이름이 보조 필드로 포함되어야하는 관계를 지정합니다.

  • errtablecol (관계 rel, int attnum)토토 베이 보고서에 이름, 테이블 이름 및 스키마 이름이 보조 필드로 포함되어야하는 열을 지정합니다.

  • errtableconstraint (관계 rel, const char *conname)토토 베이 보고서에 이름, 테이블 이름 및 스키마 이름이 보조 필드로 포함되어야하는 테이블 제한 조건을 지정합니다. 인덱스는 관련이 있는지 여부에 관계 없이이 목적에 대한 제약으로 간주되어야합니다pg_constraint입장. 색인 자체가 아닌 기본 힙 관계를 통과하도록주의하십시오.Rel.

  • errdatatype (OID DataTypeoid)토토 베이 보고서에서 이름과 스키마 이름이 보조 필드로 포함되어야하는 데이터 유형을 지정합니다.

  • errdomainconstraint (OID DataTypeoid, const char *conname)토토 베이 보고서에 이름, 도메인 이름 및 스키마 이름이 보조 필드로 포함되어야하는 도메인 제한 조건을 지정합니다.

  • errcode_for_file_access ()는 파일 액세스 관련 시스템 호출의 고장에 대한 적절한 SQLState 토토 베이 식별자를 선택하는 편의 기능입니다. 저장된 것을 사용합니다errno생성 할 토토 베이 코드를 결정합니다. 일반적으로 이것은와 함께 사용해야합니다.%m기본 토토 베이 메시지 텍스트에서

  • errcode_for_socket_access ()소켓 관련 시스템 호출에서 실패에 대한 적절한 sqlstate 토토 베이 식별자를 선택하는 편의 기능입니다.

  • errhidestmt (bool hide_stmt)를 지정하기 위해 호출 될 수 있습니다진술 :우체국 마스터 로그의 메시지 부분. 일반적으로 이것은 메시지 텍스트에 이미 현재 진술이 포함 된 경우 적절합니다.

  • errhidecontext (bool hide_ctx)를 지정하기 위해 호출 될 수 있습니다컨텍스트 :우체국 마스터 로그의 메시지 부분. 이것은 컨텍스트의 반복적 인 포함이 로그를 너무 많이 부풀릴 수있는 장점 디버깅 메시지에만 사용해야합니다.

note

최대 함수 중 하나errtable, errtablecol, errtableconstraint, errdatatype또는errdomainconstraint에서 사용해야합니다Ereport전화. 이러한 기능은 응용 프로그램이 잠재적으로 국소화 된 토토 베이 메시지 텍스트를 검사하지 않고 토토 베이 조건과 관련된 데이터베이스 객체의 이름을 추출 할 수 있도록 존재합니다. 이러한 기능은 응용 프로그램에 자동 토토 베이 처리를 원할 가능성이있는 토토 베이 보고서에 사용해야합니다. 기준postgresql9.3, SQLSTATE 클래스 23 (무결성 제약 조건 위반)의 토토 베이에 대해서만 완전한 적용 범위가 존재하지만 향후 확장 될 가능성이 높습니다..

오래된 기능이 있습니다elog여전히 많이 사용됩니다.elog전화 :

elog (레벨, "형식 문자열", ...);

와 정확히 동일합니다.

Ereport (레벨, errmsg_internal ( "format string", ...));

SQLSTATE 토토 베이 코드가 항상 기본값으로 표시되며 메시지 문자열은 번역이 적용되지 않습니다. 그러므로,elog내부 토토 베이 및 저수준 디버그 로깅에만 사용해야합니다. 일반 사용자에게 관심이있는 모든 메시지는Ereport. 그럼에도 불구하고 충분한 내부가 있습니다일어날 수 없음시스템의 토토 베이 확인elog여전히 널리 사용됩니다. 표기법 단순성에 대한 메시지가 선호됩니다.

좋은 토토 베이 메시지 작성에 대한 조언PostgreSQL : 문서 : 13 : 53.3. 오류 토토 커뮤니티 스타일 가이드.



[14]EREPORT전화에 도달했습니다. 의 변화errno보조보고 루틴 내에서는 영향을 미치지 않습니다. 글을 쓰면 사실이 아닐 것입니다strerror (errno)명시 적으로errmsg의 매개 변수 목록; 따라서 그렇게하지 마십시오.

수정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면