저는 C++로 간단한 경량 로깅 시스템을 찾고 있습니다. 기존 프레임 워크를 찾았지만이 시점에서 모든 기능을 필요로하지는 않습니다. 나는 주로 예를 들어 로그 수준 출력 파일을 구성 할 수있는 작은 시스템을 찾고 있습니다. 휠을 재발견하고 싶지 않아 기존 솔루션을 찾고 있습니다.작은 로거 클래스
답변
다음 간단한 로깅 시스템을 권장합니다 : 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
을 사용합니다. 결과적으로 스트림을 체인으로 묶어 로그 암호화와 같은 유용한 기능을 추가 할 수있게되었습니다.
어디에서 다운로드 할 수 있습니까? –
ftp://ftp.drdobbs.com/sourcecode/ddj/2007/0710.zip. "log.h"가 가장 좋은 파일입니다. 다른 하나는 덜 유연한 템플릿없는 버전입니다. Dr. Dobbs가 다시 주위를 섞어서 여기에 업로드했습니다 : http://pastie.org/1574516. –
ofstream과 관련하여 변경 사항을 기꺼이 공유하지 않겠습니까? –
This question에는 약간의 허구가 있습니다. 그것은 완전하게 Standard C++이며 어떤 플랫폼 가정도하지 않습니다. 그것은 기본적으로 다음과 같이 사용되는 임시 개체로 구성
Debug(5) << "This is level 5 debug info.\n";
나는 당신이 기본 레이아웃이있을 때 다른 파일 및 기타 물건을 지정하는 방법을 알아낼 수 있습니다 확신합니다. 릴리스 구조에서 모든 형태의 디버그 출력이 가능한 한 제거되도록 구조화 된 클래스를 유지하려고했습니다.
주의 : 파일 이름을 구성 할 때마다 파일 이름을 지정하고 파일을 열고 다시 닫으면 성능이 저하됩니다. 다중 출력 파일의 경우에는 프로그램 실행시 또는 처음 열 때 여러 파일을 여는 정적 데이터 멤버가 여러 개있는 것이 가장 좋습니다.
프로젝트에 크기 제한이없고 오랜 시간이 걸릴 것으로 예상되는 경우 Apache Log4cxx을 참조하십시오. 그것은 작은 도서관이 아니지만 로깅에있어서 원했던 모든 것을 지원합니다 (원하는 것을 알지도 못한 것들을 포함하여). 휴대용입니다.
더 큰 프로젝트라면 조만간 로깅 솔루션이 "작은 로거 클래스"이상을 수행하는 것이 좋을 것입니다.
나는 (저자 인) plog 라이브러리를 사용하는 것이 좋습니다. 그것은 코드의 약 1000 줄의 헤더 만하고 사용하기 쉬운 : 간단한 솔루션을 원하는 사람들을위한
#include <plog/Log.h>
int main()
{
plog::init(plog::debug, "Sample.log");
LOGD << "Hello log!";
LOGD_IF(true) << "conditional logging";
return 0;
}
, 내가 추천 : 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. 첫 번째 설정 라인을 넣으려면 'structlog LOGCFG = {};' 을 전역 범위의 main 메소드 외부에 두어 작업을 시작해야했습니다. – CodeKid
언급 된 모든 로거는 지금까지 로깅 호출에 매크로를 사용합니다. 나에게 그것은 너무 못생긴다. 나는 어떤 성능 향상을 주어도 상관 없다. 나는 가까이 가지 않을 것이다.
https://github.com/gabime/spdlog은 내가 좋아하는 것입니다. 구문을 정리하고 모든 일반적인 용도를 처리합니다. 빠르고 작습니다. 예 : 파일 로거의 경우 :
auto my_logger = spd::basic_logger_mt("basic_logger", "logs/basic.txt");
my_logger->info("Some log message");
- 1. 로거 인스턴스를 클래스
- 2. 젠드 프레임 워크 로거 : 젠드 DB 로거
- 3. 파이썬의 로거 체인
- 4. 간단한 스레드 안전 비 블로킹 파일 로거 클래스 (C#
- 5. C++에서 표준 스트림을 사용하는 유연한 로거 클래스
- 6. 응용 프로그램 로거
- 7. 로거 오류 문제
- 8. C# 응용 프로그램 로거
- 9. 로거 계층의 문제점
- 10. Facebook 상태 로거 신청
- 11. 간단한 로거, 방법?
- 12. 레일에 로거 설정하기 3
- 13. guice가있는 로거 자동 주입
- 14. 재정의 로깅 루트 로거
- 15. 로거 처리기를 닫아야합니다.
- 16. Android 애플리케이션 이름 로거
- 17. 레일즈 로거 메시지 test.log?
- 18. PHP 용 로거 찾기
- 19. log4net 중첩 로거 .config 예
- 20. PHP : 하나의 거대한 데이터베이스 클래스 또는 여러 개의 작은 클래스?
- 21. 로거 이름에 대한 Java 로깅 우수 사례
- 22. 구조 맵을 사용하여 오류 로거 주입하기
- 23. 재생할 수있는 네트워크 UDP 로거
- 24. 파이썬 로거 동적 파일 이름
- 25. 더미 slf4j 로거 가져 오기?
- 26. 가변적 인 printf 스타일의 로거
- 27. 파이썬/장고 루트 로거 수준
- 28. 방화벽/방문 웹 사이트 로거
- 29. Maven Embedder 실행을위한 로거 설정
- 30. .NET 로거 라이브러리 선택 사항
휠을 재발 명하고 싶지 않은 경우 기존 로깅 솔루션을 사용하지 않는 이유는 무엇입니까? [log4cpp] (http://log4cpp.sourceforge.net/)는 좋은 것 같습니다 – Nekresh
안녕하세요, 귀하의 환경은 무엇입니까? Visual C++ 및 관리 코드 없음 . NET에서 로그 수준 및 파일, 콘솔, 출력 창 등등과 같은 다른 리스너로 구성 될 수있는 추적/디버그 리스너 개념이 있습니다. 확실하지 않은 것은 원시 C++에 내장되어 있습니다. –
나는 이걸 이미 본 것으로 알고 있니? http://www.codeproject.com/KB/cpp/CPP_logging.aspx –