Most of the small projects doesn't have a dedicated person to monitor log file all the times, and its handy to send these errors as email to an email list.
Pros
public class CustomLogger extends Logger {
public CustomLogger(String clazz) {
super(clazz);
}
@Override
public void error(Object message) {
Runnable runnable = new LoggerRunnable(this, message, null);
LogExecutor.getInstance().execute(runnable);
}
@Override
public void error(Object message, Throwable throwable) {
Runnable runnable = new LoggerRunnable(this, message, throwable);
LogExecutor.getInstance().execute(runnable);
}
public static Logger getLogger(Class clazz) {
return new CustomLogger(clazz.getSimpleName());
}
}
class LogExecutor {
private static LogExecutor executor = new LogExecutor();
private LogExecutor() {
}
private ExecutorService service = Executors.newFixedThreadPool(5);
public static LogExecutor getInstance() {
return executor;
}
public void execute(Runnable runnable) {
service.execute(runnable);
}
}
class LoggerRunnable implements Runnable {
private Logger logger;
private Object message;
private Throwable throwable;
public LoggerRunnable(Logger logger, Object message, Throwable throwable) {
this.logger = logger;
this.message = message;
this.throwable = throwable;
}
@Override
public void run() {
logger.error(message, throwable);
}
}
Sample Usage
Pros
- Never miss an error.
- Delete Emails which you want to ignore because of invalid inputs or connectivity issues etc.
- Proactively identify bugs and fix them.
- Email list is handy i.e. multiple person can receive emails.
- If you have different modules in your project and different teams work on them, adding a Labels to your log can by handy since most of the Email Servers can Label emails and redirect them to different folders.
Cons
- Sending email from code takes few seconds, workaround is the create Logger wrapper which logs in a separate thread.
log4j.properties
log4j.rootLogger=ERROR, gmail
log4j.appender.gmail=org.apache.log4j.net.SMTPAppender
log4j.appender.gmail.SMTPProtocol=smtps
log4j.appender.gmail.SMTPPassword=password
log4j.appender.gmail.SMTPHost=smtp.gmail.com
log4j.appender.gmail.SMTPPort=465
log4j.appender.gmail.Subject=Some subject line
log4j.appender.gmail.layout=org.apache.log4j.PatternLayout
log4j.appender.gmail.layout.ConversionPattern=%d{MM/dd/yyyy HH:mm:ss} [%M] %-5p %C - %m%n
log4j.appender.gmail.BufferSize=10
Required Jar files
Log4j download from here
Java Mail download from here
Activation download from here
Sample Code
public class Log4jGmailDemo {
public static void main(String[] args) {
try {
int z = 4 / 0;
} catch (RuntimeException re) {
logger.error("Module-1", re);
}
}
static Logger logger = Logger.getLogger(Log4jGmailDemo.class);
}
This is only if you are interested using Threads
public class CustomLogger extends Logger {
public CustomLogger(String clazz) {
super(clazz);
}
@Override
public void error(Object message) {
Runnable runnable = new LoggerRunnable(this, message, null);
LogExecutor.getInstance().execute(runnable);
}
@Override
public void error(Object message, Throwable throwable) {
Runnable runnable = new LoggerRunnable(this, message, throwable);
LogExecutor.getInstance().execute(runnable);
}
public static Logger getLogger(Class clazz) {
return new CustomLogger(clazz.getSimpleName());
}
}
class LogExecutor {
private static LogExecutor executor = new LogExecutor();
private LogExecutor() {
}
private ExecutorService service = Executors.newFixedThreadPool(5);
public static LogExecutor getInstance() {
return executor;
}
public void execute(Runnable runnable) {
service.execute(runnable);
}
}
class LoggerRunnable implements Runnable {
private Logger logger;
private Object message;
private Throwable throwable;
public LoggerRunnable(Logger logger, Object message, Throwable throwable) {
this.logger = logger;
this.message = message;
this.throwable = throwable;
}
@Override
public void run() {
logger.error(message, throwable);
}
}
Sample Usage
public class Log4jGmailDemo {
public static void main(String[] args) {
try {
int z = 4 / 0;
} catch (RuntimeException re) {
logger.error("Module-1", re);
}
}
static Logger logger = CustomLogger.getLogger(Log4jGmailDemo.class);
}
PS: you can use AsyncAppender to make non-blocking emailing of logs instead of writing your own.
No comments:
Post a Comment