我有很多日志语句要调试,例如.
Log.v(TAG, "Message here");
Log.w(TAG, " WARNING HERE");
Run Code Online (Sandbox Code Playgroud)
在设备电话上部署此应用程序时,我想关闭可以启用/禁用日志记录的详细日志记录.
Dav*_*ebb 192
除了在开发期间,不应该将详细编译到应用程序中.调试日志在运行时编译但被剥离.始终保留错误,警告和信息日志.
因此,您可能需要考虑剥离日志详细日志语句,可能使用另一个答案中建议的ProGuard.
根据文档,您可以使用"系统属性"配置开发设备上的日志记录.要设置的属性是log.tag.<YourTag>
它应该设置为以下值之一:VERBOSE
,DEBUG
,INFO
,WARN
,ERROR
,ASSERT
,或SUPPRESS
. 有关此方法的更多信息,请参见该isLoggable()
方法的文档.
您可以使用该setprop
命令临时设置属性.例如:
C:\android>adb shell setprop log.tag.MyAppTag WARN
C:\android>adb shell getprop log.tag.MyAppTag
WARN
Run Code Online (Sandbox Code Playgroud)
或者,您可以在文件'/data/local.prop'中指定它们,如下所示:
log.tag.MyAppTag=WARN
Run Code Online (Sandbox Code Playgroud)
更高版本的Android 似乎要求/data/local.prop是只读的.此文件在引导时读取,因此您需要在更新后重新启动.如果/data/local.prop
世界可写,它可能会被忽略.
最后,您可以使用该System.setProperty()
方法以编程方式设置它们.
Chr*_*Orr 88
最简单的方法可能是在部署之前通过ProGuard运行已编译的JAR ,其配置如下:
-assumenosideeffects class android.util.Log {
public static int v(...);
}
Run Code Online (Sandbox Code Playgroud)
除了所有其他ProGuard优化之外,这将直接从字节码中删除任何详细的日志语句.
Cyt*_*own 78
一种常见的方法是创建一个名为loglevel的int,并根据loglevel定义其调试级别.
public static int LOGLEVEL = 2;
public static boolean ERROR = LOGLEVEL > 0;
public static boolean WARN = LOGLEVEL > 1;
...
public static boolean VERBOSE = LOGLEVEL > 4;
if (VERBOSE) Log.v(TAG, "Message here"); // Won't be shown
if (WARN) Log.w(TAG, "WARNING HERE"); // Still goes through
Run Code Online (Sandbox Code Playgroud)
稍后,您只需更改所有调试输出级别的LOGLEVEL即可.
小智 18
我采用了一个简单的路径 - 创建一个包装类,它也使用可变参数列表.
public class Log{
public static int LEVEL = android.util.Log.WARN;
static public void d(String tag, String msgFormat, Object...args)
{
if (LEVEL<=android.util.Log.DEBUG)
{
android.util.Log.d(tag, String.format(msgFormat, args));
}
}
static public void d(String tag, Throwable t, String msgFormat, Object...args)
{
if (LEVEL<=android.util.Log.DEBUG)
{
android.util.Log.d(tag, String.format(msgFormat, args), t);
}
}
//...other level logging functions snipped
Run Code Online (Sandbox Code Playgroud)
小智 10
更好的方法是使用SLF4J API +的一些实现.
对于Android应用程序,您可以使用以下内容:
你应该用
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "my log message");
}
Run Code Online (Sandbox Code Playgroud)
使用 proguard 删除日志记录(请参阅@Christopher 的回答)既简单又快速,但是如果文件中有任何调试日志记录,它会导致来自生产的堆栈跟踪与源不匹配。
相反,这里有一种技术,它在开发和生产中使用不同的日志记录级别,假设 proguard 仅在生产中使用。它通过查看 proguard 是否已重命名给定的类名来识别生产(在示例中,我使用“com.foo.Bar”——您将使用完全限定的类名替换它,您知道该类名将被 proguard 重命名)。
这种技术利用了公共日志记录。
private void initLogging() {
Level level = Level.WARNING;
try {
// in production, the shrinker/obfuscator proguard will change the
// name of this class (and many others) so in development, this
// class WILL exist as named, and we will have debug level
Class.forName("com.foo.Bar");
level = Level.FINE;
} catch (Throwable t) {
// no problem, we are in production mode
}
Handler[] handlers = Logger.getLogger("").getHandlers();
for (Handler handler : handlers) {
Log.d("log init", "handler: " + handler.getClass().getName());
handler.setLevel(level);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
189948 次 |
最近记录: |