<QtLogging> - Qt Logging Types
<QtLogging> 헤더 파일은 Qt 로깅 유형, 함수 및 매크로를 정의합니다. 더 보기...
| Header: | #include <QtLogging> |
형식
| QtMessageHandler | |
| enum | QtMsgType { QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, QtFatalMsg } |
기능
| QString | qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str) |
| QtMessageHandler | qInstallMessageHandler(QtMessageHandler handler) |
| void | qSetMessagePattern(const QString &pattern) |
매크로
| qCritical(const char *format, ...) | |
| qDebug(const char *format, ...) | |
| qFatal(const char *format, ...) | |
| qInfo(const char *format, ...) | |
| qWarning(const char *format, ...) |
상세 설명
<QtLogging> 헤더 파일에는 로깅을 위한 여러 유형, 함수 및 매크로가 포함되어 있습니다.
QtMsgType 열거형은 생성되어 Qt 메시지 핸들러로 전송될 수 있는 다양한 메시지를 식별하며, QtMessageHandler 는 시그니처가 void myMessageHandler(QtMsgType, const QMessageLogContext &, const char *) 인 함수 포인터에 대한 유형 정의입니다. qInstallMessageHandler() 함수는 주어진 QtMessageHandler 를 설치하는 데 사용할 수 있습니다. QMessageLogContext 클래스는 메시지가 기록된 줄, 파일 및 함수를 포함합니다. 이 정보는 QMessageLogger 클래스에 의해 생성됩니다.
<QtLogging>에는 주어진 문자열 인자로 메시지를 생성하는 함수들도 포함되어 있습니다: qDebug(), qInfo(), qWarning(), qCritical(), qFatal(). 이 함수들은 주어진 메시지와 함께 메시지 핸들러를 호출합니다.
예시:
if (!driver()->isOpen()|| driver()->isOpenError()) {
qWarning("QSqlQuery::exec: database not open");
return false;
}QLoggingCategory도 참조하십시오 .
유형 설명서
QtMessageHandler
다음과 같은 시그니처를 가진 함수 포인터에 대한 typedef입니다:
void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);QtMsgType 및 qInstallMessageHandler()도 참조하십시오 .
enum QtMsgType
이 열거형은 메시지 핸들러(QtMessageHandler)로 전송될 수 있는 메시지를 설명합니다. 이 열거형을 사용하여 다양한 메시지 유형을 식별하고 적절한 조치와 연결할 수 있습니다. 이 열거형의 값은 심각도 순서대로 다음과 같습니다:
| 상수 | 값 | 설명 |
|---|---|---|
QtDebugMsg | 0 | qDebug() 함수에 의해 생성된 메시지입니다. |
QtInfoMsg | 4 | qInfo() 함수에 의해 생성된 메시지입니다. |
QtWarningMsg | 1 | qWarning() 함수에 의해 생성된 메시지입니다. |
QtCriticalMsg | 2 | qCritical() 함수에 의해 생성된 메시지입니다. |
QtFatalMsg | 3 | qFatal() 함수에 의해 생성된 메시지입니다. |
QtMessageHandler, qInstallMessageHandler() 및 QLoggingCategory도 참조하십시오 .
함수 설명서
QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str)
type, context, str 인자를 사용하여 서식이 지정된 문자열을 생성합니다.
qFormatLogMessage는 현재 메시지 패턴에 따라 서식이 지정된 QString 를 반환합니다. 이 함수는 사용자 정의 메시지 핸들러에서 Qt의 기본 메시지 핸들러와 유사한 방식으로 출력을 서식화하는 데 사용할 수 있습니다.
이 함수는 스레드 안전합니다.
qInstallMessageHandler() 및 qSetMessagePattern()도 참조하십시오 .
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
Qt 메시지 핸들러 handler 를 설치합니다. 이전에 설치된 메시지 핸들러에 대한 포인터를 반환합니다.
메시지 핸들러는 Qt의 로깅 인프라에서 출력되는 디버그, 정보, 경고, 중요 및 치명적 메시지를 출력하는 함수입니다. 기본적으로 Qt는 운영 체제 및 Qt 구성에 따라 메시지의 형식을 지정하고 다양한 싱크에 메시지를 출력하는 표준 메시지 핸들러를 사용합니다. 사용자 정의 메시지 핸들러를 설치하면 모든 제어권을 갖게 되며, 예를 들어 메시지를 파일 시스템에 기록할 수 있습니다.
Qt는 관련 메시지를 의미론적 범주로 그룹화하기 위해 logging categories 를 지원합니다. 이를 사용하여 범주별로 로깅을 활성화하거나 비활성화할 수 있으며, message type 도 사용할 수 있습니다. 로깅 범주에 대한 필터링은 메시지가 생성되기 전에도 수행되므로, 비활성화된 유형 및 범주에 해당하는 메시지는 메시지 핸들러에 도달하지 않습니다.
메시지 핸들러는 reentrant 여야 합니다. 즉, 서로 다른 스레드에서 병렬로 호출될 수 있습니다. 따라서 공통 싱크(데이터베이스나 파일 등)에 대한 쓰기 작업은 종종 동기화되어야 합니다.
Qt에서는 ` qSetMessagePattern()`를 호출하거나 ` QT_MESSAGE_PATTERN ` 환경 변수를 설정하여 로깅 메시지에 추가 메타정보를 포함시킬 수 있습니다. 이러한 서식을 유지하기 위해 사용자 정의 메시지 핸들러는 ` qFormatLogMessage()`를 사용할 수 있습니다.
비용이 많이 드는 작업은 애플리케이션을 차단할 수 있으므로, 메시지 핸들러 내의 코드는 최소한으로 유지하도록 하십시오. 또한 재귀를 방지하기 위해, 메시지 핸들러 내에서 생성된 로깅 메시지는 무시됩니다.
메시지 핸들러는 항상 반환해야 합니다. fatal messages 의 경우, 애플리케이션은 해당 메시지를 처리한 직후 즉시 종료됩니다.
애플리케이션 전체에 대해 한 번에 하나의 메시지 핸들러만 설치할 수 있습니다. 이전에 사용자 정의 메시지 핸들러가 설치되어 있었다면, 이 함수는 해당 핸들러에 대한 포인터를 반환합니다. 이 핸들러는 나중에 이 메서드를 다시 호출하여 재설치할 수 있습니다. 또한, ` qInstallMessageHandler(nullptr) `를 호출하면 기본 메시지 핸들러가 복원됩니다.
다음은 기본 핸들러를 호출하기 전에 로컬 파일에 로그를 기록하는 메시지 핸들러의 예입니다:
#include <QApplication>
#include <stdio.h>
#include <stdlib.h>
QtMessageHandler originalHandler = nullptr;
void logToFile(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString message = qFormatLogMessage(type, context, msg);
static FILE *f = fopen("log.txt", "a");
fprintf(f, "%s\n", qPrintable(message));
fflush(f);
if (originalHandler)
originalHandler(type, context, msg);
}
int main(int argc, char **argv)
{
originalHandler = qInstallMessageHandler(logToFile);
QApplication app(argc, argv);
// ...
return app.exec();
}C++ 표준은 ` static FILE *f `가 스레드 안전하게 초기화되도록 보장합니다. 또한 ` fprintf() `와 ` fflush() `도 스레드 안전할 것으로 예상되므로, 추가적인 동기화는 필요하지 않습니다.
QtMessageHandler, QtMsgType, qDebug(), qInfo(), qWarning(), qCritical(), qFatal(), ‘디버깅 기법’ 및 qFormatLogMessage()도 참조하십시오 .
void qSetMessagePattern(const QString &pattern)
기본 메시지 핸들러의 출력을 변경합니다.
qDebug(), qInfo(), qWarning(), qCritical() 및 qFatal()의 출력 내용을 조정할 수 있습니다. 또한 qCDebug(), qCInfo(), qCWarning() 및 qCCritical()의 범주 로깅 출력도 형식이 지정됩니다.
다음과 같은 자리 표시자가 지원됩니다:
| 자리 표시자 | 설명 |
|---|---|
%{appname} | QCoreApplication::applicationName() |
%{category} | 로깅 범주 |
%{file} | 소스 파일 경로 |
%{function} | 함수 |
%{line} | 소스 파일의 줄 번호 |
%{message} | 실제 메시지 |
%{pid} | QCoreApplication::applicationPid() |
%{threadid} | 현재 스레드의 시스템 전체 ID (획득 가능한 경우) |
%{threadname} | 현재 스레드 이름 (획득 가능한 경우, 또는 Qt 6.10부터는 스레드 ID) |
%{qthreadptr} | 현재 QThread 에 대한 포인터 ( QThread::currentThread()의 결과) |
%{type} | "debug", "warning", "critical" 또는 "fatal" |
%{time process} | 메시지가 발생한 시간(프로세스 시작 이후 경과된 시간, 단위: 초)("process" 토큰은 리터럴임) |
%{time boot} | 메시지 발생 시점(시스템 부팅 이후 경과 시간, 초 단위). 이 값을 확인할 수 있는 경우에만 적용되며(토큰 "boot"는 리터럴임). 부팅 이후 경과 시간을 확인할 수 없는 경우, 출력 결과는 불확정입니다( QElapsedTimer::msecsSinceReference() 참조). |
%{time [format]} | 메시지가 발생한 시점의 시스템 시간으로, format 를 QDateTime::toString()에 전달하여 포맷팅한 값입니다. 포맷이 지정되지 않은 경우, Qt::ISODate 의 포맷이 사용됩니다. |
%{backtrace [depth=N] [separator="..."]} | 선택적 매개변수 depth 로 지정된 프레임 수(기본값은 5)를 포함하고, 선택적 매개변수 separator (기본값은 "|")로 구분된 백트레이스입니다. Qt 6.12부터 depth 의 최대값은 16384 프레임으로 제한됩니다.이 확장 기능은 일부 플랫폼에서만 사용할 수 있습니다:
플랫폼에 따라 이 확장이 출력하는 함수 이름에는 몇 가지 제한 사항이 있습니다. 일부 플랫폼에서는 내보낸 함수의 이름만 알 수 있습니다. 애플리케이션에 포함된 모든 함수의 이름을 확인하려면, 애플리케이션이 백트레이스를 읽을 때는 인라인화나 테일 콜 최적화로 인해 프레임이 누락될 수 있다는 점을 유의하십시오. |
또한 %{if-debug}, %{if-info}, %{if-warning}, %{if-critical} 또는 %{if-fatal} 뒤에 %{endif} 를 붙여 메시지 유형에 대한 조건문을 사용할 수 있습니다. %{if-*} 및 %{endif} 내부의 내용은 유형이 일치하는 경우에만 출력됩니다.
마지막으로, %{if-category}... %{endif} 내의 텍스트는 카테고리가 기본 카테고리가 아닐 경우에만 출력됩니다.
예시:
QT_MESSAGE_PATTERN="[%{time yyyyMMdd h:mm:ss.zzz ttt} %{if-debug}D%{endif}%{if-info}I%{endif}%{if-warning}W%{endif}%{if-critical}C%{endif}%{if-fatal}F%{endif}] %{file}:%{line} - %{message}"기본 pattern 는 %{if-category}%{category}: %{endif}%{message} 입니다.
참고: Android에서는 Android logcat에 로깅 범주를 위한 전용 필드가 있으므로 범주가 태그로 사용되기 때문에 기본 pattern 은 %{message} 입니다. Android 로깅을 참조하십시오. 범주가 포함된 사용자 정의 pattern 이 사용되는 경우, QCoreApplication::applicationName() 이 태그로 사용됩니다.
pattern 은 QT_MESSAGE_PATTERN 환경 변수를 설정하여 런타임에 변경할 수도 있습니다. qSetMessagePattern()이 호출되고 QT_MESSAGE_PATTERN이 설정된 경우, 환경 변수가 우선 적용됩니다.
참고: category, file, function 및 line 자리 표시자에 대한정보는 디버그 빌드에서만 기록됩니다. 또는 QT_MESSAGELOGCONTEXT 을 명시적으로 정의할 수도 있습니다. 자세한 내용은 QMessageLogContext 문서를 참조하십시오.
참고: 메시지패턴은 기본 stderr 출력과 같은 비구조적 로깅에만 적용됩니다. systemd와 같은 구조적 로깅은 캡처할 수 있는 최대한의 구조화된 정보와 함께 메시지를 있는 그대로 기록합니다.
사용자 정의 메시지 핸들러는 ` qFormatLogMessage()`를 사용하여 ` pattern `를 고려할 수 있습니다.
보안 고려 사항
Qt는 pattern 에서 제어 문자를 제거하거나 이스케이프 처리하지 않습니다. 여기에는 LF, CR, NUL 바이트 및 터미널 제어 시퀀스가 포함됩니다. 따라서 신뢰할 수 없는 출처의 패턴을 허용하면 로그 위조가 가능해지거나 로그 스트림의 수신자에게 제어 시퀀스가 전송될 수 있습니다. 또한 일부 로깅 백엔드에서는 NUL 바이트가 존재할 경우 메시지가 잘릴 수 있습니다.
qInstallMessageHandler(), 디버깅 기법, QLoggingCategory 및 QMessageLogContext도 참조하십시오 .
매크로 문서
qCritical(const char *format, ...)
중요 메시지 format 를 중앙 메시지 핸들러에 기록합니다. ` format `에는 추가 인자로 지정된 값으로 대체되는 형식 지정자가 포함될 수 있습니다.
예시:
void load(const QString &fileName)
{
QFile file(fileName);
if (!file.exists())
qCritical("File '%s' does not exist!", qUtf8Printable(fileName));
}format UTF-8 문자열의 경우 ` %s `와 같은 형식 지정자를, 정수의 경우 ` %i `와 같은 형식 지정자를 포함할 수 있습니다. 이는 C 언어의 ` printf() ` 함수가 작동하는 방식과 유사합니다. 서식에 대한 자세한 내용은 ` QString::asprintf()`를 참조하십시오.
더 큰 편의성과 더 다양한 유형 지원을 위해, 스트리밍 패러다임을 따르는 QDebug::qCritical()을 사용할 수도 있습니다( std::cout 또는 std::cerr 와 유사).
실행 시 출력을 억제하려면 logging rules 를 정의하거나 사용자 정의 filter 를 등록하면 됩니다.
디버깅을 위해, 심각한 오류 메시지가 발생했을 때 프로그램을 중단시키는 것이 때때로 편리합니다. 이렇게 하면 코어 덤프를 확인하거나 디버거를 연결할 수 있습니다. qFatal()도 참조하십시오. 이 기능을 활성화하려면 환경 변수 QT_FATAL_CRITICALS 을 숫자로 설정하십시오. n. 그러면 프로그램은 n번째 심각한 오류 메시지가 발생했을 때 종료됩니다. 즉, 환경 변수가 1로 설정되어 있으면 첫 번째 호출 시 종료되고, 10으로 설정되어 있으면 10번째 호출 시 종료됩니다. 환경 변수에 숫자가 아닌 값이 지정된 경우, 이는 1과 동일하게 처리됩니다.
참고: 이 매크로는 스레드 안전합니다.
QDebug::qCritical, qCCritical(), qDebug(), qInfo(), qWarning(), qFatal(), qInstallMessageHandler() 및 ‘디버깅 기법’항목도 참조하십시오 .
qDebug(const char *format, ...)
중앙 메시지 핸들러에 “ format ” 디버그 메시지를 기록합니다. ` format `에는 추가 인자로 지정된 값으로 대체되는 형식 지정자가 포함될 수 있습니다.
예시:
qDebug("Items in list: %d", myList.size());format UTF-8 문자열의 경우 ` %s `과 같은 형식 지정자를 포함할 수 있으며, 정수의 경우 ` %i `을 사용할 수 있습니다. 이는 C 언어의 ` printf() ` 함수가 작동하는 방식과 유사합니다. 서식에 대한 자세한 내용은 ` QString::asprintf()`을 참조하십시오.
더 큰 편의성과 더 광범위한 유형 지원을 위해, 스트리밍 패러다임을 따르는 QDebug::qDebug()을 사용할 수도 있습니다( std::cout 또는 std::cerr 와 유사).
컴파일 시 QT_NO_DEBUG_OUTPUT 가 정의된 경우, 이 함수는 아무 작업도 수행하지 않습니다.
실행 시 출력을 억제하려면 qInstallMessageHandler()을 사용하여 사용자 정의 메시지 핸들러를 설정하십시오.
참고: 이 매크로는 스레드 안전합니다.
QDebug::qDebug()도 참조하십시오 . qCDebug(), qInfo(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler() 및 디버깅 기법도참조하십시오 .
qFatal(const char *format, ...)
치명적인 메시지 format 를 중앙 메시지 핸들러에 기록합니다. ` format `에는 추가 인자로 지정된 값으로 대체되는 형식 지정자가 포함될 수 있습니다.
예시:
int divide_by_zero(int a, int b)
{
if (b == 0) // program error
qFatal("divide: cannot divide by zero");
return a / b;
}기본 메시지 핸들러를 사용하는 경우, 이 함수는 코어 덤프를 생성하기 위해 실행을 중단합니다. Windows에서 디버그 빌드의 경우, 이 함수는 _CRT_ERROR를 보고하여 디버거를 애플리케이션에 연결할 수 있게 합니다.
실행 시 출력을 억제하려면 qInstallMessageHandler()을 사용하여 사용자 정의 메시지 핸들러를 설정하십시오.
qCFatal(), qDebug(), qInfo(), qWarning(), qCritical(), qInstallMessageHandler() 및 ‘디버깅 기법’항목도 참조하십시오 .
qInfo(const char *format, ...)
중앙 메시지 핸들러에 정보 메시지 format 를 기록합니다. ` format `에는 추가 인자로 지정된 값으로 대체되는 형식 지정자가 포함될 수 있습니다.
예시:
qInfo("Items in list: %d", myList.size());format UTF-8 문자열의 경우 ` %s `과 같은 형식 지정자를, 정수의 경우 ` %i `과 같은 형식 지정자를 포함할 수 있습니다. 이는 C 언어의 ` printf() ` 함수가 작동하는 방식과 유사합니다. 서식에 대한 자세한 내용은 ` QString::asprintf()`을 참조하십시오.
더 큰 편의성과 광범위한 유형 지원을 위해, 스트리밍 패러다임을 따르는 QDebug::qInfo()을 사용할 수도 있습니다( std::cout 또는 std::cerr 와 유사).
컴파일 시 QT_NO_INFO_OUTPUT 가 정의된 경우, 이 함수는 아무 작업도 수행하지 않습니다.
실행 시 출력을 억제하려면 qInstallMessageHandler()을 사용하여 자체 메시지 핸들러를 설치하십시오.
참고: 이 매크로는 스레드 안전합니다.
QDebug::qInfo()도 참조하십시오 . qCInfo(), qDebug(), qWarning(), qCritical(), qFatal(), qInstallMessageHandler() 및 디버깅 기법도참조하십시오 .
qWarning(const char *format, ...)
중앙 메시지 핸들러에 “ format ”라는 경고 메시지를 기록합니다. ` format `에는 추가 인자로 지정된 값으로 대체되는 서식 지정자가 포함될 수 있습니다.
예시:
void f(int c)
{
if (c > 200)
qWarning("f: bad argument, c == %d", c);
}format UTF-8 문자열의 경우 %s, 정수의 경우 %i 과 같은 형식 지정자를 포함할 수 있습니다. 이는 C 언어의 printf() 함수가 작동하는 방식과 유사합니다. 서식에 대한 자세한 내용은 QString::asprintf()을 참조하십시오.
더 큰 편의성과 추가적인 유형 지원을 위해, 스트리밍 패러다임을 따르는 QDebug::qWarning()을 사용할 수도 있습니다( std::cout 또는 std::cerr 와 유사).
컴파일 시 QT_NO_WARNING_OUTPUT 가 정의된 경우 이 함수는 아무 작업도 수행하지 않습니다. 런타임에 출력을 억제하려면 logging rules 를 설정하거나 사용자 정의 filter 를 등록하면 됩니다.
디버깅을 위해 경고 메시지가 발생하면 프로그램이 중단되도록 하는 것이 편리한 경우가 있습니다. 이를 통해 코어 덤프를 확인하거나 디버거를 연결할 수 있습니다( qFatal()도 참조하십시오). 이 기능을 활성화하려면 환경 변수 QT_FATAL_WARNINGS 을 숫자 n 로 설정하십시오. 그러면 프로그램은 n번째 경고가 발생할 때 종료됩니다. 즉, 환경 변수가 1로 설정되어 있으면 첫 번째 호출에서 종료되고, 값이 10이면 10번째 호출에서 종료됩니다. 환경 변수에 숫자가 아닌 값이 설정되어 있으면 1로 간주됩니다.
참고: 이 매크로는 스레드 안전합니다.
QDebug::qWarning(), qCWarning(), qDebug(), qInfo(), qCritical(), qFatal(), qInstallMessageHandler() 및 디버깅 기법도 참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.