
Hello Chris, I think logs/yyyy/MM/dd/appname.log structure would be useful for other users as well. Please create an issue and we'll add support for this structure. If you can't wait, you may want to send in a patch as well. Wink, wink. Chris Cheshire wrote:
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 _______________________________________________ Logback-user mailing list Logback-user@qos.ch http://qos.ch/mailman/listinfo/logback-user
-- Ceki Gülcü QOS.ch is looking to hire talented developers located in Switzerland to work on cutting-edge software projects. If you think you are qualified, then please contact ceki@qos.ch.