多协议、性能稳定、丰富API的流媒体服务器软件
如何在自定义模块中将log只输出在自己的log文件中?
在开发Wowza的自定义模块中,为了调试方便,我们会在代码中打印一些Log信息,用于判断程序是否在按照预期运行。用Log4j记录日志虽然很简单,但是我们依然要解决2个问题:

1、自己打印的log信息输出在自己定义的Log文件中,比如将日志输出在[Wowza-Install-Dir]/logs/myCustomerInfo.debug文件中,在这个文件中只有自己自定义模块打印的日志,而不会出现任何Wowza软件本身的日志。 你肯定不希望在大量Wowza日志中查找你的代码输出的日志。

2、在Wowza自己的日志文件中不要出现自定义模块中打印的日志,这个很重要,因为当你的Wowza运行有问题,需要寻求帮助时,一个干净的Wowza日志对问题定位非常重要。 自己的日志不要污染Wowza软件本身的日志,这个好处不用多解释,大家都明白。


解决办法:

其实就是简单的Log4j的配置问题,如下:

1、Wowza Streaming Engine 的Log4j配置文件位于[Wowza-Install-Dir]/conf/log4j.properties,先找到这个文件。

2、用文本编辑器打开这个上面的配置文件,首先找到关于serverAccess的Appender的配置(不清楚Appender概念的,先补课Log4j),在这个Appender的配置中,增加一行:
log4j.appender.serverAccess.Threshold=INFO
它的意思就是只记录INFO及其以上级别的日志。

3、添加一个新的Appender, 如下:
# my customer appender
log4j.appender.customerdebug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.customerdebug.encoding=UTF-8
log4j.appender.customerdebug.DatePattern='.'yyyy-MM-dd
log4j.appender.customerdebug.File=${com.wowza.wms.ConfigHome}/logs/mycustomer_debug.log
log4j.appender.customerdebug.layout=com.wowza.wms.logging.ECLFPatternLayout
log4j.appender.customerdebug.layout.Fields=x-severity,x-category,x-event;date,time,c-client-id,c-ip,c-port,cs-bytes,sc-bytes,x-duration,x-sname,x-stream-id,x-spos,sc-stream-bytes,cs-stream-bytes,x-file-size,x-file-length,x-ctx,x-comment
log4j.appender.customerdebug.layout.OutputHeader=true
log4j.appender.customerdebug.layout.QuoteFields=false
log4j.appender.customerdebug.layout.Delimeter=tab
      
在上面的Appender名字叫做customerdebug,日志文件位于Wowza安装目录/logs/mycustomer_debug.log, 你可以根据你的需求调整。

4、为你的Wowza自定义模块添加一个专属的logger,例如:
log4j.logger.com.abc.modules=debug, customerdebug

在上面的例子中,假设你的自定义模块的类包名为com.abc.modules(注:logger是有继承关系的,一般你定义到类包这一层就可以,当然你也可以定义到Class这一层)。
其中"="号后面的"debug"定义了这个logger的级别,注意它比前面第2步设置的Threshold=INFO级别要低,只有这样,这个模块输出的log才不会进入serverAccess的日志文件中。

5、在你的自定义模块代码中获取自定义模块的logger实例,代码很简单,如下:
WMSLogger customLogger = WMSLoggerFactory.getInstance().getLoggerObj(this.getClass().getName());
	


6、在你的自定义模块代码中打印日志:
customLogger.debug("This is debug log from my customer module.....");
		

注意,这个地方只能使用debug方法,不要使用info(),warn(),error()等,因为前面第2步已经将serverAccess的appender设置为Threshold=INFO,即打印了INFO及以上级别的日志,而root logger(是所有logger的顶级)会将日志输出到这个Appender,自然也就会 包括自定义模块中的日志,而这不符合我们的需求。而只能使用debug()方法,也就是这篇文章介绍的这个解决方案的缺点,不过一般自定义模块都不会太复杂,都是很简单的代码,因此只用debug()也没啥大问题。