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(){};
}
}
ドキュメントからわかる限り、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
これは古い投稿ですが、Googleの検索結果の一番上に表示されるので、最新のChrome、FF、IEで機能する、よりエレガントな非jQueryソリューションを次に示します。
(function (original) {
console.enableLogging = function () {
console.log = original;
};
console.disableLogging = function () {
console.log = function () {};
};
})(console.log);
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 () {};
}
})()
私もこの問題を検索し、cordovaアプリ内で試した後、すべての開発者に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に設定します。次に、デバッグテキストを出力するときにロガー機能を使用します。また、2つのパラメーターを受け入れるように設定されています。
したがって、代わりに
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。*を使用します。
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);
より多くのドキュメントFORE、チェックアウトドキュメントを
T
このURLのJavaScriptのヒントにもう少し高度なコードが見つかりました。ヒント:バストを無効にして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
}
}
残念ながら、strictモードの使用では機能しません。
だから、使用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
設定するだけでよく、log関数はデフォルトで無効になり、呼び出しを有効にすることができます。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");
})();
gulpを使用している場合は、このプラグインを使用できます。
次のコマンドでこのプラグインをインストールします。
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() {};
}
javascript AOP(例えばjquery-aop)を使用して、console.debug / log(around)へのすべての呼び出しをインターセプトし、一部のグローバル変数がfalseに設定されている場合は実際の呼び出しを続行しないでください。
(時々)ajax呼び出しを行うこともできるので、サーバーでログの有効化/無効化動作を変更して、ステージング環境などで問題が発生したときにデバッグを有効にすることが非常に興味深い場合があります。
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とまったく同じように機能します。ハッピーコーディング...