2013-04-10 4 views
4

저는 현재 자바 스크립트로 라이브러리를 만들고 있으며 디버깅을위한 Google의 DevTools를 정말 좋아합니다. 불행히도 내가 공개 할 때 내 라이브러리가 기록되기를 원하지 않습니다.DevTools Console - 끄기

이것은 내 로거가 현재 설정되어있는 방식입니다.

var debug = false; 

var increaseSomething = function() 
{ 
    // Random Code... 

    if (debug) { console.log("Increased!"); } 
} 

불행히도 이것은 매우 귀찮습니다. 모든 호출에 콘솔에 로깅하기 전에 디버그가 켜져 있는지 확인하지 않아도됩니다.

내 자체 로깅 개체에 콘솔을 캡슐화하려고 할 수는 있지만 그렇게 좋은 생각은 아닐 것이라고 생각합니다. 이견있는 사람?

+0

다시 게시 할 예정입니까 [이] (http://benalman.com/projects/javascript-debug-console-log/) 보셨나요? – adeneo

+0

@adeneo 나는 크로스 브라우저 호환이 가능하지만 크롬 콘솔 기능 중 일부는 포함하지 않았기 때문에 유망 해 보였다. 내가해야한다면 아마 그걸 연장 할 수있을거야. –

+0

처음에는 콘솔을 사용하지 않고 디버그를 사용하는 것이 다소 혼란 스럽지만 편리하고 모든 로깅을 비활성화하는 쉬운 방법이 있습니다 ->'debug.setLevel (0)'및 기타 많은 멋진 기능. 그냥 log() 함수를 덮어 쓰는 것은 나에게 좋은 생각처럼 들리지 않는다! – adeneo

답변

0

는 다시 콘솔 로거를 캡슐화하고 대신 내가 취하는 함수를 만들어 콘솔을 캡슐화하기 위해 전체 개체 함께 올라오고 생각 콘솔 메소드. 그런 다음 디버깅이 켜져 있는지 확인하고 함수를 호출합니다.

var debug = true; 

var log = function (logFunction) { 
    if (debug) { 
     logFunction.apply(console, Array.prototype.slice.call(arguments, 1)); 
    } 
}; 

var check = function (canvas) { 
    log(console.groupCollapsed, "Initializing WebGL for Canvas: %O", canvas); 
    log(console.log, "cool"); 

    log(console.groupEnd); 
}; 

check(document.getElementById('thing')); 

@ Esthete의 생각은 좋아하지만 아직 캡슐화 된 콘솔을 만들고 싶지 않습니다. 다음은 예제 jsfiddle입니다. http://jsfiddle.net/WRe29/

여기서 객체 프로토 타입에 debugCall을 추가합니다. 로그 기능과 똑같은 다른 이름이므로 '중복'이 없습니다. 이제 어떤 객체도 debugCall을 호출하고 debug 플래그를 확인할 수 있습니다.

Object.prototype.debugCall = function(logFunction) 
{ 
    if (this.debug) { logFunction.apply(console, Array.prototype.slice.call(arguments, 1)); } 
}; 

var Thing = { debug : true /*, other properties*/ }; 
Thing.debugCall(console.log, "hello world"); 

편집 :

내 초기 생각은 개체가 로그인해야하는지 여부를 나타 내기 위해 '설정'으로 객체를 사용했다. 나는 이것을 잠시 동안 사용 했었지만 컨피규레이션 개념은 마음에 들었지만, 모든 사람들이 코드의 구성 객체를 사용하여 객체의 확장 된 함수에 전달되는 기능과 함께 매우 열렬하다고 생각하지는 않았습니다. 따라서 개념을 도입하고 대신 기능 장식을 살펴 보았습니다.

Function.prototype.if = function (exp) { 
    var exFn = this; 
    return function() { 
     if (exp) exFn.apply(this, arguments); 
    }; 
}; 

var debug = false; 

console.log = console.log.if(debug); 
console.group = console.group.if(debug); 
// Console functions... 
myFunction = myFunction.if(debug); 

표현식을 검사하는 데 장식 기능을 사용하는 것은 거의 필요하지 않지만 if 문을 어디서나 내 코드에 넣으 려하지 않습니다. 희망이 사람이 어쩌면 기능 장식 그들의 관심을 촉발하는 데 도움이되기를 바랍니다.

: 또한 설치하지 않는 한 경우 확장 올바르게 모두에 대한 로깅을 죽이 방법 * 기침) 개체/라이브러리 구성의 몇 가지 유형 디버그

5

이렇게 할 수 있습니까?

if (!debug) { 
    console.log = function() {/* No-op */} 
} 

언급 한대로 모든 사용자에 대해 모든 로깅을 중지하지 않을 수 있습니다. 이것이 내가 보통 어떻게 움직이는가입니다. 일부 유틸리티 파일에서 전역 함수로 정의하십시오. 대개 LOG, WARN, ERRORTRACE에 대한 추가 기능을 추가하고 자세한 표시 수준을 기준으로 기록하십시오.

// Define some verbosity levels, and the current setting. 
_verbosityLevels = ["TRACE", "LOG", "WARN", "ERROR"]; 
_verbosityCurrent = _verbosityLevels.indexOf("LOG"); 

// Helper function. 
var checkVerbosity = function(level) { 
    return _verbosityLevels.indexOf(level) <= _verbosityCurrent; 
} 

// Internal log function. 
var _log = function(msg, level) { 
    if(!debug && checkVerbosity(level)) console.log(msg); 
} 

// Default no-op logging functions. 
LOG = function() {/* no-op */} 
WARN = function() {/* no-op */} 

// Override if console exists. 
if (console && console.log) { 
    LOG = function(msg) { 
    _log(msg, "LOG"); 
    } 
    WARN = function(msg) { 
    _log(msg, "WARN"); 
    } 
}  

이렇게하면 시간 및 발신자 위치와 같은 중요한 정보를 로그에 추가 할 수도 있습니다. 이 같은

console.log(time + ", " + arguments.callee.caller.name + "(), " + msg); 

이 5 월 출력 뭔가 :

"10:24:10.123, Foo(), An error occurred in the function Foo()" 
+0

그런 다음 콘솔 메소드의 모든 부분을 빈 함수에 할당하십시오. 깔끔한 생각. –

+0

@ 네이트 - 평소처럼'console.log()'를 호출하면되지만,이 줄을 일찍 처리하면 로깅이 아무 것도하지 않게됩니다. – Aesthete

+0

콘솔을 제외하고는 단지 로그가 아닌 다른 방법이 있습니다. 게다가 그들이 내 라이브러리를 사용할 때 다른 사람들을 위해 콘솔을 죽이고 싶지는 확실하지 않습니다. –