
I want to configure logback such that logs are written to the directory logs/yyyy/MM/dd/immigrator.log with the directory structure created each day. I have : <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>logs/%d{yyyy/MM/dd/}immigrator.log</FileNamePattern> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>%-25(%date{HH:mm:ss.SSS} [%thread]) %-5level %logger{10} - %msg%n</Pattern> </layout> </appender> The first time the app is run, I see the following : 14:34:13,536 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Adding parent to RollingPolicy: FILE 14:34:13,543 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used 14:34:13,544 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern logs/%d{yyyy/MM/dd/}immigrator.log for the active file 14:34:13,557 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - The date pattern is 'yyyy/MM/dd/' from file name pattern 'logs/%d{yyyy/MM/dd/}immigrator.log'. 14:34:13,557 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Roll-over at midnight. 14:34:13,563 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Generated a new name for RollingFileAppender: logs/2008/08/12/immigrator.log 14:34:13,563 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: logs/2008/08/12/immigrator.log 14:34:13,564 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - setFile(logs/2008/08/12/immigrator.log,true) call failed. java.io.FileNotFoundException: logs/2008/08/12/immigrator.log (No such file or directory) java.io.FileNotFoundException: logs/2008/08/12/immigrator.log (No such file or directory) at java.io.FileOutputStream.openAppend(Native Method) at java.io.FileOutputStream.<init>(FileOutputStream.java:177) at java.io.FileOutputStream.<init>(FileOutputStream.java:102) at ch.qos.logback.core.FileAppender.setFile(FileAppender.java:142) at ch.qos.logback.core.FileAppender.start(FileAppender.java:99) at ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:57) (stack trace truncated for brevity). This creates the directory structure properly, but the initial log file is not created. If I then run the app again, then a log file is created in the date-based directory. If I add a <File>logs/immigrator.log</File> element to the appender, then it creates the log file outside of the date structure and only rolls it at the end of the day. This is not what I want. I want all my log files automatically written to the "logs/yyyy/MM/dd/" directory only, not in a staging area then moved at the end of the day. I tried putting the pattern into the file element but I got a similar exception with logback trying to create the file name exactly as it was specified without expanding the date formats. I looked into using variable substitution but this requires me to set the log directory in the java code itself. I could do this by creating a ${log.dir} system property and having the app create the date based structure before anything else is done, but I don't want to have to do this in every system app I write (this is the route I went with log4j). It would be a lot easier if logback took over this part of things purely in the configuration. Is this possible? Chris