# 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=info, R

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=build/test-integration.log

log4j.appender.R.MaxFileSize=1000KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=5

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d [%t] %-5p %c - %m%n

log4j.logger.org.apache.poi.poifs.nio.FileBackedDataSource=ERROR
log4j.logger.org.apache.poi.hdgf.chunks.Chunk=FATAL
log4j.logger.org.apache.poi.hpsf.CodePageString=ERROR
log4j.logger.org.apache.poi.hdgf.chunks.ChunkFactory=ERROR
log4j.logger.org.apache.poi.hslf.model.textproperties.BitMaskTextProp=ERROR
log4j.logger.org.apache.poi.util.JvmBugs=ERROR
log4j.logger.org.apache.poi.hslf.usermodel.HSLFTextParagraph=ERROR
log4j.logger.org.apache.poi.openxml4j.opc.ZipPackage=ERROR
log4j.logger.org.apache.poi.POIDocument=WARN
log4j.logger.org.apache.poi.openxml4j.opc.OPCPackage=ERROR
log4j.logger.org.apache.poi.xssf.usermodel.XSSFWorkbook=ERROR
log4j.logger.org.apache.poi.hslf.usermodel.HSLFGroupShape=WARN
log4j.logger.org.apache.poi.hslf.record.Record=ERROR