1

我正在使用 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;
}
}
4

2 回答 2

1

SLF4J 概述

我强烈推荐你使用SLF4J,它是 log4j 的“老大哥”;制作 log4j 的开发人员制作了 SLF4J 来解决 log4j 的缺点。

不同之处在于,log4j 是一个成熟的日志框架,而 SLF4J 是一个外观,您可以直接在 Java 代码中使用它。外观方面允许您在运行时插入具体的日志记录实现——例如 log4j、logback、Android 的Log实用程序等。

它允许您编写可在不同项目之间使用的代码,而无需遍历您的代码并将您的日志语句转换为使用目标项目的日志框架。如果您有几千行使用 log4j 的代码,但您将它们导入到的目标使用 Apache Commons 日志记录,那么如果您手动进行更改,您很快就会发现自己很头疼……即使有帮助有能力的IDE。

在 Android 中使用 log4j

有一个很棒的 Android 库用于记录到 log4j——以及许多其他的记录框架——称为android-logging-log4j。查看“在 slf4j 上使用 log4j非常出色的部分,这是我在 Android 项目中采用的路线。


我自己项目的例子

以下是我自己的项目中的一些示例,例如我的Awnry News & Weather 应用程序。(是的,无耻的插件:P)

类路径上所需的 JAR

基本上这些是我通常会在我的项目的类路径中拥有的 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);

如您所见,我仅引用 SLF4JLoggerLoggerFactory接口,即使实际的日志记录最终可能会使用 log4j 或 Android 的Log.

这就是 SLF4J 外观设计的美妙之处:您不受任何特定日志实现/框架的束缚;您将来可以改变主意,而无需更改一行代码。如果您现在在 SLF4J 上使用 log4j,但将来您想使用 Apache Commons Logging 框架,您所要做的就是将 SLF4J-to-log4j 桥切换到 SLF4J-to-ACL 桥,并且没有您的 Java 代码会更明智,因为它只调用 SLF4J接口对接口而不是实现进行编码的古老格言再次适用,SLF4J 就是一个极好的例子。

配置 Android 应用的日志记录

在我的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 库来帮助捕获意外的程序崩溃并将详细信息报告给我以进行调试,因此您可能不需要LogConfigurator像我在这里那样定义您的 android-logging-log4j。

于 2014-02-14T11:42:21.760 回答
0

为什么你使用 log4j。有专门为android设计的高效日志实用程序。使用 LogCat。它使用起来非常简单,并且是在您的 android 应用程序中输入日志的标准方式。

于 2013-01-02T07:35:06.583 回答