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 org.apache.logging.log4j.core.Filter;
20 import org.apache.logging.log4j.core.Layout;
21 import org.apache.logging.log4j.core.config.plugins.Plugin;
22 import org.apache.logging.log4j.core.config.plugins.PluginAttr;
23 import org.apache.logging.log4j.core.config.plugins.PluginElement;
24 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
25 import org.apache.logging.log4j.core.layout.PatternLayout;
26
27
28
29
30 @Plugin(name = "File", type = "Core", elementType = "appender", printObject = true)
31 public final class FileAppender extends AbstractOutputStreamAppender {
32
33 private final String fileName;
34
35 private FileAppender(final String name, final Layout layout, final Filter filter, final FileManager manager,
36 final String filename, final boolean handleException, final boolean immediateFlush) {
37 super(name, layout, filter, handleException, immediateFlush, manager);
38 this.fileName = filename;
39 }
40
41
42
43
44
45 public String getFileName() {
46 return this.fileName;
47 }
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @PluginFactory
67 public static FileAppender createAppender(@PluginAttr("fileName") final String fileName,
68 @PluginAttr("append") final String append,
69 @PluginAttr("locking") final String locking,
70 @PluginAttr("name") final String name,
71 @PluginAttr("immediateFlush") final String immediateFlush,
72 @PluginAttr("suppressExceptions") final String suppress,
73 @PluginAttr("bufferedIO") final String bufferedIO,
74 @PluginElement("layout") Layout layout,
75 @PluginElement("filters") final Filter filter) {
76
77 final boolean isAppend = append == null ? true : Boolean.valueOf(append);
78 final boolean isLocking = locking == null ? false : Boolean.valueOf(locking);
79 boolean isBuffered = bufferedIO == null ? true : Boolean.valueOf(bufferedIO);
80 if (isLocking && isBuffered) {
81 if (bufferedIO != null) {
82 LOGGER.warn("Locking and buffering are mutually exclusive. No buffereing will occur for " + fileName);
83 }
84 isBuffered = false;
85 }
86 final boolean isFlush = immediateFlush == null ? true : Boolean.valueOf(immediateFlush);
87 final boolean handleExceptions = suppress == null ? true : Boolean.valueOf(suppress);
88
89 if (name == null) {
90 LOGGER.error("No name provided for FileAppender");
91 return null;
92 }
93
94 if (fileName == null) {
95 LOGGER.error("No filename provided for FileAppender with name " + name);
96 return null;
97 }
98
99 final FileManager manager = FileManager.getFileManager(fileName, isAppend, isLocking, isBuffered);
100 if (manager == null) {
101 return null;
102 }
103 if (layout == null) {
104 layout = PatternLayout.createLayout(null, null, null, null);
105 }
106 return new FileAppender(name, layout, filter, manager, fileName, handleExceptions, isFlush);
107 }
108 }