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の概要

log4j の一種の「兄」であるSLF4Jを使用することを強くお勧めします。log4j を作成したのと同じ開発者が、log4j の欠点に対処するために SLF4J を作成しました。

違いは、log4j が本格的なロギング フレームワークであるのに対し、SLF4J は Java コードで直接使用するファサードであることです。ファサードの側面により、具体的なロギングの実装 (log4j、logback、Android のLogユーティリティなど) を実行時にプラグインできます。

コードを調べたり、ログ ステートメントを変換してターゲット プロジェクトのログ フレームワークを使用したりすることなく、異なるプロジェクト間で使用できるコードを記述できます。log4j を使用する数千行のコードがあるが、それらをインポートするターゲットが Apache Commons ロギングを使用している場合、手動で変更を行うとすぐに頭痛の種になるでしょう...有能なIDE。

Android での log4j の使用

android-logging-log4jと呼ばれる、log4j にログを記録するための優れた Android ライブラリ (および他の多くのログ フレームワーク) があります。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);

ご覧のとおり、実際のログ記録は最終的LoggerLoggerFactoryは log4j または Android のLog.

これが SLF4J のファサード設計の優れた点です。特定のロギングの実装やフレームワークに縛られることはありません。コードを 1 行も変更することなく、後で気が変わっても構いません。現在 SLF4J で log4j を使用していて、将来 Apache Commons Logging フレームワークを使用したい場合は、SLF4J から log4j へのブリッジを SLF4J から ACL へのブリッジに切り替えるだけで済みます。 SLF4Jインターフェイスのみを呼び出すため、Java コードはより賢明になり。実装ではなくインターフェイスにコーディングするという古くからの格言が再び当てはまります。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を使用しているため、これを行います。

于 2014-02-14T11:42:21.760 に答える
0

log4j を使用している理由。Android用に特別に設計された効率的なログユーティリティが利用可能です。LogCat を使用します。非常に使いやすく、Android アプリにログを記録する標準的な方法です。

于 2013-01-02T07:35:06.583 に答える