1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender.rolling;
18
19 import java.lang.reflect.Method;
20
21 import org.apache.logging.log4j.core.Core;
22 import org.apache.logging.log4j.core.LogEvent;
23 import org.apache.logging.log4j.core.config.plugins.Plugin;
24 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
25 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
26 import org.apache.logging.log4j.core.util.Loader;
27 import org.apache.logging.log4j.status.StatusLogger;
28
29
30
31
32 @Plugin(name = "OnStartupTriggeringPolicy", category = Core.CATEGORY_NAME, printObject = true)
33 public class OnStartupTriggeringPolicy extends AbstractTriggeringPolicy {
34
35 private static final long JVM_START_TIME = initStartTime();
36
37 private final long minSize;
38
39 private OnStartupTriggeringPolicy(final long minSize) {
40 this.minSize = minSize;
41 }
42
43
44
45
46
47 private static long initStartTime() {
48
49
50
51
52
53
54 try {
55 final Class<?> factoryClass = Loader.loadSystemClass("java.lang.management.ManagementFactory");
56 final Method getRuntimeMXBean = factoryClass.getMethod("getRuntimeMXBean");
57 final Object runtimeMXBean = getRuntimeMXBean.invoke(null);
58
59 final Class<?> runtimeMXBeanClass = Loader.loadSystemClass("java.lang.management.RuntimeMXBean");
60 final Method getStartTime = runtimeMXBeanClass.getMethod("getStartTime");
61 final Long result = (Long) getStartTime.invoke(runtimeMXBean);
62
63 return result;
64 } catch (final Throwable t) {
65 StatusLogger.getLogger().error("Unable to call ManagementFactory.getRuntimeMXBean().getStartTime(), "
66 + "using system time for OnStartupTriggeringPolicy", t);
67
68 return System.currentTimeMillis();
69 }
70 }
71
72
73
74
75
76 @Override
77 public void initialize(final RollingFileManager manager) {
78 if (manager.getFileTime() < JVM_START_TIME && manager.getFileSize() >= minSize) {
79 StatusLogger.getLogger().debug("Initiating rollover at startup");
80 if (minSize == 0) {
81 manager.setRenameEmptyFiles(true);
82 }
83 manager.skipFooter(true);
84 manager.rollover();
85 manager.skipFooter(false);
86 }
87 }
88
89
90
91
92
93
94 @Override
95 public boolean isTriggeringEvent(final LogEvent event) {
96 return false;
97 }
98
99 @Override
100 public String toString() {
101 return "OnStartupTriggeringPolicy";
102 }
103
104 @PluginFactory
105 public static OnStartupTriggeringPolicy createPolicy(
106 @PluginAttribute(value = "minSize", defaultLong = 1) final long minSize) {
107 return new OnStartupTriggeringPolicy(minSize);
108 }
109 }