2014-09-30 9 views
6

Wir machen einige schwere Leistungsoptimierung in unserer App, daher beginnen wir mit Methodenverfolgung, um die Engpässe zu finden.Verringern Sie ORMlites interne Protokoll Ausführlichkeit oder deaktivieren Sie es

Auf den ersten Blick Ormlite war in Ordnung, aber wir fanden, dass zum Beispiel in einer Abfrage, die 8ms dauert, 6ms (75%) von Ormlite internen Protokoll benötigt wurden. Darüber hinaus sind diese Log-Aufrufe in DEBUG-Ebene.

Im Moment habe ich (ohne Erfolg) versucht haben, Log-Level Einstellung auf diese Weise Fehler:

  • mit adb: adb shell setprop log.tag.ORMLite ERROR
  • mit logback: <logger name="com.j256.ormlite" level="ERROR"/>

Dies sind ein paar Zeilen aus dem logcat

I/System.out(4207): 2014-10-01 10:50:14,702 [DEBUG] BaseMappedStatement query-for-id using ... 
I/System.out(4207): 2014-10-01 10:50:14,706 [DEBUG] StatementExecutor executing raw query for ... 
I/System.out(4207): 2014-10-01 10:50:14,709 [DEBUG] SelectIterator starting iterator @-1593957304 for ... 
I/System.out(4207): 2014-10-01 10:50:14,711 [DEBUG] SelectIterator closed iterator @-1593957304 after 1 rows 
I/System.out(4207): 2014-10-01 10:50:14,714 [DEBUG] BaseMappedStatement query-for-id using ... 
I/System.out(4207): 2014-10-01 10:50:14,717 [DEBUG] BaseMappedStatement query-for-id using ... 
I/System.out(4207): 2014-10-01 10:50:14,718 [DEBUG] StatementBuilder built statement ... 
I/System.out(4207): 2014-10-01 10:50:14,719 [DEBUG] BaseMappedStatement prepared statement ... 

Hier ist ein screnshot von met Tracing

ORMLite method tracing

Irgendwelche Gedanken auf, hod, wie dies umgehen aus?

+0

Also standardmäßig Android ist im INFO-Log-Modus. Wollen Sie sagen, dass ORMLite DEBUG-Nachrichten sogar auf dieser Ebene ausspuckte? Oder war das ein Leistungsproblem mit den DEBUG-Protokollnachrichten, obwohl sie nicht angezeigt wurden? – Gray

+0

Nur für andere, ORMLite's Dokumente über Android Logging sind hier: http://ormlite.com/docs/android-logging – Gray

+0

@Gray Ich habe einige zusätzliche Informationen hinzugefügt, Was ist seltsam ist, dass Logcat Ausgabe erscheint als Info (I/Sytem. out) aber das verwendete Tag ist debug ([DEBUG]) – Axxiss

Antwort

10

Bei der Methodenverfolgung haben wir gesehen, dass LocalLog verwendet wurde. Wie auf LocalLog's Dokumentation angegeben:

können Sie die Protokollebene festgelegt, indem die System.setProperty (LocalLog.LOCAL_LOG_LEVEL_PROPERTY, „Spur“) einstellen.
Akzeptable Werte sind: TRACE, DEBUG, INFO, WARN, ERROR und FATAL.

Wir nicht die Eigenschaft, mit adb shell so haben wir die folgende Zeile in unseren Application.onCreate

System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "ERROR"); 

endlich aufhören, sehen wir ORMLite Ausgabe auf logcat und Leistung erhöht, wie erwartet einstellen könnte.

+0

Huh. Ich bin mir nicht sicher, warum das LocalLog unter Android verwendet wurde. Es ist nur ein Fallback. Ich füge das zu den Android-Logging-Dokumenten @Axxiss hinzu. Vielen Dank. – Gray

+0

@Gray Vielleicht, weil wir ormlite in einer reinen Java-Bibliothek verwenden, die in ein Android-Projekt importiert wird. Ich kann nur raten. – Axxiss

+2

Dies passiert dann, wenn Sie ProGuard verwenden. Da Logger-Klassen nicht direkt verwendet werden, entfernt ProGuard sie alle und so gibt es nur LocalLog, auf das direkt im Bibliothekscode verwiesen wird. Ich habe das gleiche erlebt und alle Logger erst nachdem ich die ProGuard-Regeln eingestellt habe. – dant3

1

Für mich benutzte ich ORMLite in meinem Projekt (nicht mit Android). Dort habe ich die logback.xml verwendet, um sie zu konfigurieren.

http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_5.html

Wenn diese Klasse nicht gefunden wird es sucht dann nach org.apache.log4j.Logger und wenn wird verwenden Log4j gefunden.

So können wir einfach logback.xml wie unten verwenden.

<configuration> 
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <encoder> 
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
     </encoder> 
    </appender> 

    <logger name="com.my.test" level="TRACE" additivity="false"> 
     <appender-ref ref="STDOUT" /> 
    </logger> 

    <root level="INFO"> 
     <appender-ref ref="STDOUT"/> 
    </root> 
</configuration> 
+0

Ja, wir hatten bereits ormlite mit dieser Datei konfiguriert, aber es vollständig ignoriert das Protokoll Ebene so weit ich mich erinnere. – Axxiss

+0

Es gibt eine Bestellung. "Der Logger-Code sucht zuerst nach dem android.util.Log und wenn er gefunden wird, wird der interne Logger von Android verwendet" Wenn Sie android-bezogene Arbeit machen, wäre android.util.Log der beste Ort zum Konfigurieren. –