【问题标题】:Null pointer exception when calling rollover() on RollingFileAppender在 RollingFileAppender 上调用 rollover() 时出现空指针异常
【发布时间】:2019-06-14 22:18:51
【问题描述】:

我在我的应用程序中使用了一个 log4j logback Logger,它具有基于时间和文件大小的翻转策略(因此文件大小不会超过 10MB,而且我们还会在每个文件上获取新文件日)。我想添加手动翻转到新文件的功能(我们有时会发送日志并希望新日志文件在发送后启动)

private static void configureLogbackDirectly(Activity activity, String macAddress) {
    if(!logDir.exists()){
        if(!logDir.mkdir()){
            Log.e("Logger","unable to create logs folder");
        }
    }

    LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
    context.reset();
    PatternLayoutEncoder logcatEncoder = new PatternLayoutEncoder();
    logcatEncoder.setPattern("[%thread] %-5level %marker: %msg%n");
    logcatEncoder.setContext(context);
    logcatEncoder.start();

    LogcatAppender logcatAppender= new LogcatAppender();
    logcatAppender.setCheckLoggable(true);
    logcatAppender.setEncoder(logcatEncoder);
    logcatAppender.setName(logcatAppenderName);
    logcatAppender.start();

    RollingFileAppender<ILoggingEvent> rollingFileAppender = new ExtraRollingFileAppender();
    rollingFileAppender.setAppend(true);
    rollingFileAppender.setContext(context);
    rollingFileAppender.setName(rolloverAppenderName);

    TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<>();
    SharedPreferences sp = activity.getApplicationContext().getSharedPreferences(activity.getPackageName(), 0);
    String deviceId = myApp.GetDeviceID();
    rollingPolicy.setFileNamePattern(logDir.getAbsolutePath() +"/" + deviceId + "_" + filePrefix + "_%d{yyyyMMdd}.%i.log");
    rollingPolicy.setMaxHistory(21);
    rollingPolicy.setParent(rollingFileAppender);
    rollingPolicy.setContext(context);


    SizeAndTimeBasedFNATP<ILoggingEvent> sizeAndTimeBasedFNATP = new SizeAndTimeBasedFNATP<>();
    sizeAndTimeBasedFNATP.setMaxFileSize(FileSize.valueOf("10MB"));
    sizeAndTimeBasedFNATP.setContext(context);
    sizeAndTimeBasedFNATP.setTimeBasedRollingPolicy(rollingPolicy);

    rollingPolicy.setTimeBasedFileNamingAndTriggeringPolicy(sizeAndTimeBasedFNATP);
    rollingPolicy.start();
    sizeAndTimeBasedFNATP.start();
    rollingFileAppender.setRollingPolicy(rollingPolicy);

    PatternLayoutEncoder encoder = new PatternLayoutEncoder();
    encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %marker: %msg%n");
    encoder.setContext(context);
    encoder.start();

    rollingFileAppender.setEncoder(encoder);
    rollingFileAppender.start();

    ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(LOGGER_NAME);
    root.setLevel(Level.INFO);
    root.addAppender(logcatAppender);
    root.addAppender(rollingFileAppender);


    Logger.logger=root;
}

那么我就有了这个新功能

public static void startNewLogFile() {
    ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger)Logger.logger;
    RollingFileAppender appender = (RollingFileAppender) root.getAppender(rolloverAppenderName);
    if (appender == null) {
        return;
    }
    appender.rollover();
}

但是当我调用新函数时,我收到如下错误:

01-21 07:56:52.824 17816-17816/com.company.Application E/com.Company.APP: [main] ERROR general_logs: uncaughtException: 
    java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.lastIndexOf(int)' on a null object reference
        at ch.qos.logback.core.rolling.helper.FileFilterUtil.afterLastSlash(Unknown Source)
        at ch.qos.logback.core.rolling.TimeBasedRollingPolicy.rollover(Unknown Source)
        at ch.qos.logback.core.rolling.RollingFileAppender.attemptRollover(Unknown Source)
        at ch.qos.logback.core.rolling.RollingFileAppender.rollover(Unknown Source)
        at com.company.Application.logging.Logger.startNewLogFile(Logger.java:125)

我可以看到这个Here 存在问题,但我想知道是否有人为我提供了解决方法

【问题讨论】:

  • 您对此有什么解决办法吗?很奇怪,这么重要的功能怎么会坏掉!!我也面临这个问题
  • 对不起,不,我从来没有找到解决办法,只是继续做其他事情。从这里没有回应,猜想这对其他人来说不是什么大问题,除了你和我:-)

标签: logging logback


【解决方案1】:

即使使用 logback v1.2.3,我也遇到了同样的问题,但是注释有效:

// logback.groovy (part):

file = 'foo.log'

rollingPolicy(SizeAndTimeBasedRollingPolicy) {
  maxFileSize = '1MB'
  fileNamePattern = "foo.%d{yyyy-MM-dd}.%i.log"
  maxHistory = 3
  totalSizeCap = '1GB'
}

//component.rollover()  // leads to NPE: https://stackoverflow.com/q/54291436/1915920

因此,启动时翻转的解决方法可能是像这样使用应用启动时间戳

// logback.groovy (part):

def ts = new Date().format('yyyy-MM-dd.HH-mm-ss')  // workaround to rollover at start: https://stackoverflow.com/q/54291436/1915920
file = "foo.${ts}.log"

rollingPolicy(SizeAndTimeBasedRollingPolicy) {
  maxFileSize = '1MB'
  fileNamePattern = "foo.${ts}.%d{yyyy-MM-dd}.%i.log"
  maxHistory = 3
  totalSizeCap = '1GB'
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多