2016-03-23 9 views
0

私はAndroidでlogbackを使用しています。ログディレクトリを電話に応じて動的に変更したいので、コードで設定しています(いくつかの電話機に外部ストレージがあり、他の携帯電話はそうではありませんので、内部のストレージにリダイレクトする必要があります)。ここでAndroidのログバックSizeBasedTriggeringPolicyがトリガーしない

は私の設定コードです:

File logFilesDir = getLogFilesDir(this); 
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); 
lc.reset(); 

RollingFileAppender<ILoggingEvent> fileAppender = null; 
lc.putProperty("LOG_DIR", logFilesDir.getAbsolutePath()); 

PatternLayoutEncoder encoder = new PatternLayoutEncoder(); 
encoder.setContext(lc); 
encoder.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"); 
encoder.start(); 

File logFile = new File(logFilesDir, "MyApplication.log"); 

FixedWindowRollingPolicy rollingPolicy = new FixedWindowRollingPolicy(); 
rollingPolicy.setContext(lc); 
rollingPolicy.setFileNamePattern("${LOG_DIR}/MyApplication.%i.log"); 
rollingPolicy.setMinIndex(1); 
rollingPolicy.setMaxIndex(5); 

SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = new SizeBasedTriggeringPolicy<>(); 
triggeringPolicy.setContext(lc); 
triggeringPolicy.setMaxFileSize("1KB"); // for testing; would otherwise be 5MB 

fileAppender = new RollingFileAppender<>(); 
fileAppender.setContext(lc); 
fileAppender.setFile(logFile.getAbsolutePath()); 
fileAppender.setEncoder(encoder); 
fileAppender.setRollingPolicy(rollingPolicy); 
fileAppender.setTriggeringPolicy(triggeringPolicy); 

rollingPolicy.setParent(fileAppender); 

fileAppender.start(); 
rollingPolicy.start(); 
triggeringPolicy.start(); 

// add the newly created appenders to the root logger; 
// qualify Logger to disambiguate from org.slf4j.Logger 
ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
root.addAppender(fileAppender); 

root.info("----- Application onCreate -----"); 
StatusPrinter.print(lc); 

私のログファイルは、それが失敗した(私のテストケース1キロバイトで)最大ファイルサイズを超えた場合を除いて、ログは正しいフォルダに書き込み、それはすべてOK働いています転がる。代わりに、ファイルは成長し続けるだけです。

StatusPrinter.printは、すべての[OK]を

|-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [assets/logback.xml] 
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[null] - Active log file name: /storage/emulated/0/MyApplication/logs/MyApplication.log 
|-INFO in ch.qos.logback.core.rolling.RollingFileAppender[null] - File property is set to [/storage/emulated/0/MyApplication/logs/MyApplication.log] 
|-INFO in [email protected] - No compression will be used 

のように見える次の出力は、私は私が見つけることができる限り多くの他の同様の問題を見てきましたが、通常の人がRollingFileAppenderを逃すように見えるかない書き込みWRITE_EXTERNAL_STORAGE権限を持っています...私はこれらの事例のどれにでも当てはまるとは思われません。私のコード(通常XMLを使用する人とは違う人)が何か違うのですか?

これを修正したりトラブルシューティングを行うためにできることはありますか?

おかげ

+1

SDカードにファイルを書き込む前に、 ')!=あなたは常に' ContextCompat.checkSelfPermission(のgetContext()、 Manifest.permission.WRITE_EXTERNAL_STORAGE) をチェックする必要があります6.0' 'アンドロイドから、PackageManager.PERMISSION_GRANTED注意してください。 sdcardに書き込むことができない場合は、「実行時にアクセス権を要求しています」というエラーが発生している可能性があります:http://developer.android.com/intl/vi/training/permissions/requesting.html –

+0

Ahhh。私はアンドロイド6の外部ストレージに書き込む問題を持っていましたが、私はそれを並べ替えていませんでした。私はそれに対処します。とにかく、問題は間違いなくアンドロイド5で起こっている –

答えて

0

ロールオーバー時に何が起こるかを見るためにOnConsoleStatusListenerを追加し、私はすぐに問題が何であるかを伝えることはできませんが、それが参考になる:RollingFileAppenderから

LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); 
lc.reset(); 
OnConsoleStatusListener.addNewInstanceToContext(lc); 

ロールオーバーの問題は、一般的に引き起こされます(Issue #117,Issue #110)の絶対パスと相対パスが混在しているか、またはWRITE_EXTERNAL_STORAGEのアクセス許可がありません(これはあなたには当てはまりません)。 OnConsoleStatusListenerからのデバッグ出力は、いくつかの光を放つかもしれません。そうでない場合は、GitHub Issueを作成すると、問題を再現するAndroid Studioプロジェクトでデバッグしようとすることができます。

関連する問題