4

我通过 WSO2 产品使用 log4j.properties。我需要实现一个附加程序来使用 SMTPAppender 并使用 gmail smtp 服务器发送电子邮件通知。因此,当我配置 log4j 并启动 ESB WSO2 服务器时,管理控制台打印:log4j:ERROR Could not instantiate class [com.notification.GmailSMTPAppender].

我的实现是:

package com.notification;

public class GmailSMTPAppender extends SMTPAppender {

    protected Session session;

    public GmailSMTPAppender() {
            super();
    }

    /**
     * Create mail session.
     *
     * @return mail session, may not be null.
     */
    protected Session createSession() {
            Properties props = new Properties();
            props.put("mail.smtps.host", getSMTPHost());
            props.put("mail.smtps.auth", "true");

            Authenticator auth = null;
            if (getSMTPPassword() != null && getSMTPUsername() != null) {
                    auth = new Authenticator() {
                            protected PasswordAuthentication getPasswordAuthentication() {
                                    return new PasswordAuthentication(getSMTPUsername(),
                                                    getSMTPPassword());
                            }
                    };
            }
            session = Session.getInstance(props, auth);
            if (getSMTPProtocol() != null) {
                    session.setProtocolForAddress("rfc822", getSMTPProtocol());
            }
            if (getSMTPDebug()) {
                    session.setDebug(getSMTPDebug());
            }
            return session;
    }

    /**
     * Send the contents of the cyclic buffer as an e-mail message.
     */
    protected void sendBuffer() {
            try {
                    MimeBodyPart part = new MimeBodyPart();

                    StringBuffer sbuf = new StringBuffer();
                    String t = layout.getHeader();
                    if (t != null)
                            sbuf.append(t);
                    int len = cb.length();
                    for (int i = 0; i < len; i++) {
                            LoggingEvent event = cb.get();
                            sbuf.append(layout.format(event));
                            if (layout.ignoresThrowable()) {
                                    String[] s = event.getThrowableStrRep();
                                    if (s != null) {
                                            for (int j = 0; j < s.length; j++) {
                                                    sbuf.append(s[j]);
                                                    sbuf.append(Layout.LINE_SEP);
                                            }
                                    }
                            }
                    }
                    t = layout.getFooter();
                    if (t != null)
                            sbuf.append(t);
                    part.setContent(sbuf.toString(), layout.getContentType());

                    Multipart mp = new MimeMultipart();
                    mp.addBodyPart(part);
                    msg.setContent(mp);

                    msg.setSentDate(new Date());
                    send(msg);
            } catch (Exception e) {
                    LogLog.error("Error occured while sending e-mail notification.", e);
            }
    }

    /**
     * Pulled email send stuff i.e. Transport.send()/Transport.sendMessage(). So
     * that on required this logic can be enhanced.
     *
     * @param msg
     *            Email Message
     * @throws MessagingException
     */
    protected void send(Message msg) throws MessagingException {
            SMTPTransport t = (SMTPTransport) session.getTransport("smtps");
            try {
                    t.connect(getSMTPHost(), getSMTPUsername(), getSMTPPassword());
                    t.sendMessage(msg, msg.getAllRecipients());
            } finally {
                    System.out.println("Response: " + t.getLastServerResponse());
                    t.close();
            }
    }

}

如何在我的 log4j.properties 配置上实例化这个 appender?

4

1 回答 1

1

您是否需要以编程方式添加 Appender?检查以下帖子

于 2013-06-25T17:07:22.700 回答