View Javadoc
1   /*
2    * Licensed under the GPL License. You may not use this file except in compliance with the License.
3    * You may obtain a copy of the License at
4    *
5    *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6    *
7    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8    * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9    * PURPOSE.
10   */
11  package psiprobe.tools.logging.log4j2;
12  
13  import java.io.File;
14  import java.nio.file.Path;
15  
16  import psiprobe.tools.logging.AbstractLogDestination;
17  
18  /**
19   * The Class Log4J2AppenderAccessor.
20   */
21  public class Log4J2AppenderAccessor extends AbstractLogDestination {
22  
23    /** The logger accessor. */
24    private Log4J2LoggerConfigAccessor loggerAccessor;
25  
26    /**
27     * Gets the logger accessor.
28     *
29     * @return the logger accessor
30     */
31    public Log4J2LoggerConfigAccessor getLoggerAccessor() {
32      return loggerAccessor;
33    }
34  
35    /**
36     * Sets the logger accessor.
37     *
38     * @param loggerAccessor the new logger accessor
39     */
40    public void setLoggerAccessor(Log4J2LoggerConfigAccessor loggerAccessor) {
41      this.loggerAccessor = loggerAccessor;
42    }
43  
44    @Override
45    public boolean isContext() {
46      return getLoggerAccessor().isContext();
47    }
48  
49    @Override
50    public boolean isRoot() {
51      return getLoggerAccessor().isRoot();
52    }
53  
54    @Override
55    public String getName() {
56      return getLoggerAccessor().getName();
57    }
58  
59    @Override
60    public String getLogType() {
61      return "log4j2";
62    }
63  
64    @Override
65    public String getIndex() {
66      return (String) invokeMethod(getTarget(), "getName", null, null);
67    }
68  
69    @Override
70    public String getConversionPattern() {
71      Object layout = invokeMethod(getTarget(), "getLayout", null, null);
72      if (layout != null && "org.apache.logging.log4j.core.layout.PatternLayout"
73          .equals(layout.getClass().getName())) {
74        return (String) invokeMethod(layout, "getConversionPattern", null, null);
75      }
76      return null;
77    }
78  
79    @Override
80    public File getFile() {
81      String fileName = (String) getProperty(getTarget(), "fileName", null);
82      if (fileName != null) {
83        return Path.of(fileName).toFile();
84      }
85      // Check for SMTPAppender information
86      File result = null;
87      if ("org.apache.logging.log4j.core.appender.SmtpAppender"
88          .equals(getTarget().getClass().getName())) {
89        Object smtpManager = getProperty(getTarget(), "manager", null, true);
90        Object factoryData = getProperty(smtpManager, "data", null, true);
91        Object cc = getProperty(factoryData, "cc", null, true);
92        Object bcc = getProperty(factoryData, "bcc", null, true);
93        Object from = getProperty(factoryData, "from", null, true);
94        Object subjectSerializer = getProperty(factoryData, "subject", null, true);
95        String subject = null;
96        if (subjectSerializer != null) {
97          Object[] subjectFormatters =
98              (Object[]) getProperty(subjectSerializer, "formatters", null, true);
99          if (subjectFormatters != null) {
100           Object subjectFormatterConverter =
101               getProperty(subjectFormatters[0], "converter", null, true);
102           if (subjectFormatterConverter != null) {
103             subject = (String) getProperty(subjectFormatterConverter, "literal", null, true);
104           }
105         }
106       }
107       result = Path
108           .of("mailto:" + getProperty(factoryData, "to", "", true)
109               + (from != null ? "&from=" + from : "") + (cc != null ? "&cc=" + cc : "")
110               + (bcc != null ? "&bcc=" + bcc : "") + (subject != null ? "&subject=" + subject : ""))
111           .toFile();
112     } else {
113       result = getStdoutFile();
114     }
115     return result;
116   }
117 
118   @Override
119   public String getLevel() {
120     return getLoggerAccessor().getLevel();
121   }
122 
123   @Override
124   public String[] getValidLevels() {
125     return new String[] {"OFF", "FATAL", "ERROR", "WARN", "INFO", "DEBUG", "TRACE", "ALL"};
126   }
127 
128 }