console.log
테스트 목적으로 JavaScript 코드에서 모든 명령문 을 끌 수있는 방법이 있습니까?
PICOLOG_LEVEL
(노드) 에서 쉽게 구성 할 수 있으며 매우 작습니다. 900 바이트 이하로 축소되고 압축됩니다. 면책 조항 : 나는 저자입니다.
console
기능 . stapp.space/disable-javascript-console-on-production
console.log
테스트 목적으로 JavaScript 코드에서 모든 명령문 을 끌 수있는 방법이 있습니까?
PICOLOG_LEVEL
(노드) 에서 쉽게 구성 할 수 있으며 매우 작습니다. 900 바이트 이하로 축소되고 압축됩니다. 면책 조항 : 나는 저자입니다.
console
기능 . stapp.space/disable-javascript-console-on-production
답변:
스크립트에서 console.log 함수를 재정의하십시오.
console.log = function() {}
이제 콘솔에 더 이상 메시지가 없습니다.
편집하다:
Cide의 아이디어를 확장합니다. 코드에서 로그 온 / 오프를 토글하는 데 사용할 수있는 사용자 정의 로거입니다.
내 Firefox 콘솔에서 :
var logger = function()
{
var oldConsoleLog = null;
var pub = {};
pub.enableLogger = function enableLogger()
{
if(oldConsoleLog == null)
return;
window['console']['log'] = oldConsoleLog;
};
pub.disableLogger = function disableLogger()
{
oldConsoleLog = console.log;
window['console']['log'] = function() {};
};
return pub;
}();
$(document).ready(
function()
{
console.log('hello');
logger.disableLogger();
console.log('hi', 'hiya');
console.log('this wont show up in console');
logger.enableLogger();
console.log('This will show up!');
}
);
위의 '로거'를 사용하는 방법은 무엇입니까? 준비가되면 콘솔 메시지가 기록되지 않도록 logger.disableLogger를 호출하십시오. 콘솔에 메시지를 로그하려는 메소드 내에 logger.enableLogger 및 logger.disableLogger에 대한 호출을 추가하십시오.
console.log
... 왜 부울과 로깅을위한 조건부 함수가 있습니까?
다음은 더 철저합니다.
var DEBUG = false;
if(!DEBUG){
if(!window.console) window.console = {};
var methods = ["log", "debug", "warn", "info"];
for(var i=0;i<methods.length;i++){
console[methods[i]] = function(){};
}
}
콘솔에서 일반적인 메소드가있는 경우이를 제로로 만들며, 오류없이 사실상 성능 오버 헤드없이 호출 할 수 있습니다. 콘솔이없는 IE6와 같은 브라우저의 경우, 오류를 방지하기 위해 더미 메소드가 작성됩니다. 물론 Firebug에는 추적, 프로파일, 시간 등과 같은 더 많은 기능이 있습니다. 코드에서 사용하면 목록에 추가 할 수 있습니다.
디버거에 이러한 특수 메서드가 있는지 (예 : IE) 있는지 확인하고 지원하지 않는 메서드를 제거 할 수도 있습니다.
if(window.console && !console.dir){
var methods = ["dir", "dirxml", "trace", "profile"]; //etc etc
for(var i=0;i<methods.length;i++){
console[methods[i]] = function(){};
}
}
documentation 에서 알 수 있듯이 Firebug는 디버그 상태를 토글하는 변수를 제공하지 않습니다. 대신 console.log ()를 조건부로 호출하는 랩퍼로 랩핑하십시오.
DEBUG = true; // set to false to disable debugging
function debug_log() {
if ( DEBUG ) {
console.log.apply(this, arguments);
}
}
기존 통화를 모두 변경하지 않으려면 대신 다음을 사용할 수 있습니다.
DEBUG = true; // set to false to disable debugging
old_console_log = console.log;
console.log = function() {
if ( DEBUG ) {
old_console_log.apply(this, arguments);
}
}
내장 함수를 겹쳐 쓰는 것은 좋은 습관이 아닙니다. 또한 모든 출력을 억제한다는 보장은 없으며, 사용하는 다른 라이브러리가 변경 사항을 되돌릴 수 있으며 콘솔에 쓸 수있는 다른 기능이 있습니다. .dir()
, .warning()
, .error()
, .debug()
, .assert()
등
일부 제안했듯이 DEBUG_MODE
변수를 정의하고 조건부로 로그 할 수 있습니다. 코드의 복잡성과 특성에 따라 콘솔 객체를 감싸고이 기능이 내장 된 자신 만의 로거 객체 / 함수를 작성하는 것이 좋습니다. 그것은 계측을 다루기에 적합한 장소 일 것 입니다.
즉, '테스트'목적으로 콘솔에 인쇄하는 대신 테스트 를 작성할 수 있습니다 . 테스트를 수행하지 않고 해당 console.log()
행이 코드를 작성하는 데 도움이 되었다면 간단히 삭제하십시오 .
"other libraries you use may revert your changes"
: console.log
맨 처음에 비활성화 하면 이전 기능으로 되돌릴 수 없습니다. 글쎄, 그들은 console.log
소스 코드를 다시 작성할 수 있지만 왜? "it may be a good idea to write your own logger object/function that wraps around the console object"
: 나는 이것을 과거에 해왔으며 나쁜 생각입니다. 콘솔 출력의 추적은 랩퍼를 참조하고이를 호출하는 행이 아니라 디버깅을 더 어렵게합니다.
console.log('Look ma, it reaches this point');
코드에서 일부를 해킹하는 대신 적절한 테스트 전략이 있어야합니다. 다른 모든 것이 실패하면 실제로 debugger;
지침을 사용할 수 있습니다 .
"the code is coupled to that infrastructure"
: 아마도 코드이지만 패턴은 아닙니다. 로깅 기능이 비활성화 된 페이지에 대한 공통 기본 템플릿을 만들면 어디에서나 적용 할 수있는 논리입니다. "the later shouldn't be browser-aware"
: 글쎄, 그래서 당신은 JS를 사용해서는 안된다 : P
console.log를 사용하지 않도록 설정하는 방법에 대한 질문을 받았지만 이것이 실제로 나올 수도 있습니다. 이렇게하면 콘솔을 명시 적으로 활성화하거나 비활성화 할 필요가 없습니다. 단순히 열거 나 설치하지 않은 사람들에게 성가신 콘솔 오류를 방지합니다.
if(typeof(console) === 'undefined') {
var console = {};
console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
}
DEBUG
console.log 함수를 대체 하려면 플래그 를 변경하십시오 . 이것은 트릭을해야합니다.
var DEBUG = false;
// ENABLE/DISABLE Console Logs
if(!DEBUG){
console.log = function() {}
}
function myLog(msg) { if (debug) { console.log(msg); } }
아무도 대답하지 않는 모든 대답에 놀랐습니다.
나는 이것을 갈 것이다.
(function () {
var debug = false
if (debug === false) {
if ( typeof(window.console) === 'undefined') { window.console = {}; }
window.console.log = function () {};
}
})()
이 문제를 검색하고 내 코르도바 앱 내에서 시도한 후 모든 개발자에게 Windows Phone의 덮어 쓰기를 경고하고 싶습니다.
console.log
시작시 앱이 중단되기 때문입니다.
운이 좋으면 로컬을 개발하는 경우 충돌하지 않지만 상점에 제출하면 앱이 중단됩니다.
덮어 쓰기
window.console.log
필요한 경우.
이것은 내 응용 프로그램에서 작동합니다.
try {
if (typeof(window.console) != "undefined") {
window.console = {};
window.console.log = function () {
};
window.console.info = function () {
};
window.console.warn = function () {
};
window.console.error = function () {
};
}
if (typeof(alert) !== "undefined") {
alert = function ()
{
}
}
} catch (ex) {
}
이것은 SolutionYogi 와 Chris S 의 답변이 혼합 된 형식으로 console.log 줄 번호와 파일 이름을 유지합니다. jsFiddle 예제 .
// Avoid global functions via a self calling anonymous one (uses jQuery)
(function(MYAPP, $, undefined) {
// Prevent errors in browsers without console.log
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function(){};
//Private var
var console_log = console.log;
//Public methods
MYAPP.enableLog = function enableLogger() { console.log = console_log; };
MYAPP.disableLog = function disableLogger() { console.log = function() {}; };
}(window.MYAPP = window.MYAPP || {}, jQuery));
// Example Usage:
$(function() {
MYAPP.disableLog();
console.log('this should not show');
MYAPP.enableLog();
console.log('This will show');
});
Grunt를 사용하면 console.log 문을 제거 / 코멘트하기 위해 작업을 추가 할 수 있습니다. 따라서 console.log는 더 이상 호출되지 않습니다.
나는 그가 문제를 해결하기 위해 다음을 사용했습니다.
var debug = 1;
var logger = function(a,b){ if ( debug == 1 ) console.log(a, b || "");};
디버깅을 활성화하려면 debug를 1로 설정하십시오. 그런 다음 디버그 텍스트를 출력 할 때 로거 기능을 사용하십시오. 또한 두 개의 매개 변수를 허용하도록 설정되어 있습니다.
그래서 대신
console.log("my","log");
사용하다
logger("my","log");
이전에 윈스턴 로거를 사용했습니다 .
요즘에는 경험에서보다 간단한 코드를 사용하고 있습니다.
cmd / 명령 행에서 환경 변수를 설정하십시오 (Windows의 경우).
cmd
setx LOG_LEVEL info
또는 원하는 경우 코드에 변수를 가질 수 있지만 위의 것이 좋습니다.
cmd / 명령 행 또는 Netbeans와 같은 IDE / 편집기를 다시 시작하십시오.
아래 코드와 같이하십시오 :
console.debug = console.log; // define debug function
console.silly = console.log; // define silly function
switch (process.env.LOG_LEVEL) {
case 'debug':
case 'silly':
// print everything
break;
case 'dir':
case 'log':
console.debug = function () {};
console.silly = function () {};
break;
case 'info':
console.debug = function () {};
console.silly = function () {};
console.dir = function () {};
console.log = function () {};
break;
case 'trace': // similar to error, both may print stack trace/ frames
case 'warn': // since warn() function is an alias for error()
case 'error':
console.debug = function () {};
console.silly = function () {};
console.dir = function () {};
console.log = function () {};
console.info = function () {};
break;
}
다음과 같이 모든 콘솔을 사용하십시오. *
console.error(' this is a error message '); // will print
console.warn(' this is a warn message '); // will print
console.trace(' this is a trace message '); // will print
console.info(' this is a info message '); // will print, LOG_LEVEL is set to this
console.log(' this is a log message '); // will NOT print
console.dir(' this is a dir message '); // will NOT print
console.silly(' this is a silly message '); // will NOT print
console.debug(' this is a debug message '); // will NOT print
이제 1 지점에서 지정한 LOG_LEVEL 설정 (예 : setx LOG_LEVEL log
명령 줄 다시 시작)을 기반으로 위의 일부가 인쇄되고 나머지는 인쇄되지 않습니다
도움이 되었기를 바랍니다.
경고 : 뻔뻔한 플러그!
내 JsTrace 객체와 같은 것을 사용하여 모듈 수준의 "전환"기능을 갖춘 모듈 식 추적 기능을 사용하여 당시에 보려는 내용 만 켤 수 있습니다.
(또한 관심있는 사람들을 위해 NuGet 패키지가 있습니다)
모든 레벨은 "오류"로 기본 설정되어 있지만 "끄기"상태 일 수 있습니다. 그래도 왜 오류를보고 싶지 않을지 모르겠습니다.
다음과 같이 변경할 수 있습니다.
Trace.traceLevel('ModuleName1', Trace.Levels.log);
Trace.traceLevel('ModuleName2', Trace.Levels.info);
티
이 URL JavaScript Tip : Bust and Disable console.log 에서 조금 더 고급 코드를 발견했습니다 .
var DEBUG_MODE = true; // Set this value to false for production
if(typeof(console) === 'undefined') {
console = {}
}
if(!DEBUG_MODE || typeof(console.log) === 'undefined') {
// FYI: Firebug might get cranky...
console.log = console.error = console.info = console.debug = console.warn = console.trace = console.dir = console.dirxml = console.group = console.groupEnd = console.time = console.timeEnd = console.assert = console.profile = function() {};
}
이 사용 사례를위한 라이브러리를 개발했습니다 : https://github.com/sunnykgupta/jsLogger
풍모:
log
, warn
, error
, info
.수정 가능하며 새로운 제안이 올 때마다 업데이트됩니다.
이것은 window.console의 모든 메소드를 대체해야합니다. 스크립트 섹션의 맨 위에 놓을 수 있으며, PHP 프레임 워크를 사용하는 경우 앱 환경이 제작되거나 디버그 플래그가 비활성화 된 경우에만이 코드를 인쇄 할 수 있습니다. 그런 다음 개발 환경 또는 디버그 모드에서 작동하는 코드의 모든 로그를 갖게됩니다.
window.console = (function(originalConsole){
var api = {};
var props = Object.keys(originalConsole);
for (var i=0; i<props.length; i++) {
api[props[i]] = function(){};
}
return api;
})(window.console);
나는 이것을 썼다 :
//Make a copy of the old console.
var oldConsole = Object.assign({}, console);
//This function redefine the caller with the original one. (well, at least i expect this to work in chrome, not tested in others)
function setEnabled(bool) {
if (bool) {
//Rewrites the disable function with the original one.
console[this.name] = oldConsole[this.name];
//Make sure the setEnable will be callable from original one.
console[this.name].setEnabled = setEnabled;
} else {
//Rewrites the original.
var fn = function () {/*function disabled, to enable call console.fn.setEnabled(true)*/};
//Defines the name, to remember.
Object.defineProperty(fn, "name", {value: this.name});
//replace the original with the empty one.
console[this.name] = fn;
//set the enable function
console[this.name].setEnabled = setEnabled
}
}
불행히도 엄격 모드 사용에서는 작동하지 않습니다.
그래서 사용 console.fn.setEnabled = setEnabled
하고 console.fn.setEnabled(false)
어디 fn
거의 모든 콘솔 기능이 될 수 있습니다. 귀하의 경우는 다음과 같습니다.
console.log.setEnabled = setEnabled;
console.log.setEnabled(false);
나도 이것을 썼다 :
var FLAGS = {};
FLAGS.DEBUG = true;
FLAGS.INFO = false;
FLAGS.LOG = false;
//Adding dir, table, or other would put the setEnabled on the respective console functions.
function makeThemSwitchable(opt) {
var keysArr = Object.keys(opt);
//its better use this type of for.
for (var x = 0; x < keysArr.length; x++) {
var key = keysArr[x];
var lowerKey = key.toLowerCase();
//Only if the key exists
if (console[lowerKey]) {
//define the function
console[lowerKey].setEnabled = setEnabled;
//Make it enabled/disabled by key.
console[lowerKey].setEnabled(opt[key]);
}
}
}
//Put the set enabled function on the original console using the defined flags and set them.
makeThemSwitchable(FLAGS);
따라서 FLAGS
위의 코드를 실행하기 전에 기본값을 입력 FLAGS.LOG = false
하면됩니다. 로그 기능은 기본적으로 비활성화되어 있으며 여전히 호출을 활성화 할 수 있습니다console.log.setEnabled(true)
console.log.setEnabled(true)
하고 로그보기를 시작합니다
var debug = false; debug && console.log(1/3)
그것은이 활성화되지 않은 경우 (이 경우 로그 내용을 평가할 필요가 없기 때문에 1/3
평가되지 않습니다), 발신자 라인을 잃지 않고 사용할 수 있습니다 그것도 쉽게 (const로 vars하지 않으면).
모든 console.*
기능 을 비활성화 / 재정의하는 포괄적 인 솔루션 이 여기 있습니다 .
물론 필요한 상황을 확인한 후 포함 시키십시오. 예를 들어, 프로덕션 릴리스를 포함하여 다른 중요한 구성 요소를 폭격하지 않습니다.
여기에 인용 :
"use strict";
(() => {
var console = (window.console = window.console || {});
[
"assert", "clear", "count", "debug", "dir", "dirxml",
"error", "exception", "group", "groupCollapsed", "groupEnd",
"info", "log", "markTimeline", "profile", "profileEnd", "table",
"time", "timeEnd", "timeStamp", "trace", "warn"
].forEach(method => {
console[method] = () => {};
});
console.log("This message shouldn't be visible in console log");
})();
꿀꺽 꿀꺽 사용하는 경우 다음 플러그인을 사용할 수 있습니다 .
다음 명령으로이 플러그인을 설치하십시오.
npm install gulp-remove-logging
다음으로이 줄을 gulpfile에 추가하십시오 :
var gulp_remove_logging = require("gulp-remove-logging");
마지막으로 gulpfile에 구성 설정 (아래 참조)을 추가하십시오.
작업 구성
gulp.task("remove_logging", function() { return gulp.src("src/javascripts/**/*.js") .pipe( gulp_remove_logging() ) .pipe( gulp.dest( "build/javascripts/" ) ); });
https://stackoverflow.com/a/46189791/871166 의 단순화
switch (process.env.LOG_LEVEL) {
case 'ERROR':
console.warn = function() {};
case 'WARN':
console.info = function() {};
case 'INFO':
console.log = function() {};
case 'LOG':
console.debug = function() {};
console.dir = function() {};
}
자바 스크립트 AOP를 사용할 수 있습니다 (예 : jquery-aop )를 사용하여 console.debug / log (around)에 대한 모든 호출을 가로 채고 일부 전역 변수가 false로 설정된 경우 실제 호출을 진행할 수 없습니다.
서버에서 로그 사용 / 사용 안함 동작을 변경할 수있는 아약스 호출 (지금도 가능)을 수행 할 수도 있습니다. 이는 스테이징 환경 등에서 문제가 발생할 때 디버깅을 사용하는 것이 매우 흥미로울 수 있습니다.
logeek 를 사용할 수 있으며 , 로그 메시지 가시성을 제어 할 수 있습니다. 그 방법은 다음과 같습니다.
<script src="bower_components/dist/logeek.js"></script>
logeek.show('security');
logeek('some message').at('copy'); //this won't be logged
logeek('other message').at('secturity'); //this would be logged
logeek.show('nothing')
모든 로그 메시지를 완전히 비활성화 할 수도 있습니다 .
이 문제에 대한 연구 개발을 마친 후에는이 솔루션을 발견하여 선택에 따라 경고 / 오류 / 로그를 숨길 수 있습니다.
(function () {
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function () {
console.warn = function () { };
window['console']['warn'] = function () { };
this.addEventListener('load', function () {
console.warn('Something bad happened.');
window['console']['warn'] = function () { };
});
};
})();
JQuery가 필요하지 않은 JavaScript 코드 임에도 불구하고 JQuery 플러그인 (예 : /../jquery.min.js) 앞에이 코드를 추가하십시오. 일부 경고는 JQuery 자체에 있기 때문입니다.
감사!!
ES2015 솔루션을 작성했습니다 ( Webpack 에만 사용 ).
class logger {
static isEnabled = true;
static enable () {
if(this.constructor.isEnabled === true){ return; }
this.constructor.isEnabled = true;
}
static disable () {
if(this.constructor.isEnabled === false){ return; }
this.constructor.isEnabled = false;
}
static log () {
if(this.constructor.isEnabled === false ) { return; }
const copy = [].slice.call(arguments);
window['console']['log'].apply(this, copy);
}
static warn () {
if(this.constructor.isEnabled === false ) { return; }
const copy = [].slice.call(arguments);
window['console']['warn'].apply(this, copy);
}
static error () {
if(this.constructor.isEnabled === false ) { return; }
const copy = [].slice.call(arguments);
window['console']['error'].apply(this, copy);
}
}
기술:
logger.disable()
-모든 콘솔 메시지를 비활성화logger.enable()
-모든 콘솔 메시지를 활성화logger.log('message1', 'message2')
-console.log와 동일하게 작동합니다.logger.warn('message1', 'message2')
-console.warn과 동일하게 작동합니다.logger.error('message1', 'message2')
-console.error와 똑같이 작동합니다. 행복한 코딩 ..