開発およびテスト環境でのタスク・ログの損失の問題
げんしょう
ミッションを逃して、道理で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の構成に問題があるのではないかと疑って、アプリケーションのlog 4 jの構成を見て、非生産環境のappendでfalseを設定して、このように上のログの頭のfile truncatedがタスクの起動時に初期化したためだと説明することができますが、最後の1つは説明できません.{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}
コードから、2つのjvmがコマンドラインで起動されることがわかります.
実行クラスの1つであるベースクラスDaoSupportはlog 4 j関連機能を用いている.
明示的にlog 4 jディレクトリが指定されていないため、デフォルトのパスで検索するとdaemonに構成されたlog 4 jファイルが見つかりました.
PROJECT appenderのappender=falseのため、新しいjvmを実行するとファイルのtruncateになるため、このような状況が発生します.
ソリューション
1.起動スクリプトに-Dlog 4 jを加える.configuration=,カスタムの他のlog 4 jプロファイルを実行する
2.DaemonLoggerというものをやめて
{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}
まずappenderの構成に問題があるのではないかと疑って、アプリケーションのlog 4 jの構成を見て、非生産環境のappendでfalseを設定して、このように上のログの頭のfile truncatedがタスクの起動時に初期化したためだと説明することができますが、最後の1つは説明できません.
{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}
コードから、2つのjvmがコマンドラインで起動されることがわかります.
実行クラスの1つであるベースクラスDaoSupportはlog 4 j関連機能を用いている.
明示的にlog 4 jディレクトリが指定されていないため、デフォルトのパスで検索するとdaemonに構成されたlog 4 jファイルが見つかりました.
PROJECT appenderのappender=falseのため、新しいjvmを実行するとファイルのtruncateになるため、このような状況が発生します.