现象
跑了个任务,按道理来说应该会在daemon的主日志里打一大堆错误信息,结果vi打开,日志里面什么内容的没有。
用tail -f看主日志,然后跑任务,发现打出的内容如下:
{code}
tail: daemon.log: file truncated
....
2011-11-08 19:17:58,749 [] ERROR daemon.JobMain - Exception:
com.alibaba.dubbo.rpc.RpcException: No provider available for service com.alibaba.china.credit.group.core.service.GroupMemberInfoQueryService on consumer 10.20.172.25 use dubbo version 2.0.5, Please check whether the service do exist or version is right firstly, and check the provider has started.
at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:51)
at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:168)
at com.alibaba.dubbo.rpc.proxy.filter.MockFilter.invoke(MockFilter.java:86)
at com.alibaba.dubbo.rpc.filter.FilterChainBuilder$1.invoke(FilterChainBuilder.java:61)
at com.alibaba.dubbo.rpc.proxy.filter.LocalFilter.invoke(LocalFilter.java:92)
at com.alibaba.dubbo.rpc.filter.FilterChainBuilder$1.invoke(FilterChainBuilder.java:61)
at com.alibaba.dubbo.rpc.proxy.support.InvokerHandler.invoke(InvokerHandler.java:44)
at com.alibaba.dubbo.common.bytecode.proxy17.listMemberIdsByParam(proxy17.java)
at com.alibaba.china.levit.daemon.guarantee.service.impl.CheckGroupMemberMoneyServiceImpl.processCheck(CheckGroupMemberMoneyServiceImpl.java:70)
at com.alibaba.china.levit.daemon.guarantee.AutoCheckGroupMemberMoneyJob.execute(AutoCheckGroupMemberMoneyJob.java:27)
at com.alibaba.china.levit.daemon.JobMain.main(JobMain.java:69)
tail: daemon.log: file truncated
{code}
因为最后文件被truncated,所以日志文件里面什么内容都木有
问题排查
首先怀疑是appender配置的有点问题,查看应用的log4j配置,在非生产环境的append设置的是false,这样可以解释上面日志中头部的file truncated是因为任务启动的时候初始化弄掉的,不过不能解释最后的那一个。
{code}
<appender name="PROJECT" class="com.alibaba.common.logging.spi.log4j.DailyRollingFileAppender">
<param name="file" value="${levit_loggingRoot}/daemon/sys/daemon/daemon.log"/> #if($levit_production == "true") <param name="append"
value="true"/> #else <param name="append" value="false"/> #end <param name="encoding" value="GBK"/>
<param name="threshold" value="info"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{requestURIWithQueryString}] %-5p %c{2} - %m%n"/>
</layout>
</appender>
{code}
查看任务启动脚本,发现在任务启动后会执行一个spy.sh的脚本,用来监控任务运行的相关信息,脚本部分内容如下:
{code}
...
$JAVA_LOG com.alibaba.china.credit.common.daemon.task.DaemonLogger "start" "$hostIp" "$taskId" "$startTimeMillis" "$taskName" "$hostName" "$shCommand" "$operator"
while true;do
findProcess=`ps -ef|awk '{print $2}'|grep $taskId|grep -v "grep"`
if [ "x$findProcess" = "x" ];then
echo "process [$hostIp,$taskId,$taskName,$startTimeMillis] is not exist!so , I can die!!!"
$JAVA_LOG com.alibaba.china.credit.common.daemon.task.DaemonLogger "end" "$hostIp" "$taskId" "$startTimeMillis"
exit
else
sleep 10s
fi
done
{code}
从代码中可以看出,会通过命令行的方式启动了两个jvm。
运行类的其中一个基类DaoSupport用到了log4j相关功能。
因为没有显式的指定log4j目录,所以按照默认路径查找,找到了配置给daemon的log4j文件。
因为PROJECT appender的appender=false,所以运行新的jvm会导致文件的truncate,所以出现上述情况。
解决方案
1. 在启动脚本中加入-Dlog4j.configuration= ,执行自定义的其他的log4j配置文件
2. 干掉DaemonLogger这个东东