(C ++) 게임용 로깅 라이브러리 [닫기]


15

나는 많은 로깅 라이브러리를 알고 있지만 많은 테스트 라이브러리를 테스트하지 않았습니다. (GoogleLog, Pantheios, 다음 부스트 :: log 라이브러리 ...)

게임, 특히 원격 멀티 플레이어 및 멀티 스레딩 게임에서 로깅은 결국 모든 로그를 제거하더라도 디버깅에 필수적입니다.

로그 (멀티 플레이어 및 멀티 스레드 및 / 또는 멀티 프로세스)가 필요한 PC 게임 (콘솔이 아님)을 만들고 있는데 로깅 할 라이브러리를 찾는 데 충분한 이유가 있다고 가정합니다 (시간이 없거나 아예 없습니다). 내 경우에 올바르게 작성하는 능력에 자신감이 없다).

내가 필요하다고 가정 :

  1. 공연
  2. 사용 편의성 (스트리밍 또는 형식 지정 등)
  3. 신뢰할 수 있음 (누수 또는 충돌 방지)
  4. 크로스 플랫폼 (Windows, MacOSX, Linux / Ubuntu 이상)

Wich 로깅 라이브러리를 다시 지정 하시겠습니까?

현재 boost :: log가 가장 유연 하지만 ( 원격으로 로그 할 수 있습니다!) 성능 업데이트가 좋지 않습니다. 고성능이지만 아직 출시되지 않았습니다. Pantheios는 종종 인용되지만 성능과 사용법에 대한 비교 포인트는 없습니다. 나는 오랫동안 내 자신의 라이브러리를 사용했지만 멀티 스레딩을 관리하지 않으므로 충분히 빠르더라도 큰 문제가된다는 것을 알고 있습니다. Google 로그는 흥미로워 보입니다. 테스트 만하면되지만 이미 해당 라이브러리를 비교 한 경우 조언이 유용 ​​할 것입니다.

게임은 종종 성능이 까다 롭고 디버깅이 복잡하므로 특정 경우 분명한 이점이있는 로깅 라이브러리를 아는 것이 좋습니다.


3
언급하지 않은 중요한 요구 사항은 로그를 사용하려는 것입니다. 디버그 메시지, 디자이너에 대한 메트릭, 고객 지원을위한 문자 상태 및 신용 카드 트랜잭션과 같은 로깅 요구 사항이 다릅니다. 일반적으로 성능, 프로그래머의 사용 편의성, 오프라인 구문 분석의 용이성 / 속도 및 상황에 따라 내구성을 상쇄합니다.

맞습니다. 그러나 "완전한"로깅 솔루션을 사용하면 사용자가 설명한대로 다른 종류의 로그를 설정할 수 있다고 가정합니다. 질문 에서이 정밀도가 중요하다고 생각되면 내 손님이되어 질문에 추가하십시오.
Klaim

답변:


8

소켓을 사용하여 로그 (모든 소켓 래퍼로 충분할 수 있음) + 웹 브라우저 websocket => 가장 다재다능하고 눈에 띄지 않는 로깅 도구로 디버깅 시간이 많이 걸리고 눈에 띄지 않게됩니다.

  • 비동기 (브라우저의 모든 작업을 지연시키는 속도)
  • 형식화 (색상, 크기 등)
  • 신뢰할 수있는 (소켓 ...)
  • 크로스 플랫폼 (브라우저)

이제 보너스 :

  • 동적 필터링 매우 쉽게 수행 (필요한 경우 자바 스크립트 정규식 사용)
  • 로그 기록, 메모리 및 비교 기능 ( "브라우저 내"데이터베이스의 HTML5 사양)
  • 메모리 , 메모리 조각화 등과 같은 모든 데이터 (SVG 또는 캔버스 또는 기타 사용)의 일부 그래프를 만드는 쉬운 방법 ...
  • 모든 데이터의 일부 2D 그래프를 만드는 쉬운 방법 ( kd-tree subdivision ? potential field?
  • 원격 로깅 가능 (다른 컴퓨터 브라우저 사용)
  • 브라우저 스토리지에서 html5를 사용하여 로그 세션 매개 변수 (현재 로그 필터 등 및 각각에 대한 참고 사항)를 저장할 수 있습니다.
  • 클릭 한 번으로 버그 보고서를 작성하거나 trac 티켓을 연결하는 것이 매우 쉽습니다.
  • 타임 라인 GUI 를 통해 손쉽게 로깅을 되감기하는 기능

로깅 이외의 더 많은 작업 :

  • 프로파일 러 정보 허용 (그래프 ...)
  • 콘솔 (브라우저에서 명령 보내기) 또는 HTML 또는 플래시 UI를 사용하는 빠른 GUI로도 사용할 수 있습니다.
  • 브라우저에서 이미지 차이 (소켓을 사용하여 이미지를 보내고 캔버스 이미지 픽셀 기능을 사용하여 브라우저에서 비교)
  • 기타...

(거의 모든 것은 플래시 소켓을 사용하여 수행 할 수 있으며 데이터베이스 기능을 저장합니다)

이제는 설정하는 것이 약간 길다는 것을 알고 있습니다. 그러나 실제로는 긴 프로젝트에서 시간이 많이 걸리며 (게임과 같은 어려운 디버깅 상황) 디버거 이후 내가 사용한 가장 강력한 것입니다 ...

참고 1 : 게임 네트워킹 코드를 디버깅 할 때 유일한 단점 => 이중 검사 부작용 (소켓 버퍼 크기, 대기 시간, 대역폭 등에 영향을 미침)

참고 2 : 보안상의 이유로 기본 웹 소켓에 의해 일부 브라우저가 비활성화 된 경우 about : config 항목을 확인하여 활성화되어 있는지 확인하십시오.


1
내가 틀렸다면 나를 수정하십시오. 그러나 이것은 로깅 출력을 어디로 향할지만을 제안합니다. 실제 로깅 라이브러리를 사용하면 컴파일시 필터링 (성능에 문제가있는 경우 중요), 서식 지정 및 로그 메시지 작성을위한 사용하기 쉬운 구문을 제공 할 수 있습니다.
sbi

@sbi 응용 프로그램 측에서 전역 적으로 사용하거나 사용하지 않는 것입니다. "브라우저 로그 클라이언트"는 필터링, 구문을 수행하지만 항상 모든 로그를 가져옵니다. 그것은 급진적이지만 개발 중에는 항상 모든 것을 기록하여 걸려 넘어지는 버그를 쉽게 잡거나 재현 할 수 있다는 경험을 기반으로합니다. 최적화 해야하는 경우 다시 브라우저 측입니다. 소켓을 사용하여 문자열을 사용하여 로그에 바인딩하지 않으면 다른 문자열 기반 로그 라이브러리보다 굵은 이진 데이터 (Id + float)를 직접 기록 할 수 있습니다 ... ( ) ... 문자열 브라우저 측에 아이디와 일치하는
투안 Kuranes

1
이것이 매우 실용적이라는 것을 알 수 있지만 실제로는 로거의 백엔드 (templog가 "log sink", IIRC라고 함)입니다. 성능은 나열된 요구 사항 중 하나입니다. 디버깅하는 동안 코드 조각에 로그 문을 추가해야한다는 것을 알았지 만 일단 코드를 실행하면이 코드가 너무 말이 많고 소음이 많은 작업에서 익사 할 수 있으며 비용도들 것입니다. 너무 많은 성능. 그래서 몇 줄의 코드를 변경하여 전체 코드 조각에서 로그 수준을 높이고 낮추고 싶습니다. 이것이 log lib의 중간 계층이 당신을 위해하는 일입니다.
sbi

@sbi : 벤치 마크가 필요할 수 있지만 가장 낮은 로깅 수준에서도 최고의 로깅 라이브러리는 여전히 모든 것을 기록하는 이진 로거보다 많은 비용이 듭니다. 단일 "바이너리에서 숯으로"CPU 주기도 낭비되지 않습니다. 따라서 실제로 더 많은 기능과 더 많은 성능을 제공합니다.
투안 쿠라 네스

실제로 templog를 사용하기로 결정하기 전에 몇 가지 테스트를 수행했습니다. 특정 로그 메시지의 심각도, 출처 또는 기타 사항에 대해 로깅이 해제되어 있고 컴파일러가 매개 변수를 평가할 때 부작용이 없음을 확인할 수있는 경우 VC는 실제로 완전한 성능을 최적화 할 수 있습니다 무언에 진술을 기록하십시오. 그리고 속도가 빠르면 처음에는 실행되지 않는 코드를 이길 수 없습니다.
sbi

8

성능에 관해서는 templog가 거의 무적 임을 발견했습니다 . 식 템플릿을 사용하여 정보가 전혀 기록 될 때까지 로깅 문의 평가를 연기합니다. 로그 메시지의 심각도, 원본 및 대상에 따라 로깅을 부분적으로 해제 할 수도 있으므로 릴리스 빌드를 위해 컴파일러에서 이러한 로깅 문 중 일부를 제로 코드로 제거 할 수 있습니다. (실제로 이것이 VC에서 발생하는 것을 보았습니다.)

최근 도서관에 많은 일을하지 않았으며 SO의 다른 사람들은 트렁크가 부족하다는 것을 발견했지만 회사에서 일했던 회사에서는 그 사람이 매우 반응이 좋았으며 그 당시 암소 노동자 중 한 명이 커밋 액세스 권한이 있고 코드를 추가 했으므로 가치가 있습니다.

요구 사항을 열거하려면

공연

내가 찾은 최고. 특히 컴파일 타임에 로그 메시지를 제외 하고 컴파일러 에서 로그 메시지 완전히 제거하는 기능은 매우 매력적이었습니다.

사용 편의성 (스트리밍 또는 형식 지정 등)

틀린 일을 할 때 templates-meta 일에 대한 고전적인 끔찍한 컴파일러 오류 메시지가 있지만 사용하기 쉽기 때문에

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

이길 어렵다.
그러나 사전 패키지 된 파일 (stderr, 파일, Windows 로깅 등)이 모두 정교하지 않기 때문에 자체 로그 싱크 (로그 메시지가있는 위치)를 만들어야 할 수도 있습니다. 성능이 주요 목표이기 때문에 모든 것의 본질은 다소 복잡하지만 (로그 메시지 포맷터가 로그 싱크와 얽혀있는 것처럼), 우리는 마스터했습니다 (디버거에서 도움을주는 것을 기억합니다). 자신 만의 메시지 포맷터 나 로그 싱크를 작성하는 것이 어려운 것은 아니라는 것을 이해했습니다.

신뢰할 수 있음 (누수 또는 충돌 방지)

우리는 그러한 심각한 문제를 찾지 않고 그것을 사용했습니다. 거기에는 동적 메모리 할당이 거의 없으므로 무언가 잘못하고 있다고 상상하기조차 어렵습니다. 물론 하나의 제품에서 실제 테스트에만 적용했습니다.

크로스 플랫폼 (Windows, MacOSX, Linux / Ubuntu 이상)

우리는 그것을 사용할 때 Win32, OSX 및 여러 다른 Linux 배포판, Ubuntu에서 사용했습니다.

멀티 스레딩에 관해서는 : 우리는 이것을 사용하지 않았지만 lib의 아키텍처를 기억하는 것에서 이것을 로그 싱크에서만 처리해야 할 것 같습니다. ICBWT.


고마워, 나는 이것을 몰랐다. 최소한 원래 아이디어에서는 boost :: log의 단순화 된 (및 성능이 우수한) 버전처럼 보입니다.
Klaim

@ Klaim : C ++ 로깅 라이브러리를 마지막으로 살펴볼 때 boost가 제공 할 것이 없다고 생각하므로 boost :: log에 대해 알지 못합니다.
sbi

1
@Joe : "표현 템플릿" 이라는 용어를 이해하십니까 ?
sbi

1
나는 그렇게 생각했지만 지금은 templog 소스 코드를 다운로드하여 읽기 시작했으며 C ++이 다시 우호적 인 것처럼 보입니다.

1
@ sbi : 내 혼란의 일부는 당신의 진술이 "한 번에 여러 층을 통과했다"는 것이었다-영어 로 한 번에 즉시 또는 함께 의미 할 수 있습니다 .이 경우에는 반대입니다. 나는 그것을 첫 번째로 읽었으며, 당신은 (지금 분명히 나에게) 두 번째를 의미했습니다. 시간을내어 설명해 주셔서 감사합니다.


0

Baical 도구 세트에 관심이있을 수 있습니다 .

  • 로그, 추적 및 원격 측정을위한 오픈 소스 및 크로스 플랫폼 (Win, Linux, x86 / x64) 라이브러리 -P7
  • 엄청나게 빠름 (내장 장치 용으로 설계됨)-네트워크에 초당 3 백만 개의 로그, 최신 CPU에 5 백만에 이르는 파일. 나는 모든 로그 메시지에 대해 그런 속도와 자세한 정보를 제공하는 로깅을위한 다른 라이브러리를 모른다.
  • 스레드 안전
  • 모든 추적 메시지에는 다음이 포함됩니다.
    • 문자 메세지
    • 수평
    • 정확한 시간 (100ns)
    • 소스 파일, 함수 이름 및 라인
    • 모듈 ID 및 모듈 이름
    • 스레드 ID 및 스레드 이름
    • 프로세서 코어 인덱스
  • 로그 및 원격 측정을 수신하고 볼 수있는 서버 응용 프로그램
  • 여러 소스에서 로그를 실시간으로 수집, 분석, 검색, 필터링 할 수 있습니다.

문자열 형식의 2017 년 6 월 현재 % s는 아직 지원되지 않습니다.
Romeno 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.