1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender;
18
19 import java.util.HashMap;
20 import java.util.Map;
21 import org.apache.logging.log4j.core.Filter;
22 import org.apache.logging.log4j.core.Layout;
23 import org.apache.logging.log4j.core.config.Configuration;
24 import org.apache.logging.log4j.core.config.plugins.Plugin;
25 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
26 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
27 import org.apache.logging.log4j.core.config.plugins.PluginElement;
28 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
29 import org.apache.logging.log4j.core.layout.PatternLayout;
30 import org.apache.logging.log4j.core.net.Advertiser;
31
32
33
34
35 @Plugin(name = "File", type = "Core", elementType = "appender", printObject = true)
36 public final class FileAppender extends AbstractOutputStreamAppender {
37
38 private final String fileName;
39 private final Advertiser advertiser;
40 private Object advertisement;
41
42 private FileAppender(final String name, final Layout layout, final Filter filter, final FileManager manager,
43 final String filename, final boolean handleException, final boolean immediateFlush, Advertiser advertiser) {
44 super(name, layout, filter, handleException, immediateFlush, manager);
45 if (advertiser != null)
46 {
47 Map<String, String> configuration = new HashMap<String, String>(layout.getContentFormat());
48 configuration.putAll(manager.getContentFormat());
49 configuration.put("contentType", layout.getContentType());
50 configuration.put("name", name);
51 advertisement = advertiser.advertise(configuration);
52 }
53 this.fileName = filename;
54 this.advertiser = advertiser;
55 }
56
57 @Override
58 public void stop() {
59 super.stop();
60 if (advertiser != null) {
61 advertiser.unadvertise(advertisement);
62 }
63 }
64
65
66
67
68
69 public String getFileName() {
70 return this.fileName;
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 @PluginFactory
94 public static FileAppender createAppender(@PluginAttr("fileName") final String fileName,
95 @PluginAttr("append") final String append,
96 @PluginAttr("locking") final String locking,
97 @PluginAttr("name") final String name,
98 @PluginAttr("immediateFlush") final String immediateFlush,
99 @PluginAttr("suppressExceptions") final String suppress,
100 @PluginAttr("bufferedIO") final String bufferedIO,
101 @PluginElement("layout") Layout layout,
102 @PluginElement("filters") final Filter filter,
103 @PluginAttr("advertise") final String advertise,
104 @PluginAttr("advertiseURI") final String advertiseURI,
105 @PluginConfiguration final Configuration config) {
106
107 final boolean isAppend = append == null ? true : Boolean.valueOf(append);
108 final boolean isLocking = locking == null ? false : Boolean.valueOf(locking);
109 boolean isBuffered = bufferedIO == null ? true : Boolean.valueOf(bufferedIO);
110 boolean isAdvertise = advertise == null ? false : Boolean.valueOf(advertise);
111 if (isLocking && isBuffered) {
112 if (bufferedIO != null) {
113 LOGGER.warn("Locking and buffering are mutually exclusive. No buffering will occur for " + fileName);
114 }
115 isBuffered = false;
116 }
117 final boolean isFlush = immediateFlush == null ? true : Boolean.valueOf(immediateFlush);
118 final boolean handleExceptions = suppress == null ? true : Boolean.valueOf(suppress);
119
120 if (name == null) {
121 LOGGER.error("No name provided for FileAppender");
122 return null;
123 }
124
125 if (fileName == null) {
126 LOGGER.error("No filename provided for FileAppender with name " + name);
127 return null;
128 }
129
130 final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBuffered, advertiseURI);
131 if (manager == null) {
132 return null;
133 }
134 if (layout == null) {
135 layout = PatternLayout.createLayout(null, null, null, null);
136 }
137
138 return new FileAppender(name, layout, filter, manager, fileName, handleExceptions, isFlush, isAdvertise ? config.getAdvertiser() : null);
139 }
140 }