下面列出了org.apache.logging.log4j.core.appender.rolling.TimeBasedTriggeringPolicy#org.apache.logging.log4j.core.appender.RollingFileAppender 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@SuppressWarnings({"rawtypes", "unchecked"})
private static void createAppenderAndStart(String loggerName, String fileName, String filePattern) {
Layout layout = PatternLayout.newBuilder().withConfiguration(config)
.withPattern("[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n").build();
TimeBasedTriggeringPolicy tbtp = TimeBasedTriggeringPolicy.createPolicy(null, null);
TriggeringPolicy tp = SizeBasedTriggeringPolicy.createPolicy("10M");
CompositeTriggeringPolicy policyComposite = CompositeTriggeringPolicy.createPolicy(tbtp, tp);
String loggerDir = datalogDir + File.separator;
String loggerPathPrefix = loggerDir + File.separator;
RollingFileAppender.Builder builder = RollingFileAppender.newBuilder().withFilePattern(filePattern)
.withStrategy(null).withPolicy(policyComposite).withConfiguration(config);
RollingFileAppender appender = builder.build();
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef(loggerName, Level.INFO, null);
AppenderRef[] refs = new AppenderRef[] {ref};
LoggerConfig loggerConfig =
LoggerConfig.createLogger(false, Level.ALL, loggerName, "true", refs, null, config, null);
loggerConfig.addAppender(appender, null, null);
config.addLogger(loggerName, loggerConfig);
ctx.updateLoggers();
}
@Test
void testSoutPlainTextTempJson() {
Configuration configuration = getLogConfig(Map.of());
assertThat(configuration.getAppenders().values()).hasSize(2);
Optional<ConsoleAppender> consoleAppender = configuration.getAppenders().values().stream()
.filter(ConsoleAppender.class::isInstance)
.map(ConsoleAppender.class::cast)
.findAny();
assertThat(consoleAppender).isNotEmpty();
assertThat(consoleAppender.get().getLayout()).isInstanceOf(PatternLayout.class);
Optional<RollingFileAppender> fileAppender = configuration.getAppenders().values().stream()
.filter(RollingFileAppender.class::isInstance)
.map(RollingFileAppender.class::cast)
.findAny();
assertThat(fileAppender).isNotEmpty();
assertThat(fileAppender.get().getLayout()).isInstanceOf(EcsLayout.class);
}
@Test
void testSoutJsonTempJson() {
Configuration configuration = getLogConfig(Map.of("log_format_sout", "json"));
assertThat(configuration.getAppenders().values()).hasSize(2);
Optional<ConsoleAppender> consoleAppender = configuration.getAppenders().values().stream()
.filter(ConsoleAppender.class::isInstance)
.map(ConsoleAppender.class::cast)
.findAny();
assertThat(consoleAppender).isNotEmpty();
assertThat(consoleAppender.get().getLayout()).isInstanceOf(EcsLayout.class);
Optional<RollingFileAppender> fileAppender = configuration.getAppenders().values().stream()
.filter(RollingFileAppender.class::isInstance)
.map(RollingFileAppender.class::cast)
.findAny();
assertThat(fileAppender).isNotEmpty();
assertThat(fileAppender.get().getLayout()).isInstanceOf(EcsLayout.class);
}
/**
* Configures rolling file loggers.
*
* @param filename the filename to output logging to.
* @param loggers the logger names.
*/
private void configureLoggers( String filename, List<String> loggers )
{
String file = getLogFile( filename );
RollingFileAppender appender = getRollingFileAppender( file );
getLogConfiguration().addAppender( appender );
AppenderRef[] refs = createAppenderRef( "Ref_" + filename );
for ( String loggerName : loggers )
{
LoggerConfig loggerConfig = LoggerConfig.createLogger( true, Level.INFO, loggerName, "true", refs, null,
getLogConfiguration(), null );
loggerConfig.addAppender(appender, null, null);
getLogConfiguration().addLogger(loggerName, loggerConfig);
log.info( "Added logger: " + loggerName + " using file: " + file );
}
}
/**
* Returns a rolling file appender.
*
* @param file the file to output to, including path and filename.
*/
private RollingFileAppender getRollingFileAppender( String file )
{
RollingFileAppender appender = RollingFileAppender.newBuilder().withFileName( file )
.setName("appender_" + file)
.withFilePattern( file + "%i")
.setLayout( PATTERN_LAYOUT )
.withPolicy(
SizeBasedTriggeringPolicy.createPolicy( config.getProperty( ConfigurationKey.LOGGING_FILE_MAX_SIZE ) ) )
.withStrategy( DefaultRolloverStrategy.newBuilder()
.withMax( config.getProperty( ConfigurationKey.LOGGING_FILE_MAX_ARCHIVES ) ).build() )
.build();
appender.start();
return appender;
}
@Test
public void testSystemProperties1() throws Exception {
final String tempFileName = System.getProperty("java.io.tmpdir") + "/hadoop.log";
final Path tempFilePath = new File(tempFileName).toPath();
Files.deleteIfExists(tempFilePath);
try {
final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-1.properties");
final RollingFileAppender appender = configuration.getAppender("RFA");
appender.stop(10, TimeUnit.SECONDS);
System.out.println("expected: " + tempFileName + " Actual: " + appender.getFileName());
assertEquals(tempFileName, appender.getFileName());
} finally {
try {
Files.deleteIfExists(tempFilePath);
} catch (final FileSystemException e) {
e.printStackTrace();
}
}
}
private void testRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException {
final Configuration configuration = getConfiguration(configResource);
final Appender appender = configuration.getAppender(name);
assertNotNull(appender);
assertEquals(name, appender.getName());
assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
final RollingFileAppender rfa = (RollingFileAppender) appender;
assertEquals("target/hadoop.log", rfa.getFileName());
assertEquals(filePattern, rfa.getFilePattern());
final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
assertNotNull(triggeringPolicy);
assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
assertEquals(1, triggeringPolicies.length);
final TriggeringPolicy tp = triggeringPolicies[0];
assertTrue(tp.getClass().getName(), tp instanceof SizeBasedTriggeringPolicy);
final SizeBasedTriggeringPolicy sbtp = (SizeBasedTriggeringPolicy) tp;
assertEquals(256 * 1024 * 1024, sbtp.getMaxFileSize());
final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
assertEquals(20, drs.getMaxIndex());
configuration.start();
configuration.stop();
}
private void testDailyRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException {
final Configuration configuration = getConfiguration(configResource);
final Appender appender = configuration.getAppender(name);
assertNotNull(appender);
assertEquals(name, appender.getName());
assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
final RollingFileAppender rfa = (RollingFileAppender) appender;
assertEquals("target/hadoop.log", rfa.getFileName());
assertEquals(filePattern, rfa.getFilePattern());
final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
assertNotNull(triggeringPolicy);
assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
assertEquals(1, triggeringPolicies.length);
final TriggeringPolicy tp = triggeringPolicies[0];
assertTrue(tp.getClass().getName(), tp instanceof TimeBasedTriggeringPolicy);
final TimeBasedTriggeringPolicy tbtp = (TimeBasedTriggeringPolicy) tp;
assertEquals(1, tbtp.getInterval());
final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
assertEquals(Integer.MAX_VALUE, drs.getMaxIndex());
configuration.start();
configuration.stop();
}
@Test
public void testSystemProperties1() throws Exception {
final String tempFileName = System.getProperty("java.io.tmpdir") + "/hadoop.log";
final Path tempFilePath = new File(tempFileName).toPath();
Files.deleteIfExists(tempFilePath);
try {
final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-1.properties");
final RollingFileAppender appender = configuration.getAppender("RFA");
appender.stop(10, TimeUnit.SECONDS);
// System.out.println("expected: " + tempFileName + " Actual: " + appender.getFileName());
assertEquals(tempFileName, appender.getFileName());
} finally {
try {
Files.deleteIfExists(tempFilePath);
} catch (final FileSystemException e) {
e.printStackTrace();
}
}
}
private void testRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException {
final Configuration configuration = getConfiguration(configResource);
final Appender appender = configuration.getAppender(name);
assertNotNull(appender);
assertEquals(name, appender.getName());
assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
final RollingFileAppender rfa = (RollingFileAppender) appender;
assertEquals("target/hadoop.log", rfa.getFileName());
assertEquals(filePattern, rfa.getFilePattern());
final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
assertNotNull(triggeringPolicy);
assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
assertEquals(1, triggeringPolicies.length);
final TriggeringPolicy tp = triggeringPolicies[0];
assertTrue(tp.getClass().getName(), tp instanceof SizeBasedTriggeringPolicy);
final SizeBasedTriggeringPolicy sbtp = (SizeBasedTriggeringPolicy) tp;
assertEquals(256 * 1024 * 1024, sbtp.getMaxFileSize());
final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
assertEquals(20, drs.getMaxIndex());
configuration.start();
configuration.stop();
}
private void testDailyRollingFileAppender(final String configResource, final String name, final String filePattern) throws URISyntaxException {
final Configuration configuration = getConfiguration(configResource);
final Appender appender = configuration.getAppender(name);
assertNotNull(appender);
assertEquals(name, appender.getName());
assertTrue(appender.getClass().getName(), appender instanceof RollingFileAppender);
final RollingFileAppender rfa = (RollingFileAppender) appender;
assertEquals("target/hadoop.log", rfa.getFileName());
assertEquals(filePattern, rfa.getFilePattern());
final TriggeringPolicy triggeringPolicy = rfa.getTriggeringPolicy();
assertNotNull(triggeringPolicy);
assertTrue(triggeringPolicy.getClass().getName(), triggeringPolicy instanceof CompositeTriggeringPolicy);
final CompositeTriggeringPolicy ctp = (CompositeTriggeringPolicy) triggeringPolicy;
final TriggeringPolicy[] triggeringPolicies = ctp.getTriggeringPolicies();
assertEquals(1, triggeringPolicies.length);
final TriggeringPolicy tp = triggeringPolicies[0];
assertTrue(tp.getClass().getName(), tp instanceof TimeBasedTriggeringPolicy);
final TimeBasedTriggeringPolicy tbtp = (TimeBasedTriggeringPolicy) tp;
assertEquals(1, tbtp.getInterval());
final RolloverStrategy rolloverStrategy = rfa.getManager().getRolloverStrategy();
assertTrue(rolloverStrategy.getClass().getName(), rolloverStrategy instanceof DefaultRolloverStrategy);
final DefaultRolloverStrategy drs = (DefaultRolloverStrategy) rolloverStrategy;
assertEquals(Integer.MAX_VALUE, drs.getMaxIndex());
configuration.start();
configuration.stop();
}
/**
* Not a real test, just make sure we can compile access to the typed manager.
*
* @throws IOException
*/
@Test
public void testAccessManagerWithBuilder() throws IOException {
try (final LoggerContext ctx = LoggerContext.getContext(false)) {
final Configuration config = ctx.getConfiguration();
final File file = File.createTempFile("RollingFileAppenderAccessTest", ".tmp");
file.deleteOnExit();
// @formatter:off
final RollingFileAppender appender = RollingFileAppender.newBuilder()
.setFileName(file.getCanonicalPath())
.setFilePattern("FilePattern")
.setName("Name")
.setPolicy(OnStartupTriggeringPolicy.createPolicy(1))
.setConfiguration(config)
.build();
// @formatter:on
final RollingFileManager manager = appender.getManager();
// Since the RolloverStrategy and TriggeringPolicy are immutable, we could also use generics to type their
// access.
Assert.assertNotNull(manager.getRolloverStrategy());
Assert.assertNotNull(manager.getTriggeringPolicy());
}
}
/**
* Not a real test, just make sure we can compile access to the typed manager.
*
* @throws IOException
*/
@Test
public void testAccessManagerWithStrings() throws IOException {
try (final LoggerContext ctx = LoggerContext.getContext(false)) {
final Configuration config = ctx.getConfiguration();
final File file = File.createTempFile("RollingFileAppenderAccessTest", ".tmp");
file.deleteOnExit();
// @formatter:off
final RollingFileAppender appender = RollingFileAppender.newBuilder()
.setFileName(file.getCanonicalPath())
.setFilePattern("FilePattern")
.setName("Name")
.setPolicy(OnStartupTriggeringPolicy.createPolicy(1))
.setConfiguration(config)
.build();
// @formatter:on
final RollingFileManager manager = appender.getManager();
// Since the RolloverStrategy and TriggeringPolicy are immutable, we could also use generics to type their
// access.
Assert.assertNotNull(manager.getRolloverStrategy());
Assert.assertNotNull(manager.getTriggeringPolicy());
}
}
private Appender getAppender(LogConfig abyLogConfig, Configuration config, Appender appenderCfg) {
Appender appender = null;
if (appenderCfg instanceof RollingFileAppender) {
RollingFileAppender rollingFileAppender = (RollingFileAppender) appenderCfg;
appender = RollingFileAppender.newBuilder()
.setConfiguration(config)
.withName(appenderCfg.getName().replace(abyLogConfig.getAppenderNameKey(), abyLogConfig.getName()))
.withFileName(rollingFileAppender.getFileName().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName()))
.withFilePattern(rollingFileAppender.getFilePattern().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName()))
.withLayout(rollingFileAppender.getLayout())
.withFilter(rollingFileAppender.getFilter())
.withPolicy(rollingFileAppender.getTriggeringPolicy())
.withStrategy(rollingFileAppender.getManager().getRolloverStrategy())
.build();
} else if (appenderCfg instanceof FileAppender) {
FileAppender fileAppender = (FileAppender) appenderCfg;
appender = FileAppender.newBuilder()
.setConfiguration(config)
.withName(appenderCfg.getName().replace(abyLogConfig.getAppenderNameKey(), abyLogConfig.getName()))
.withFileName(fileAppender.getFileName().replaceAll(abyLogConfig.getFileNameKey(), abyLogConfig.getFileName()))
.withLayout(fileAppender.getLayout())
.withFilter(fileAppender.getFilter())
.build();
} else {
LogManager.getLogger(LogFactory.class).warn("unsupported appender type ,appender type not in(RollingFileAppender,ConsoleAppender,FileAppender)", appenderCfg.getClass());
}
if (appender != null) {
if (!appender.isStarted()) {
appender.start();
}
config.addAppender(appender);
}
return appender;
}
private Appender getAppender(String clKey, Configuration config, Appender appenderCfg) {
Appender appender = null;
if (appenderCfg instanceof RollingFileAppender) {
RollingFileAppender rollingFileAppender = (RollingFileAppender) appenderCfg;
appender = RollingFileAppender.newBuilder()
.setConfiguration(config)
.withName(clKey)
.withFileName(rollingFileAppender.getFileName())
.withFilePattern(rollingFileAppender.getFilePattern())
.withLayout(rollingFileAppender.getLayout())
.withFilter(rollingFileAppender.getFilter())
.withPolicy(rollingFileAppender.getTriggeringPolicy())
.withStrategy(rollingFileAppender.getManager().getRolloverStrategy())
.build();
} else if (appenderCfg instanceof FileAppender) {
FileAppender fileAppender = (FileAppender) appenderCfg;
appender = FileAppender.newBuilder()
.setConfiguration(config)
.withName(appenderCfg.getName())
.withFileName(fileAppender.getFileName())
.withLayout(fileAppender.getLayout())
.withFilter(fileAppender.getFilter())
.build();
} else {
LogManager.getLogger(LogFactory.class).warn("unsupported appender type ,appender type not in(RollingFileAppender,ConsoleAppender,FileAppender)", appenderCfg.getClass());
}
if (appender != null) {
config.addAppender(appender);
}
return appender;
}
@Test
void testLogFileJson(@TempDir Path tempDir) {
String logFile = tempDir.resolve("agent.json").toString();
Configuration configuration = getLogConfig(Map.of("log_file", logFile, "log_format_file", "json"));
assertThat(configuration.getAppenders().values()).hasSize(1);
Appender appender = configuration.getAppenders().values().iterator().next();
assertThat(appender).isInstanceOf(RollingFileAppender.class);
assertThat(((RollingFileAppender) appender).getFileName()).isEqualTo(logFile);
assertThat(appender.getLayout()).isInstanceOf(EcsLayout.class);
}
@Test
void testLogFilePlainText(@TempDir Path tempDir) {
String logFile = tempDir.resolve("agent.log").toString();
Configuration configuration = getLogConfig(Map.of("log_file", logFile));
assertThat(configuration.getAppenders().values()).hasSize(1);
Appender appender = configuration.getAppenders().values().iterator().next();
assertThat(appender).isInstanceOf(RollingFileAppender.class);
assertThat(((RollingFileAppender) appender).getFileName()).isEqualTo(logFile);
assertThat(appender.getLayout()).isInstanceOf(PatternLayout.class);
}
private void rollover(Logger logger) {
Map<String, Appender> appenders = ((org.apache.logging.log4j.core.Logger) logger).getAppenders();
for (Map.Entry<String, Appender> stringAppenderEntry : appenders.entrySet()) {
Appender appender = stringAppenderEntry.getValue();
if (appender instanceof RollingFileAppender) {
((RollingFileAppender) appender).getManager().rollover();
}
}
}
/**
* Configures a root file logger.
*
* @param filename the filename to output logging to.
*/
private void configureRootLogger( String filename )
{
String file = getLogFile( filename );
RollingFileAppender appender = getRollingFileAppender( file );
getLogConfiguration().addAppender( appender );
getLogConfiguration().getRootLogger().addAppender( getLogConfiguration().getAppender( appender.getName() ),
Level.INFO, null );
log.info( "Added root logger using file: " + file );
}
/** {@inheritDoc} */
@Nullable @Override public String fileName() {
for (Logger log = impl; log != null; log = log.getParent()) {
for (Appender a : log.getAppenders().values()) {
if (a instanceof FileAppender)
return ((FileAppender)a).getFileName();
if (a instanceof RollingFileAppender)
return ((RollingFileAppender)a).getFileName();
if (a instanceof RoutingAppender) {
try {
RoutingAppender routing = (RoutingAppender)a;
Field appsFiled = routing.getClass().getDeclaredField("appenders");
appsFiled.setAccessible(true);
Map<String, AppenderControl> appenders = (Map<String, AppenderControl>)appsFiled.get(routing);
for (AppenderControl control : appenders.values()) {
Appender innerApp = control.getAppender();
if (innerApp instanceof FileAppender)
return normalize(((FileAppender)innerApp).getFileName());
if (innerApp instanceof RollingFileAppender)
return normalize(((RollingFileAppender)innerApp).getFileName());
}
}
catch (IllegalAccessException | NoSuchFieldException e) {
error("Failed to get file name (was the implementation of log4j2 changed?).", e);
}
}
}
}
return null;
}
private void buildDailyRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder
.addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
builder.add(appenderBuilder);
}
private void buildRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies").addComponent(
builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder.addComponent(
builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
builder.add(appenderBuilder);
}
private <T extends Log4j1Configuration> Appender createAppender(final String name, final Layout layout,
final Filter filter, final String fileName, final boolean append, boolean immediateFlush,
final String level, final boolean bufferedIo, final int bufferSize, final T configuration) {
org.apache.logging.log4j.core.Layout<?> fileLayout = null;
if (bufferedIo) {
immediateFlush = true;
}
if (layout instanceof LayoutWrapper) {
fileLayout = ((LayoutWrapper) layout).getLayout();
} else if (layout != null) {
fileLayout = new LayoutAdapter(layout);
}
org.apache.logging.log4j.core.Filter fileFilter = buildFilters(level, filter);
if (fileName == null) {
LOGGER.warn("Unable to create File Appender, no file name provided");
return null;
}
String filePattern = fileName +"%d{yyy-MM-dd}";
TriggeringPolicy policy = TimeBasedTriggeringPolicy.newBuilder().setModulate(true).build();
RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
.setConfig(configuration)
.setMax(Integer.toString(Integer.MAX_VALUE))
.build();
return new AppenderWrapper(RollingFileAppender.newBuilder()
.setName(name)
.setConfiguration(configuration)
.setLayout(fileLayout)
.setFilter(fileFilter)
.setFileName(fileName)
.setBufferSize(bufferSize)
.setImmediateFlush(immediateFlush)
.setFilePattern(filePattern)
.setPolicy(policy)
.setStrategy(strategy)
.build());
}
private Appender createAppender(final String name, final Log4j1Configuration config, final Layout layout,
final Filter filter, final boolean bufferedIo, boolean immediateFlush, final String fileName,
final String level, final String maxSize, final String maxBackups) {
org.apache.logging.log4j.core.Layout<?> fileLayout = null;
if (bufferedIo) {
immediateFlush = true;
}
if (layout instanceof LayoutWrapper) {
fileLayout = ((LayoutWrapper) layout).getLayout();
} else if (layout != null) {
fileLayout = new LayoutAdapter(layout);
}
org.apache.logging.log4j.core.Filter fileFilter = buildFilters(level, filter);
if (fileName == null) {
LOGGER.warn("Unable to create File Appender, no file name provided");
return null;
}
String filePattern = fileName +"%d{yyy-MM-dd}";
TriggeringPolicy timePolicy = TimeBasedTriggeringPolicy.newBuilder().setModulate(true).build();
SizeBasedTriggeringPolicy sizePolicy = SizeBasedTriggeringPolicy.createPolicy(maxSize);
CompositeTriggeringPolicy policy = CompositeTriggeringPolicy.createPolicy(sizePolicy, timePolicy);
RolloverStrategy strategy = DefaultRolloverStrategy.newBuilder()
.setConfig(config)
.setMax(maxBackups)
.build();
return new AppenderWrapper(RollingFileAppender.newBuilder()
.setName(name)
.setConfiguration(config)
.setLayout(fileLayout)
.setFilter(fileFilter)
.setBufferedIo(bufferedIo)
.setImmediateFlush(immediateFlush)
.setFileName(fileName)
.setFilePattern(filePattern)
.setPolicy(policy)
.setStrategy(strategy)
.build());
}
private void buildDailyRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
final String datePattern = getLog4jAppenderValue(appenderName, "DatePattern", fileName + "'.'yyyy-MM-dd");
appenderBuilder.addAttribute("filePattern", fileName + "%d{" + datePattern + "}");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies")
.addComponent(builder.newComponent("TimeBasedTriggeringPolicy").addAttribute("modulate", true));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder
.addComponent(builder.newComponent("DefaultRolloverStrategy").addAttribute("max", Integer.MAX_VALUE));
builder.add(appenderBuilder);
}
private void buildRollingFileAppender(final String appenderName) {
final AppenderComponentBuilder appenderBuilder = builder.newAppender(appenderName,
RollingFileAppender.PLUGIN_NAME);
buildFileAppender(appenderName, appenderBuilder);
final String fileName = getLog4jAppenderValue(appenderName, "File");
appenderBuilder.addAttribute("filePattern", fileName + ".%i");
final String maxFileSizeString = getLog4jAppenderValue(appenderName, "MaxFileSize", "10485760");
final String maxBackupIndexString = getLog4jAppenderValue(appenderName, "MaxBackupIndex", "1");
final ComponentBuilder<?> triggeringPolicy = builder.newComponent("Policies").addComponent(
builder.newComponent("SizeBasedTriggeringPolicy").addAttribute("size", maxFileSizeString));
appenderBuilder.addComponent(triggeringPolicy);
appenderBuilder.addComponent(
builder.newComponent("DefaultRolloverStrategy").addAttribute("max", maxBackupIndexString));
builder.add(appenderBuilder);
}
@Test
public void testSystemProperties2() throws Exception {
final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-2.properties");
final RollingFileAppender appender = configuration.getAppender("RFA");
assertEquals("${java.io.tmpdir}/hadoop.log", appender.getFileName());
appender.stop(10, TimeUnit.SECONDS);
Path path = new File(appender.getFileName()).toPath();
Files.deleteIfExists(path);
path = new File("${java.io.tmpdir}").toPath();
Files.deleteIfExists(path);
}
@Test
public void testSystemProperties2() throws Exception {
final Configuration configuration = getConfiguration("config-1.2/log4j-system-properties-2.properties");
final RollingFileAppender appender = configuration.getAppender("RFA");
assertEquals("${java.io.tmpdir}/hadoop.log", appender.getFileName());
appender.stop(10, TimeUnit.SECONDS);
Path path = new File(appender.getFileName()).toPath();
Files.deleteIfExists(path);
path = new File("${java.io.tmpdir}").toPath();
Files.deleteIfExists(path);
}
private void testBuilder() {
// @formatter:off
final RollingFileAppender raf = RollingFileAppender.newBuilder()
.setName("test1")
.setFileName("target/testcmd1.log")
.setFilePattern("target/testcmd1.log.%d{yyyy-MM-dd}")
.setPolicy(createPolicy())
.setStrategy(createStrategy())
.setConfiguration(configuration)
.build();
// @formatter:on
Assert.assertNotNull(raf);
}
@Test
public void testDefaultLayout() throws Exception {
// @formatter:off
Assert.assertNotNull(RollingFileAppender.newBuilder()
.setName(RollingFileAppenderLayoutTest.class.getName())
.setConfiguration(new DefaultConfiguration())
.setFileName("log.txt")
.setFilePattern("FilePattern")
.setPolicy(OnStartupTriggeringPolicy.createPolicy(1))
.setCreateOnDemand(true) // no need to clutter up test folder with another file
.build().getLayout());
// @formatter:on
}