2011-02-17 4 views
22

저는 C++로 간단한 경량 로깅 시스템을 찾고 있습니다. 기존 프레임 워크를 찾았지만이 시점에서 모든 기능을 필요로하지는 않습니다. 나는 주로 예를 들어 로그 수준 출력 파일을 구성 할 수있는 작은 시스템을 찾고 있습니다. 휠을 재발견하고 싶지 않아 기존 솔루션을 찾고 있습니다.작은 로거 클래스

+5

휠을 재발 명하고 싶지 않은 경우 기존 로깅 솔루션을 사용하지 않는 이유는 무엇입니까? [log4cpp] (http://log4cpp.sourceforge.net/)는 좋은 것 같습니다 – Nekresh

+0

안녕하세요, 귀하의 환경은 무엇입니까? Visual C++ 및 관리 코드 없음 . NET에서 로그 수준 및 파일, 콘솔, 출력 창 등등과 같은 다른 리스너로 구성 될 수있는 추적/디버그 리스너 개념이 있습니다. 확실하지 않은 것은 원시 C++에 내장되어 있습니다. –

+0

나는 이걸 이미 본 것으로 알고 있니? http://www.codeproject.com/KB/cpp/CPP_logging.aspx –

답변

36

다음 간단한 로깅 시스템을 권장합니다 : http://www.drdobbs.com/cpp/201804215. 단일 헤더 파일로 구성됩니다.

FILE_LOG(logWARNING) << "Ops, variable x should be " << expectedX << "; is " << realX; 

정말 스트림 구문 같은 : 나는 성공적으로 리눅스, 윈도우 및 Mac OS X의

당신은 다음과 같은 로그에 기록에 그것을 사용하고 있습니다. 눈에 거슬리지 않고, 형식 안전하며 표현력이 뛰어납니다. 로깅 프레임 워크는 행의 끝에 날짜, 시간 및 들여 쓰기를 추가하여 \n을 자동으로 추가합니다. 로그를 구성

은 매우 간단합니다 :

FILELog::ReportingLevel() = logDEBUG3; 
FILE* log_fd = fopen("mylogfile.txt", "w"); 
Output2FILE::Stream() = log_fd; 

이 프레임 워크는 확장이 용이하다. 직장에서 우리는 최근 그것에 적응하여 FILE* 대신 std::ofstream을 사용합니다. 결과적으로 스트림을 체인으로 묶어 로그 암호화와 같은 유용한 기능을 추가 할 수있게되었습니다.

+0

어디에서 다운로드 할 수 있습니까? –

+6

ftp://ftp.drdobbs.com/sourcecode/ddj/2007/0710.zip. "log.h"가 가장 좋은 파일입니다. 다른 하나는 덜 유연한 템플릿없는 버전입니다. Dr. Dobbs가 다시 주위를 섞어서 여기에 업로드했습니다 : http://pastie.org/1574516. –

+1

ofstream과 관련하여 변경 사항을 기꺼이 공유하지 않겠습니까? –

1

This question에는 약간의 허구가 있습니다. 그것은 완전하게 Standard C++이며 어떤 플랫폼 가정도하지 않습니다. 그것은 기본적으로 다음과 같이 사용되는 임시 개체로 구성

Debug(5) << "This is level 5 debug info.\n"; 

나는 당신이 기본 레이아웃이있을 때 다른 파일 및 기타 물건을 지정하는 방법을 알아낼 수 있습니다 확신합니다. 릴리스 구조에서 모든 형태의 디버그 출력이 가능한 한 제거되도록 구조화 된 클래스를 유지하려고했습니다.

주의 : 파일 이름을 구성 할 때마다 파일 이름을 지정하고 파일을 열고 다시 닫으면 성능이 저하됩니다. 다중 출력 파일의 경우에는 프로그램 실행시 또는 처음 열 때 여러 파일을 여는 정적 데이터 멤버가 여러 개있는 것이 가장 좋습니다.

2

프로젝트에 크기 제한이없고 오랜 시간이 걸릴 것으로 예상되는 경우 Apache Log4cxx을 참조하십시오. 그것은 작은 도서관이 아니지만 로깅에있어서 원했던 모든 것을 지원합니다 (원하는 것을 알지도 못한 것들을 포함하여). 휴대용입니다.

더 큰 프로젝트라면 조만간 로깅 솔루션이 "작은 로거 클래스"이상을 수행하는 것이 좋을 것입니다.

4

나는 (저자 인) plog 라이브러리를 사용하는 것이 좋습니다. 그것은 코드의 약 1000 줄의 헤더 만하고 사용하기 쉬운 : 간단한 솔루션을 원하는 사람들을위한

#include <plog/Log.h> 

int main() 
{ 
    plog::init(plog::debug, "Sample.log"); 

    LOGD << "Hello log!"; 
    LOGD_IF(true) << "conditional logging"; 
    return 0; 
} 
14

, 내가 추천 : easylogging++

단일 헤더 만 C++ 로깅 라이브러리입니다. 그것은 매우 가벼우 며, 견고하고 빠른 수행 스레드 및 유형 안전이며 많은 내장 기능으로 구성됩니다. 자체 사용자 정의 형식으로 로그를 작성하는 기능을 제공합니다.또한 등

수업, 타사 라이브러리, STL 및 타사 용기 로깅에 대한 지원을 제공이 라이브러리 외부 라이브러리의 사용을 방지하기 위해 모든 내장하고있다.

간단한 예 : (위의 링크에서 더 많은 고급 예제를 사용할 수 있음). 클래스 내에

#include "easylogging++.h" 

INITIALIZE_EASYLOGGINGPP 

int main(int argv, char* argc[]) { 
    LOG(INFO) << "My first info log using default logger"; 
    return 0; 
} 

출력 예 :

2015년 8월 28일 10 : 38 : 45,900 DEBUG [기본] 사용자 @ 로컬 호스트] [구성 : 구성 (CONST 문자열)] SRC/Config.cpp : 7] 읽기 설정 파일 : 'config.json'

나는 log4cpp을 시도하고 부스트 : 로그인하지만 그들은이 일만큼 쉽지 않다.

EXTRA 내용 : 최소 버전 - LOG 헤더는

나는 easylogging에 따라 더 간단한 애플리케이션에 작은 코드를 생성하지만 초기화 (아마 스레드로부터 안전하지 않습니다 점에 유의)를 필요로하지 않는다. 여기 코드는 다음과 같습니다

/* 
* File: Log.h 
* Author: Alberto Lepe <[email protected]> 
* 
* Created on December 1, 2015, 6:00 PM 
*/ 

#ifndef LOG_H 
#define LOG_H 

#include <iostream> 

using namespace std; 

enum typelog { 
    DEBUG, 
    INFO, 
    WARN, 
    ERROR 
}; 

struct structlog { 
    bool headers = false; 
    typelog level = WARN; 
}; 

extern structlog LOGCFG; 

class LOG { 
public: 
    LOG() {} 
    LOG(typelog type) { 
     msglevel = type; 
     if(LOGCFG.headers) { 
      operator << ("["+getLabel(type)+"]"); 
     } 
    } 
    ~LOG() { 
     if(opened) { 
      cout << endl; 
     } 
     opened = false; 
    } 
    template<class T> 
    LOG &operator<<(const T &msg) { 
     if(msglevel >= LOGCFG.level) { 
      cout << msg; 
      opened = true; 
     } 
     return *this; 
    } 
private: 
    bool opened = false; 
    typelog msglevel = DEBUG; 
    inline string getLabel(typelog type) { 
     string label; 
     switch(type) { 
      case DEBUG: label = "DEBUG"; break; 
      case INFO: label = "INFO "; break; 
      case WARN: label = "WARN "; break; 
      case ERROR: label = "ERROR"; break; 
     } 
     return label; 
    } 
}; 

#endif /* LOG_H */ 

사용법 :

#include "Log.h" 

int main(int argc, char** argv) { 
    //Config: -----(optional)---- 
    structlog LOGCFG = {}; 
    LOGCFG.headers = false; 
    LOGCFG.level = DEBUG; 
    //--------------------------- 
    LOG(INFO) << "Main executed with " << (argc - 1) << " arguments"; 
} 

이 코드 인쇄 메시지를 "cout을"을 사용하여,하지만 당신은 "cerr"를 사용하거나 I 희망 등, 파일을 추가 할 변경할 수 있습니다 그 사람에게 유용합니다. (참고 : 나는 어떤 식 으로든 C++ 전문가가 아니므로이 코드는 극단적 인 경우에 폭발 할 수 있습니다.)

+1

최소 버전의 경우 +1. 첫 번째 설정 라인을 넣으려면 'structlog LOGCFG = {};' 을 전역 범위의 main 메소드 외부에 두어 작업을 시작해야했습니다. – CodeKid

4

언급 된 모든 로거는 지금까지 로깅 호출에 매크로를 사용합니다. 나에게 그것은 너무 못생긴다. 나는 어떤 성능 향상을 주어도 상관 없다. 나는 가까이 가지 않을 것이다.

https://github.com/gabime/spdlog은 내가 좋아하는 것입니다. 구문을 정리하고 모든 일반적인 용도를 처리합니다. 빠르고 작습니다. 예 : 파일 로거의 경우 :

auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic.txt"); 
my_logger->info("Some log message");