当前您所在的位置:首页>新闻中心>新品发布
新品发布
行业动态
营销活动

Wowza技术:如何在自定义模块中将log只输出在自己的log文件中?

发布时间:2021/02/17 浏览量:2715

在开发Wowza的自定义模块中,为了调试方便,我们会在代码中打印一些Log信息,用于判断程序是否在按照预期运行。用Log4j记录日志虽然很简单,但是我们依然要解决2个问题: 


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

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

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

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

2、用文本编辑器打开这个上面的配置文件,首先找到关于serverAccessAppender的配置(不清楚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 logfrom my customer module.....");


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

 

Wowza Streaming Engine 4是业界功能强大、API接口丰富的流媒体Server产品,采用它作为流媒体服务器产品的案例很多,直播、在线教育、IPTV都有它的用武之地。

北京哲想软件有限公司