#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

log4j.rootLogger=DEBUG

log4j.appender.CONS=org.apache.log4j.ConsoleAppender
log4j.appender.CONS.layout=org.apache.log4j.PatternLayout
log4j.appender.CONS.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n

log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FILE.File=../log/james-server.log
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n

log4j.appender.MAILBOXMANAGER=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MAILBOXMANAGER.File=../log/mailboxmanager.log
log4j.appender.MAILBOXMANAGER.DatePattern='.'yyyy-MM-dd
log4j.appender.MAILBOXMANAGER.layout=org.apache.log4j.PatternLayout
log4j.appender.MAILBOXMANAGER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n

log4j.logger.org.apache.xbean.spring=WARN, CONS, FILE
log4j.logger.org.apache.activemq=WARN, CONS, FILE

log4j.logger.org.apache.camel=WARN, CONS, FILE
log4j.logger.org.springframework=WARN, CONS, FILE
log4j.logger.org.apache.james=INFO, CONS, FILE

log4j.logger.james=WARN, CONS, FILE
log4j.logger=DEBUG, CONS, FILE

log4j.logger.james.mailboxmanager=INFO, MAILBOXMANAGER

