我正在使用Log4j在我的Android应用程序中记录数据。我已经在以下类的帮助下配置了log4j,但是没有创建日志文件。
启用控制台日志记录,maxfilesize和maxbackupsize也很好。请让我知道我在这里缺少什么。
public class ConfigureLog4J {
static LogConfigurator logConfigurator = new LogConfigurator();
private static final int maxFileSize = 1024 * 5; // 100KB
public static final int maxBackupSize = 2; // 2 backup files
public static final String LOG_FILE_NAME = "bitzer.log";
private static HashMap<Integer, Level> logLevelMap = new HashMap<Integer, Level>();
static {
logLevelMap.put(0, Level.OFF);
logLevelMap.put(1, Level.ERROR);
logLevelMap.put(2, Level.INFO);
logLevelMap.put(3, Level.WARN);
logLevelMap.put(4, Level.DEBUG);
logLevelMap.put(5, Level.ALL);
}
public static void startWithLogLevel(int logLevel) {
logConfigurator.setFileName(getLogFileName());
logConfigurator.setRootLevel(getLevelFromInt(logLevel));
logConfigurator.setUseFileAppender(true);
logConfigurator.setUseLogCatAppender(isConsoleLoggingEnabled());
logConfigurator.setMaxFileSize(getMaxFileSize());
logConfigurator.setMaxBackupSize(maxBackupSize);
// Set log level of a specific logger
// logConfigurator.setLevel("org.apache", Level.ERROR);
logConfigurator.setResetConfiguration(true);
logConfigurator.configure();
}
private static long getMaxFileSize() {
return CompanySettings.getInstance().getValueAsInteger(R.string.max_log_size);
}
private static boolean isConsoleLoggingEnabled() {
return CompanySettings.getInstance().getValueAsBoolean(R.string.consoleLoggingEnabled);
}
private static Level getLevelFromInt(int newLogLevel) {
return logLevelMap.get(newLogLevel);
}
public static String getLogsDirectory() {
if(AppData.getInstance().getContext()!=null)
{ String packageName = AppData.getInstance().getContext().getPackageName();
System.out.println("sundeep package name is not null and it's"+packageName);
return "data/data/" + packageName + "/logs/";
}
return null;
}
public static String getLogFileName() {
return getLogsDirectory() + LOG_FILE_NAME;
}
}
答案 0 :(得分:1)
我强烈建议您使用 SLF4J ,这是log4j的“哥哥”;制作log4j的同一个开发人员制作了SLF4J来解决log4j的缺点。
不同之处在于,虽然log4j是一个成熟的日志框架,但SLF4J是一个直接在Java代码中使用的外观。 Facade方面允许您在运行时插入具体的日志记录实现 - 例如log4j,logback,Android的Log
实用程序等。
它允许您编写可在不同项目之间使用的代码,而无需通过代码并转换日志语句以使用目标项目的日志记录框架。如果你有几千行使用log4j的代码,但你导入它们的目标是使用Apache Commons日志记录,如果手动进行更改,你很快就会发现自己很头疼...即使在一个有能力的IDE。
有一个很棒的Android库可用于登录log4j - 以及许多其他日志框架 - 称为 android-logging-log4j 。查看 very excellent section on "Using log4j over slf4j" ,这是我在Android项目中采用的路线。
以下是我自己的项目中的一些示例,例如我的 Awnry News & Weather app 。 (是的,无耻插头:P)
基本上这些是我在项目的类路径中通常具有的JAR(当然,版本号会随着新版本的出现而变化)。
android-logging-log4j-1.0.3.jar
log4j-1.2.17.jar
slf4j-api-1.7.6.jar
slf4j-log4j12-1.7.6.jar
以下是我在每个需要记录的类中实例化我的常规记录器的方法:
package com.awnry.android.naw;
...
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
public class NawApplication extends Application
{
private static final Logger log = LoggerFactory.getLogger(NawApplication.class);
如您所见,我只引用SLF4J的Logger
和LoggerFactory
接口,即使实际的日志记录最终可能是使用log4j或Android的Log
完成的。
这就是SLF4J外观设计的美妙之处: 您不受任何特定日志记录实施/框架的束缚;您可以在将来改变主意,而无需更改代码行。如果你现在使用log4j而不是SLF4J,但是将来你想要使用Apache Commons Logging框架,你所要做的就是将SLF4J-to-log4j桥转换为SLF4J-to-ACL桥,而不是您的Java代码将更加明智,因为它只调用SLF4J interfaces 。对于接口的代码,而不是实现的历史悠久的格言再次成为现实,而SLF4J就是一个极好的例子。
在我的Application.onCreate()
方法中,我按照以下方式配置我的日志记录:
@Override
public void onCreate()
{
...
String logFile = getFilesDir().getAbsolutePath() + File.separator + "logs" + File.separator + "debug.log";
log.info("Application log file: " + logFile);
LogConfigurator logConfigurator = new LogConfigurator(logFile, Level.TRACE);
logConfigurator.configure();
...
}
我相信这部分实际上是可选的。在我的情况下,我这样做是因为我使用 ACRA library 来帮助捕获意外的程序崩溃并将详细信息报告给我进行调试,因此您可能不需要定义您的android-logging- log4j的LogConfigurator
和我在这里一样。
答案 1 :(得分:0)
为什么使用log4j。 有专门为Android设计的高效Log实用程序。 使用LogCat。它的使用非常简单,并且可以将日志放入您的Android应用程序。