[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Werte loggen, best practices

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Werte loggen, best practices

Gerald Singelmann
  
Beiträge gesamt: 6264

1. Aug 2012, 22:46
Beitrag # 1 von 6
Bewertung:
(1859 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich bin grad beim Tüfteln mal wieder drauf gestoßen, dass ich den Datenbrowser vom ESTK oftmals wegen seiner winzigen Größe und Klickintensität umständlich finde.
Wenn das der Fall ist (oder ich in einer Umgebung programmiere, die diese Art des Debuggens nicht hat), schreibe ich gern Zwischenstände in ein Log; bei InDesign halt in die ESTK-Konsole.

Hier ein Vorschlag für alle Interessierten, die sowas noch nie selbst gemacht haben. Meine Hoffnung ist, dass in der Folge noch zwei oder drei Vorschläge kommen, wie man das noch viiiiel besser machen kann... ;)

Code
_log( "hallo"); 
_log( "Du da", "String" );
_log( $.screens, "Bildschirme", true);
_log( [1, 2, "drei", 4], "Liste", true);



function _log( v, nm, src ) {
if (nm == undefined) nm = "value";
if (v == undefined) {
$.writeln( nm + ": undefined");
return;
}
$.writeln( nm + ": " + v.toString() );
if (src == true) {
$.writeln("src: " + v.toSource() );
var p = v.reflect.properties;
try {
$.writeln( v.constructor.name);
for (var n = 0; n < p.length; n++) {
$.writeln("." + p[n].name + ": " + p[n].dataType + ", " + p[n].type);
}
} catch(e) {}
}
$.writeln( "-------------------------");
}


Zwei Details sind dabei vielleicht interessant und nicht jedem offensichtlich:
- Die Möglichkeit, sich die Properties eines Objekts anzuschauen
- Die Möglichkeit, mehr Parameter in einer Funktion zu definieren, als dann tatsächlich übergeben werden. Die die nicht übergeben werden, sind in der Funktion dann "undefined".

Falls jemand lieber in eine Datei loggt, geht das z.B. so
Code
_log( "hallo"); 
_log( "Du da", "String" );
_log( $.screens, "Bildschirme", true);
_log( [1, 2, "drei", 4], "Liste", true);



function _log( v, nm, src ) {
var logfile = new File( "~/Desktop/my_log.txt");
if (logfile.exists == false) {
logfile.open("w");
} else {
logfile.open("a");
}
try {
if (nm == undefined) nm = "value";
if (v == undefined) {
logfile.writeln( nm + ": undefined");
return;
}
logfile.writeln( nm + ": " + v.toString() );
if (src == true) {
logfile.writeln("src: " + v.toSource() );
var p = v.reflect.properties;
logfile.writeln( v.constructor.name);
for (var n = 0; n < p.length; n++) {
logfile.writeln("." + p[n].name + ": " + p[n].dataType + ", " + p[n].type);
}
}
logfile.writeln( "-------------------------");
} catch(e) {
} finally {
logfile.close();
}
}


Anhang:
log.jsx (0.60 KB)   log_datei.jsx (0.82 KB)
X

Werte loggen, best practices

Hans Haesler
  
Beiträge gesamt: 5822

2. Aug 2012, 08:18
Beitrag # 2 von 6
Beitrag ID: #498865
Bewertung:
(1812 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerald,

besten Dank für die beiden Scripts. Ausprobiert und für gut befunden. :-)

Weil ich das ESTK nur äusserst selten benutze, werde ich bei Bedarf das Loggen in eine Datei vorziehen.

Gruss, Hans


als Antwort auf: [#498862]

Werte loggen, best practices

gfellenz
Beiträge gesamt: 120

2. Aug 2012, 13:45
Beitrag # 3 von 6
Beitrag ID: #498890
Bewertung:
(1772 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Gerald,

besser machen weiß ich nicht... Mir reichts normalerweise einen String zu loggen, aber ich hab gerne verschiedene Log-Level. Beim entwickeln stelle ich dann auf DEBUG beim Kunden werden nur noch Warnungen angezeigt.
Vermutlich wäre eibe Kombination das Beste!

Einmal die Logger-Klasse, dich normalerweise in einer eigenen Datei log.jsx halte:

Code
/** 
* Logging Class
* @class <b>idsLog</b> contains a JavaScript Loggin Extensions. Include this library and use the idsLog object in your script.<br/><br/><code>#include "idsHelper.jsx"<br/>[..]<br/>_log = idsLog(FILE, "DEBUG")<br/>_log.debug("Log me")</code><br/>
* @param {File} _logFile The Logfile as File-Object.
* @param {String} _logLevel One of the "OFF" "ERROR", "WARN", "INFO", "DEBUG", sets the current Logger to log only Events more or equal severe than the Loglevel.
*/
var idsLog = function (_logFile, _logLevel) {
if (_logFile.constructor.name == "String") {
this.logFile = File (_logFile);
}
this.logFile = _logFile;
this.SEVERITY = [];
this.SEVERITY["OFF"] = 4;
this.SEVERITY["ERROR"] = 3;
this.SEVERITY["WARN"] = 2;
this.SEVERITY["INFO"] = 1;
this.SEVERITY["DEBUG"] = 0;
this.logLevel = (_logLevel == undefined) ? 0 : SEVERITY[_logLevel];
this.writeLog = function (_message, _severity) {
logFile.open("e");
logFile.seek(logFile.length);
try {
logFile.writeln(Date() + " [" + _severity + "] " + ((_severity.length == 4) ? " [" : "[") + app.activeScript.name + "] " + _message);
} catch (e) {
//We're running from ESTK
logFile.writeln(Date() + " [" + _severity + "] " + ((_severity.length == 4) ? " [" : "[") + "ESTK] " + _message);
}
logFile.close();
}

return {
/**
* Writes a debug log message
* @param {String} _message Message to log.
*/
debug : function (_message) {
if (logLevel <= 0) writeLog(_message, "DEBUG");
},
/**
* Writes a info log message
* @param {String} _message Message to log.
*/
info : function (_message) {
if (logLevel <= 1) writeLog(_message, "INFO");
},
/**
* Writes a warn log message
* @param {String} _message Message to log.
*/
warn : function (_message) {
if (logLevel <= 2) writeLog(_message, "WARN");
},
/**
* Writes a warn log message und displays an Alert-Window
* @param {String} _message Message to log.
*/
warnAlert : function (_message) {
if (logLevel <= 2) {
writeLog(_message, "WARN");
alert ("PROBLEM [WARN]\n" + _message + "\n\nThere might be more information in the logfile:\n" + logFile);
}
},


/**
* Writes a warn log message
* @param {String} _message Message to log.
*/
error : function (_message) {
if (logLevel <= 3) writeLog(_message, "ERROR");
}
} // return
}


Und noch ein Testskript, dass den Einsatz zeigt:

Code
#include "log.jsx" 


test_idsLog ();

function test_idsLog () {
var _logFile = File ("~/Desktop/logFile.txt");
_log = idsLog(_logFile, "WARN");
_log.debug("DEBUG This should not appear in the current Loglevel!");
_log.info("INFO This should not appear in the current Loglevel!");
_log.warn("WARN This should appear in the current Loglevel!");
_log.error("ERROR This should appear in the current Loglevel!");
}


Das ganze kommt übrigens aus meiner Skripting Library die man unter http://www.indd-skript.de/idshelper/index.html findet.


als Antwort auf: [#498862]

Werte loggen, best practices

-hans-
Beiträge gesamt: 748

2. Aug 2012, 14:44
Beitrag # 4 von 6
Beitrag ID: #498893
Bewertung:
(1748 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Hans Haesler ] Hallo Gerald,

besten Dank für die beiden Scripts. Ausprobiert und für gut befunden. :-)

Weil ich das ESTK nur äusserst selten benutze, werde ich bei Bedarf das Loggen in eine Datei vorziehen.

Gruss, Hans


Hallo Hans,

welchen Editor verwendest Du?


als Antwort auf: [#498865]

Werte loggen, best practices

Hans Haesler
  
Beiträge gesamt: 5822

2. Aug 2012, 16:52
Beitrag # 5 von 6
Beitrag ID: #498902
Bewertung:
(1714 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans-Gerd,

ich benutze UltraEdit for Mac: http://www.ultraedit.com/...mac-text-editor.html

Sehr komfortabel: Syntaxhervorhebung (zwar nur bei ".js"-Dateien), automatische Ausrückung, Klammernpaare werden angezeigt.

Eine Schwäche: Die automatische Erkennung der Zeichenkodierung funktioniert nicht. Zum Öffnen einer Datei muss man die Kodierung wählen. Schon bald zwei Jahre her, dass ich das Problem gemeldet habe. Mein Vorschlag, dass sich der Editor wenigstens die einmal gewählte Kodierung merkt, wurde noch nicht umgesetzt. Trotz wiederholtem Nachhaken bei jeder neuen Betaversion. Aber damit kann man leben.

Gruss, Hans


als Antwort auf: [#498893]

Werte loggen, best practices

gfellenz
Beiträge gesamt: 120

2. Aug 2012, 17:22
Beitrag # 6 von 6
Beitrag ID: #498908
Bewertung:
(1703 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Wer das ESTK nicht mag sollte mal einen Blick auf:

http://www.sublimetext.com/2

werfen. Meiner Ansicht der innovativste Texteditor zur Zeit. Der Preis ist happig, aber durchaus gerechtfertigt. Syntax Highlighting und Encoding sind da eher die Basisfeatures :-)

Wobei ich trotzdem ExtendScript nur mit dem ESTK entwickle.


als Antwort auf: [#498893]
X