Storm实现日志自定义输出
一、 配置work.xml
在storm安装目录下的log4j2目录下的work.xml文件进行自定义文件配置:
1. 在appenders标签下增加RollingFile
<RollingFilename="ALERT" fileName="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.alert.log" filePattern="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.alert.log.%i.gz"> <PatternLayout> <pattern>${patternDetail}</pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicysize="500 MB"/> <!-- Or every 100 MB --> </Policies> <DefaultRolloverStrategymax="30"/> </RollingFile> <RollingFilename="PERFORM" fileName="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.performance.log" filePattern="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.performance.log.%i.gz"> <PatternLayout> <pattern>${patternDetail}</pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="500MB"/> <!-- Or every 100 MB --> </Policies> <DefaultRolloverStrategymax="30"/> </RollingFile> <RollingFile name="ERROR" fileName="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.error.log" filePattern="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.error.log.%i.gz"> <PatternLayout> <pattern>${patternDetail}</pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicysize="500 MB"/> <!-- Or every 100 MB --> </Policies> <DefaultRolloverStrategymax="30"/> </RollingFile> <RollingFile name="INFO" fileName="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.log" filePattern="${sys:workers.artifacts}/${sys:storm.id}/${sys:worker.port}/xxx.log.%i.gz"> <PatternLayout> <pattern>${patternDetail}</pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicysize="500 MB"/> <!-- Or every 100 MB --> </Policies> <DefaultRolloverStrategymax="30"/> </RollingFile>
2. 在Loggers标签下新增Logger标签
</Logger> <Logger name="com.simon.storm.AlertLogger"level="WARN" additivity="false"> <appender-refref="ALERT"/> </Logger> <Logger name="com.simon.storm.PerformanceLogger"level="INFO" additivity="false"> <appender-refref="PERFORM"/> </Logger> <Logger name="com.simon.storm.InfoLogger"level="INFO" additivity="false"> <appender-refref="INFO"/> </Logger> <Logger name="com.simon.storm.ErrorLogger"level="ERROR" additivity="false"> <appender-refref="ERROR"/> </Logger>
二、 编写日志输出扩展类
1. 日志顶级接口AbstractLogger
public class AbstractLogger { private final Logger logger; private final String loggerName; public AbstractLogger(Class<?> clazz){ this.logger = Logger.getLogger(clazz); this.loggerName = clazz.getName(); } public AbstractLogger(String className){ // PropertyConfigurator.configure("log4j.properties"); this.logger = Logger.getLogger(className); this.loggerName = className; } public Logger getLogger() { return this.logger; } /** * Getter method for property <tt>loggerName</tt>. * * @return property value ofloggerName */ public String getLoggerName() { return this.loggerName; } /** * debug * * @param clazz * @param msgFormat * @param args */ public void debug(Class<?> clazz, StringmsgFormat, Object... args) { this.getLogger().debug(String.format("[" +clazz.getSimpleName() + "] " + msgFormat, args)); } /** * debug * * @param clazz * @param msg */ public void debug(Class<?> clazz, String msg) { this.getLogger().debug("[" +clazz.getSimpleName() + "] " + msg); } /** * info * * @param clazz * @param msgFormat * @param args */ public void info(Class<?> clazz, StringmsgFormat, Object... args) { this.getLogger().info(String.format("[" +clazz.getSimpleName() + "] " + msgFormat, args)); } /** * info * * @param clazz * @param msg */ public void info(Class<?> clazz, String msg) { this.getLogger().info("[" +clazz.getSimpleName() + "] " + msg); } /** * error * * @param clazz * @param t * @param msgFormat * @param args */ public void error(Class<?> clazz, Throwable t,String msgFormat, Object... args) { this.getLogger().error(String.format("[" +clazz.getSimpleName() + "] " + msgFormat, args), t); } /** * error * * @param clazz * @param msg */ public void error(Class<?> clazz, String msg) { this.getLogger().error("[" +clazz.getSimpleName() + "] " + msg); } /** * error * * @param clazz * @param msg * @param t */ public void error(Class<?> clazz, String msg,Throwable t) { this.getLogger().error("[" +clazz.getSimpleName() + "] " + msg, t); } /** * error * * @param clazz * @param msgFormat * @param args */ public void error(Class<?> clazz, StringmsgFormat, Object... args) { this.getLogger().error(String.format("[" +clazz.getSimpleName() + "] " + msgFormat, args)); } /** * warn * * @param clazz * @param t * @param msgFormat * @param args */ public void warn(Class<?> clazz, Throwable t,String msgFormat, Object... args) { this.getLogger().warn(String.format("[" +clazz.getSimpleName() + "] " + msgFormat, args), t); } /** * warn * * @param clazz * @param msg */ public void warn(Class<?> clazz, String msg) { this.getLogger().warn("[" +clazz.getSimpleName() + "] " + msg); } /** * warn * * @param clazz * @param msg * @param t */ public void warn(Class<?> clazz, String msg,Throwable t) { this.getLogger().warn("[" +clazz.getSimpleName() + "] " + msg, t); } /** * warn * * @param clazz * @param msgFormat * @param args */ public void warn(Class<?> clazz, StringmsgFormat, Object... args) { this.getLogger().warn(String.format("[" +clazz.getSimpleName() + "] " + msgFormat, args)); } /** * debug * * @param msgFormat * @param args */ public void debug(String msgFormat, Object... args) { this.getLogger().debug(String.format(msgFormat,args)); } /** * debug * * @param msg */ public void debug(String msg) { this.getLogger().debug(msg); } /** * info * * @param msgFormat * @param args */ public void info(String msgFormat, Object... args) { this.getLogger().info(String.format(msgFormat,args)); } /** * info * * @param msg */ public void info(String msg) { this.getLogger().info(msg); } /** * error * * @param t * @param msgFormat * @param args */ public void error(Throwable t, String msgFormat,Object... args) { this.getLogger().error(String.format(msgFormat,args), t); } /** * error * * @param msg */ public void error(String msg) { this.getLogger().error(msg); } /** * error * * @param msg * @param t */ public void error(String msg, Throwable t) { this.getLogger().error(msg, t); } /** * error * * @param msgFormat * @param args */ public void error(String msgFormat, Object... args) { this.getLogger().error(String.format(msgFormat,args)); } /** * warn * * @param t * @param msgFormat * @param args */ public void warn(Throwable t, String msgFormat, Object...args) { this.getLogger().warn(String.format(msgFormat,args), t); } /** * warn * * @param msg */ public void warn(String msg) { this.getLogger().warn(msg); } /** * warn * * @param msg * @param t */ public void warn(String msg, Throwable t) { this.getLogger().warn(msg, t); } /** * warn * * @param msgFormat * @param args */ public void warn(String msgFormat, Object... args) { this.getLogger().warn(String.format(msgFormat,args)); } /** * @return boolean */ public boolean isDebugEnabled() { return this.getLogger().isDebugEnabled(); } }
2. 分离输出类(warn、info、error、performance等)
以performance性能日志为例:
public class PerformanceLogger extends AbstractLogger { private static final PerformanceLogger INSTANCE = new PerformanceLogger(); public static PerformanceLogger getInstance() { return INSTANCE; } private PerformanceLogger() { super(PerformanceLogger.class); } }
3. 具体操作类Log.java
public class Logs { private static ErrorLogger errorLogger = ErrorLogger.getInstance(); private static AlertLogger alertLogger = AlertLogger.getInstance(); private static PerformanceLogger performanceLogger = PerformanceLogger.getInstance(); private static InfoLogger infoLogger = InfoLogger.getInstance(); public static void alert(String... args){ alertLogger.warn(StringUtils.array2String(args)); } public static void performance(String... args){ performanceLogger.info(StringUtils.array2String(args)); } public static void error(String... args){ errorLogger.error(StringUtils.array2String(args)); } public static void info(String... args){ infoLogger.info(StringUtils.array2String(args)); } }
三、 使用
以输出info为例:
输出info:
Log.info(“your information”);
四、 将log模块打包上传到storm安装目录下的extli目录下,重启storm,即可。